У вас есть конкретная причина желать сделать это в VBA?
Я решил похожую проблему несколько месяцев назад, используя формулы; Я адаптировал это решение к вашей проблеме.
Но сначала позвольте мне убедиться, что я понимаю вашу проблему.
Насколько я понимаю, у вас есть лист, который выглядит так:
A B C D E F
1 Date Start End User Color Overnight
2 5/28/2015 15:00 21:00 Fred Green
3 6/1/2015 16:25 1:00 Henry Red 1
4 6/4/2015 9:00 13:00 Mary Blue
где каждая строка представляет событие с датой, временем начала, временем окончания и другими данными. Некоторые события происходят в одночасье (т.е. они начинаются до полуночи и заканчиваются после полуночи).
Вы пометили эти события как 1 в столбце F (хотя нет необходимости делать это вручную; вы можете просто установить F2 =B2>C2 и перетащить вниз).
Ни одно мероприятие не длится более 24 часов, поэтому невозможно, чтобы мероприятие начиналось в 10:00 в понедельник и заканчивалось в 11:00 во вторник (или, если есть, у вас есть какой-то способ идентифицировать те события, которых у вас нет описано, и вы правильно установили столбец F ).
В любом случае, ни одно событие не будет длиться более двух дней (например, у вас никогда не будет мероприятия, начинающегося в 23:00 в понедельник и продолжающегося до 1:00 в среду).
Вы хотите разделить каждое многодневное (то есть, ночное) событие на две строки: одну в первый день, со времени начала до полуночи (или 23:59), а другую во второй день, с полуночи до времени окончания. ,
Вы хотите, чтобы все остальные данные, связанные с событием, были реплицированы в обе строки. Итак, для приведенных выше данных, вы хотите
A B C D E
1 Date Start End User Color
2 5/28/2015 15:00 21:00 Fred Green
3 6/1/2015 16:25 23:59 Henry Red
4 6/2/2015 0:00 1:00 Henry Red
5 6/4/2015 9:00 13:00 Mary Blue
в следствии.
Мое решение:
Я предполагаю, что вы используете не более 23 столбцов, поэтому столбцы X , Y и Z доступны для использования в качестве «вспомогательных столбцов».
- Создайте новый лист.
Предположим, что существующим листом является
Sheet1 а новым - Sheet2 .
Следующие шаги будут копировать данные из Sheet1 в Sheet2 , разбивая строки.
- Скопировать заголовки столбцов из
Sheet1 строки 1, к Sheet2 строка 1.
- Введите
=INDEX(Sheet1!A:A, $X2)+$Y2 в Sheet2!A2 .
- Enter
=IF($Y2=0, INDEX(Sheet1!B:B, $X2), 0) в Sheet2!B2 .
- Введите
=IF(AND($Y2=0,$Z2>0), TIME(23,59,59), INDEX(Sheet1!C:C, $X2)) в Sheet2!C2 .
- Введите
=INDEX(Sheet1!D:D, $X2) в Sheet2!D2 и перетащите / заполните вправо, чтобы покрыть все ваши данные (т. Е. В столбце E , в моем примере).
- Скопируйте
Sheet1:A2:E2 и вставьте форматы (и ширину столбцов, если необходимо) в Sheet2:A2:E2 .
- Введите
2 в Sheet2!X2 .
Это обозначает строку на Sheet1 которой эта строка (на Sheet2) будет извлекать данные.
- Введите
0 в Sheet2!Y2 .
- Введите
=INDEX(Sheet1!F:F, $X2) в Sheet2!Z2 .
Это создает локальную копию индикатора «овернайт».
- Выберите
Sheet2!A2:Z2 и перетащите / заполните вниз в строку 3.
- Изменить
Sheet2!X3 до =IF(AND(Y2=0,Z2>0), X2, X2+1) .
- Изменить
Sheet2!Y3 до =IF(AND(Y2=0,Z2>0), Y2+1, 0) .
- Выберите
Sheet2!A3:Z3 и перетащите / заполните так далеко, как вам нужно, чтобы получить все свои данные.
Это должно выглядеть примерно так:
A B C D E X Y Z
1 Date Start End User Color
2 5/28/2015 15:00 21:00 Fred Green 2 0 0
3 6/1/2015 16:25 23:59 Henry Red 3 0 1
4 6/2/2015 0:00 1:00 Henry Red 3 1 1
5 6/4/2015 9:00 13:00 Mary Blue 4 0 0
Заметки:
- Как указано в инструкции,
Sheet2!Xn указывает строку на Sheet1 которой строка n (на Sheet2) будет извлекать данные.
Sheet2!Yn - это однозначное число в Sheet2!Xn ; то есть в пределах строки Sheet1 ; то есть в рамках события.
Для ночного мероприятия Y будет 0 для сегмента до полуночи и 1 для сегмента после полуночи.
Например, поскольку строки 3 и 4 на Sheet2 данные из строки 3 Sheet1 , мы имеем X3 = X4 = 3 и Y3 , Y4 = 0, 1.
Чтобы сделать это постоянным, вы можете копировать и вставлять значения, а также удалять столбцы X , Y и Z