У вас есть конкретная причина желать сделать это в 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