2015-07-15 3 views
0

Я пробовал поиск и поиск в поисковых системах, но безрезультатно. Прошу прощения, если есть решения, которые я пропустил.Excel VBA Macro для управления строками на основе критериев

(Моя база данных Excel) - Перед запуском макроса

Start Date Start Time Number Finish Date Finish Time 
14-Jul-15 22:00 1 16-Jul-15 06:00 
15-Jul-15 22:00 1 17-Jul-15 06:00 
15-Jul-15 22:00 1 16-Jul-15 06:00 

(Моя база данных Excel) - После запуска макроса

Start Date Start Time Number Finish Date Finish Time 
14-Jul-15 22:00 1 16-Jul-15 06:00 
14-Jul-15 22:00 1 15-Jul-15 06:00 
15-Jul-15 22:00 1 16-Jul-15 06:00 
15-Jul-15 22:00 1 17-Jul-15 06:00 
15-Jul-15 22:00 1 16-Jul-15 06:00 
16-Jul-15 22:00 1 17-Jul-15 06:00 
15-Jul-15 22:00 1 16-Jul-15 06:00 

Что я хочу Macro сделать это, Проверьте, если разница «Дата начала» и «Дата окончания» больше 2. Если разница между ними равна 1 или 0, она переходит к следующей строке данных для проверки. Однако, если его больше 0 или 1, он добавляет еще одну строку под эту конкретную строку. Затем он копирует аналогичный контент, но затем меняет дату.

Например,

14-Jul-15 22:00 1 16-Jul-15 06:00 

После Macro, это добавляет под исходной строке.

14-Jul-15 22:00 1 15-Jul-15 06:00 
15-Jul-15 22:00 1 16-Jul-15 06:00 

Извините, если мой вопрос неясен, пожалуйста, помогите мне в создании этого макроса.

+0

Что такое посередине и какой код вы можете показать, демонстрируя все усилия, чтобы попробовать это самостоятельно? [SO] (http://stackoverflow.com/tour) не является бесплатной службой написания кода. – Jeeped

+0

Здравствуйте, извините, что я не задаю детали. http://pastebin.com/hSA3AavG Для моих кодов я не уверен, как я могу перебирать все строки и вместо жесткого кодирования позиции. – Frashe

ответ

0

При вставке строк в цикле всегда начинайте снизу и работайте вверх или вы рискуете потерять последовательность шагов с вставками новых строк. Поднявшись вверх, вновь вставленные строки принимают номера строк, которые уже не охвачены циклом.

Sub StackOverflow() 
    Dim rw As Long, i As Long 
    With ActiveSheet 
     For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 
      If (CDate(.Cells(rw, 4).Value2) - CDate(.Cells(rw, 1).Value2)) > 1 Then 
       For i = 1 To (CDate(.Cells(rw, 4).Value2) - CDate(.Cells(rw, 1).Value2)) 
        With .Cells(rw, 1).Resize(1, 5) 
         .Copy 
         .Insert Shift:=xlDown ', copyorigin:=.Cells 
        End With 
        .Cells(rw + 1, 4) = .Cells(rw + 1, 4).Value2 - (i - 1) 
        .Cells(rw + 1, 1) = .Cells(rw + 1, 4).Value2 - 1 
       Next i 
      End If 
     Next rw 
    End With 
    Application.CutCopyMode = False 
End Sub 

Если данные выборки точно представлены фактические данные, то выше, должны быстро расширить свои диапазоны дат для одного разделения дня для каждой строки.

+0

Здравствуйте, Jeeped, Прежде всего, большое вам спасибо, что нашли время ответить мне. Я искренне извиняюсь за правила, которые я нарушил (все еще новичок на этом сайте, не привык к нему!) Я проверил коды, которые вы предоставили, и они работают. Однако, последний запрос! Когда я запустил макрос, он удалил исходную строку. Например, если theres от 1 до 3. Он добавил в 1 к 2, от 2 до 3 (но оригинал от 1 до 3 исчез. Любая идея по этому поводу?) Еще раз большое вам спасибо! :) – Frashe

+0

Если у вас была строка с 14 июля по 17 июля, она создает новую строку с 16 июля по 17 июля, еще одну новую строку с 15 июля по 16 июля и изменяет исходную строку на 14 июля до 15 -Jul. Разве это не то, что демонстрируют ваши последние примеры? – Jeeped

+0

Ах. Думаю, я, возможно, не сказал ясно. «После макроса он добавляется под исходной строкой». - мое первоначальное заявление в моем последнем примере. Я должен был бы уточнить, так как, как видно из моего последнего примера, я должен закончить с 14 июля 16 июля, 14 июля 15 июля, 15 июля 16 июля. В любом случае, вы можете изменить коды, чтобы это закончилось так? Еще раз, мои извинения сэр. – Frashe

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