#vba #time
#vba #время
Вопрос:
Приветствую, я хотел бы использовать VBA для создания 30-минутного временного диапазона (столбец B) на листе «Входящие Fid». Например, 1015 станет 0945-1045, 0015 станет 2345-0045. Я могу создать это с помощью строки формул, но мне нужно добавить не менее пяти столбцов. Первый добавленный столбец принимает текст и преобразует его в формат времени
=TIMEVALUE(LEFT(D2,2)amp;":"amp;MID(D2,3,2))
. Второй добавленный столбец занимает 30 минут от нового столбца, =MOD(H2-0.5/24,1)
. Третий добавленный столбец добавляет 30 минут к первому добавленному столбцу, =(H2 0.5/24)
. Четвертый столбец объединяет 2-й и 3-й столбцы и преобразует их обратно в текст, =TEXT(I2,"hh:mm")amp;"-"amp;TEXT(J2,"hh:mm")
. В последнем столбце двоеточие отбрасывается =SUBSTITUTE(K2,":","")
. Можем ли мы преобразовать все это в МАКРОС, сохранив конечный результат в столбце B. Я понимаю, что формат не идеален, но мы должны использовать военное время, когда начальные нули не будут отбрасываться и не будут иметь двоеточия. Наконец, я бы хотел, чтобы это применялось только к столбцу B, где рассматриваются только ячейки с числами.
Комментарии:
1. не могли бы вы показать скриншот того, чего вы пытаетесь достичь?
2. Спасибо, я добавил изображение. Надеюсь, вы сможете увидеть процесс, описанный в моем первоначальном вопросе. Было бы неплохо достичь всего этого только в макросе с результатом в столбце B. Мне нужно, чтобы он игнорировал пустые ячейки и где ETA находится в том же столбце.
3. Я работаю над этим. Я решаю краевой случай 00:15.
4. Большое вам спасибо, я почти получил все остальное, что вы видите на фотографии. Я просто пытаюсь оптимизировать свой результат. Вы, ребята / девчонки, молодцы!
Ответ №1:
Попробуйте вставить эту функцию в свой редактор vba и использовать ее в качестве формулы в целевой ячейке
Function GET30MINRANGE(strTime As String) As String
Dim strRange, strHour, strMin, lowerBound, upperBound As String
Dim timeVal As Date
strMin = Mid(strTime, 3, 2)
strHour = Left(strTime, 2)
timeVal = Date TimeValue(strHour amp; ":" amp; strMin)
lowerBound = Format(timeVal - TimeSerial(0, 30, 0), "hhnn")
upperBound = Format(timeVal TimeSerial(0, 30, 0), "hhnn")
strRange = lowerBound amp; "-" amp; upperBound
GET30MINRANGE = strRange
End Function
Например,
=GET30MINRANGE(B2)
Комментарии:
1. Спасибо, я всегда путаюсь с макросами, особенно с функциями. Я думаю, что мне нужен вспомогательный оператор раньше, иначе он просто попросит меня запустить макрос. Хотя это выглядит многообещающе. Есть какие-либо мысли по поводу инструкции Sub? Извините за хлопоты.
2. @SheridanWhiteside, я сократил свое объяснение, потому что предполагал, что вы знаете концепции. Функции — это то, что вы используете в своих формулах ячеек; они возвращают или выводят результирующее значение. Вспомогательные операторы запускают задачи, но не выводят значение. У вас должно быть событие запуска, чтобы вызвать вспомогательный модуль, в то время как функции автоматически вычисляют без необходимости запуска. Просто поместите «= GET30MINRANGE (B2)» в ячейку H2 и посмотрите результат. (Просто убедитесь, что приведенный мной код vba скопирован и вставлен в ваш редактор VBA.) Вы можете изменить имя функции на любое, какое захотите, если оно не конфликтует со встроенной функцией
3. Я попробовал вашу формулу, и она работает; фантастическая работа! Я создал макрос для копирования и вставки значений в столбец B. Есть пара вещей, которые мне еще нужно сделать. Разве нет пропусков игнорирования через оператор «if» в начале формулы? Затем я создам макрос и заменю значение #! с ETA, измененным с формулой.
4. Я буду. Я создал макрос, чтобы вернуть ETA обратно в столбец B. Мне просто нужно настроить формулу, чтобы игнорировать пробелы.
5. я внес одну небольшую корректировку в вашу формулу, чтобы игнорировать пробелы, которые я использовал
=IFERROR(GET30MINRANGE(B3),"")
. Спасибо.