Обратите внимание, этот ответ (в дополнение к ответу BigBen) предназначен для объяснения того, почему ваш код не работает должным образом:
Так что же на самом деле происходит со следующим кодом
Dim Time1 As Object
Set Time1 = xlSht.Range("B2")
Time1 = Format(Time1, "hh:nn AM/PM")
.Body = Time1
состоит в том, что он более точно записан точно так же, как…
Dim Time1 As Object
Set Time1 = xlSht.Range("B2") 'now Time1 is a Range object
Time1.Value = Format(Time1, "hh:nn AM/PM")
.Body = Time1.Value
Если вы объявите Dim Time1 As Object
, а затем Set Time1 = xlSht.Range("B2")
, то переменная Time1
будет ссылкой в ячейку B2. Это означает, что теперь запись Time1
на самом деле точно такая же, как запись xlSht.Range("B2")
только короче!
Это означает, что если теперь вы конвертируете значение этой ячейки 0.375
в строка Format(Time1, "hh:nn AM/PM")
, равная 09:00 AM
, затем Time1 = Format(Time1, "hh:nn AM/PM")
записывает эту строку обратно в ячейку B2 (представлена Time1
).
На самом деле это то же самое, что и запись:
xlSht.Range("B2") = Format(Time1, "hh:nn AM/PM")
А теперь происходит то, что происходит, когда Excel начинает думать и угадывать:
Excel видит, что вы пишете эту строку 09:00 AM
, а думает : "Ах, пользователь хочет написать время / дата, поэтому давайте проявим смекалку и преобразуем эту строку в значение даты (чтобы мы могли вычислить ее). " Таким образом, она преобразует ее в число, которое на самом деле 0.375
, и, к сожалению, вы вернулись туда, откуда начали !
Теперь есть 2 способа обойти эту проблему:
Не объявляйте Time1 As Object
, но как String.
Dim Time1 As String
Time1 = xlSht.Range("B2").Value 'no Set!
Таким образом, строка Time1 = Format(Time1, "hh:nn AM/PM")
не записывает ее обратно в ячейку, а только в переменную Time1
.
Или альтернативно убедитесь, что при записав его обратно в ячейку, Excel поймет его как Text
и не будет пытаться снова преобразовать его в время / дату, добавив '
в качестве первого символа (это не будет отображаться в ячейке):
Dim Time1 As Range 'spcifying it as range instead of object is more precise (a range is an object)
Set Time1 = xlSht.Range("B2")
Time1 = "'" & Format(Time1, "hh:nn AM/PM") 'this will write the date as text into the cell
Обратите внимание, что не рекомендуется записывать дату / время в виде текста в ячейку. Вы не можете рассчитывать с этим больше. Поэтому я рекомендую первый вариант.