2016-02-26 2 views
0

Я не уверен, как объяснить этот вопрос, но я постараюсь изо всех сил объяснить логику того, что мне нужно сделать. Надеюсь, любой из блестящих парней на этом сайте мог бы вникать в некоторые идеи :)Сделать excel vba вставить произвольное количество строк данных между строками на основе пользовательских критериев

У меня есть журнал данных, содержащий информацию о разных проектах. Каждая строка содержит информацию о проекте, таком как название проекта, дата создания проекта, дата завершения проекта, расчетная дата завершения проекта и отметка времени, когда была добавлена ​​/ обновлена ​​сметная оценка. Если проект имеет обновленную расчетную дату завершения проекта, это обновление записывается в новую строку. Вот как должны выглядеть данные в Excel.

enter image description here

мне нужно преуспеть, чтобы проверить, если какой-либо день проходит без каких-либо изменений в предполагаемой даты завершения (т.е. проект остается на трассе), то первенствовать создает строки до тех пор, пока не достигнет дня, содержащего обновление. На следующем рисунке показано, как мне нужно Excel, чтобы добавить пользовательские строки на основе начальных строк выше.

enter image description here

Пожалуйста, дайте мне помочь с любыми идеями .. рекомендуется VBA.

+0

Показывайте, что вы пробовали до сих пор, она проходит долгий путь, чтобы сделать его выглядеть, как вы не просто просить других людей, чтобы сделать вашу работу за вас ... Если вы * буквально * не знаю, с чего начать, прочитайте «Do/While» и «Do/While», Для циклов/Next'. –

+0

@DavidZemens спасибо! Я пытался сделать это по формулам Excel, но, похоже, это нелегкое решение ... Я дам ему выстрел на vba ... Кроме того, я не прошу кого-либо выполнять свою работу за меня, но я бросая мой вопрос там, в случае, если кто-то столкнулся с подобной загадкой, и я сделаю все остальное, плюс я не буду изобретать велосипед, если кто-то еще сделал это уже как-то ..... – exlover

+0

Определенно не может быть сделано с потому что они не могут манипулировать листом/строками. –

ответ

0

Я считаю, что это должно выполнить свои цели:

Sub FillCompletionDays() 

Dim LLoop As Long 
Dim LLRow As Long 
Dim DateEnd As Date 
Dim DateNext As Date 
Dim DateNow As Date 

LLoop = Range("A:A").Find(what:="Project name").Row + 1 
LLRow = Range("A:A").Find(what:="*", searchdirection:=xlPrevious).Row 

If LLRow <= LLoop Then Exit Sub 

Do 
    'Only proceed if there is a valid date in column E 
    If Range("E" & LLoop).Value2 <> vbNullString Then 
     DateNow = Range("E" & LLoop).Value2 
     DateEnd = Range("C" & LLoop).Value2 
     'Check if another date is needed 
     If DateEnd > DateNow Then 
      'Check if next row is this project 
      If Range("A" & LLoop + 1).Value2 = Range("A" & LLoop).Value2 Then 
       'Check if a new date is needed 
       DateNext = DateSerial(Year(Range("E" & LLoop + 1).Value2), Month(Range("E" & LLoop + 1).Value2), _ 
       Day(Range("E" & LLoop + 1).Value2)) 
       If DateNext <> DateNow + 1 Then 
        'Insert a row 
        Rows(LLoop + 1).Insert shift:=xlShiftDown 
        Range("A" & LLoop + 1 & ":D" & LLoop + 1).Value2 = Range("A" & LLoop & ":D" & LLoop).Value2 
        Range("E" & LLoop + 1).Value2 = DateNow + 1 
        Range("B" & LLoop + 1 & ": E" & LLoop + 1).NumberFormat = "yyyy-mm-dd" 
        LLRow = LLRow + 1 
       End If 

      Else 
       'Next row is another project; insert a row for this one 
       Rows(LLoop + 1).Insert shift:=xlShiftDown 
       Range("A" & LLoop + 1 & ":D" & LLoop + 1).Value2 = Range("A" & LLoop & ":D" & LLoop).Value2 
       Range("E" & LLoop + 1).Value2 = DateNow + 1 
       Range("B" & LLoop + 1 & ": E" & LLoop + 1).NumberFormat = "yyyy-mm-dd" 
       LLRow = LLRow + 1 
      End If 
     End If 
    End If 
    LLoop = LLoop + 1 
Loop Until LLoop > LLRow 

End Sub 
+0

Спасибо, Ник. Ваш код был полезен! Я обновил ваш код, чтобы соответствовать моим потребностям и как я хотел, чтобы он функционировал! – exlover

0

Вот ответ на мой вопрос после редактирования @Nick Peranzi ответа, чтобы соответствовать моему запросу я не знаю, как помечать/упоминать его, но это его ссылка пользователя https://stackoverflow.com/users/5472502/nick-peranzi

Sub FillCompletionDays() 

Dim LLoop As Long 
Dim LLRow As Long 
Dim DateEnd As Date 
Dim DateNext As Date 
Dim DateNow As Date 

LLoop = Range("A:A").Find(what:="Project name").Row + 1 
LLRow = Range("A:A").Find(what:="*", searchdirection:=xlPrevious).Row 

If LLRow <= LLoop Then Exit Sub 

Do 
'Only proceed if there is a valid date in column E 
If Range("E" & LLoop).Value2 <> vbNullString Then 
    DateNow = DateSerial(Year(Range("E" & LLoop).Value2), Month(Range("E" & LLoop).Value2), _ 
      Day(Range("E" & LLoop).Value2)) 
    DateEnd = DateSerial(Year(Range("D" & LLoop).Value2), Month(Range("D" & LLoop).Value2), _ 
      Day(Range("D" & LLoop).Value2)) 
    'Check if another date is needed 
    If DateEnd > DateNow Then 
     'Check if next row is this project 
     If Range("A" & LLoop + 1).Value2 = Range("A" & LLoop).Value2 Then 
      'Check if a new date is needed 
      DateNext = DateSerial(Year(Range("E" & LLoop + 1).Value2), Month(Range("E" & LLoop + 1).Value2), _ 
      Day(Range("E" & LLoop + 1).Value2)) 
      If DateNext = DateNow Then 
      Else 
      If DateNext <> DateNow + 1 Then 
       'Insert a row 
       Rows(LLoop + 1).Insert shift:=xlShiftDown 
       Range("A" & LLoop + 1 & ":D" & LLoop + 1).Value2 = Range("A" & LLoop & ":D" & LLoop).Value2 
       Range("E" & LLoop + 1).Value2 = DateNow + 1 
       Range("B" & LLoop + 1 & ": E" & LLoop + 1).NumberFormat = "yyyy-mm-dd" 
       LLRow = LLRow + 1 
      End If 
      End If 

     Else 
      'Next row is another project; insert a row for this one 
      Rows(LLoop + 1).Insert shift:=xlShiftDown 
      Range("A" & LLoop + 1 & ":D" & LLoop + 1).Value2 = Range("A" & LLoop & ":D" & LLoop).Value2 
      Range("E" & LLoop + 1).Value2 = DateNow + 1 
      Range("B" & LLoop + 1 & ": E" & LLoop + 1).NumberFormat = "yyyy-mm-dd" 
      LLRow = LLRow + 1 
     End If 
    End If 
End If 
LLoop = LLoop + 1 
Loop Until LLoop > LLRow 


End Sub 
Смежные вопросы