Создание временного диапазона на основе ввода времени

#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),"") . Спасибо.