Формат времени в автоматической электронной почте является «общим», а не чч: nn AM / PM - PullRequest
1 голос
/ 10 марта 2020

У меня есть электронная таблица Excel, в которой перечислены даты в одном столбце, а время - в другом.

Мой код Outlook VBA извлекает даты / время и помещает их в электронное письмо.

В электронной таблице они форматируются как «1:30 PM» (например), используя функцию «Формат ячеек» в Excel.

Если я просто извлекаю значения из электронной таблицы, используя, например,

.Body = xlSht.Range("A2")

Это отображается как 0,375 или другое число в «общем» виде.

Если я сначала отформатирую время, используя этот код,

Dim Time1 As Object
Set Time1 = xlSht.Range("B2")
Time1 = Format(Time1, "hh:nn AM/PM")
'[...]
.Body = Time1

Он все равно будет отображаться в электронном письме как 0.375.

Есть ли другой способ, которым я должен подходить к этому?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Обратите внимание, этот ответ (в дополнение к ответу 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 способа обойти эту проблему:

  1. Не объявляйте Time1 As Object, но как String.

    Dim Time1 As String
    Time1 = xlSht.Range("B2").Value 'no Set!
    

    Таким образом, строка Time1 = Format(Time1, "hh:nn AM/PM") не записывает ее обратно в ячейку, а только в переменную Time1.

  2. Или альтернативно убедитесь, что при записав его обратно в ячейку, 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
    

    Обратите внимание, что не рекомендуется записывать дату / время в виде текста в ячейку. Вы не можете рассчитывать с этим больше. Поэтому я рекомендую первый вариант.

1 голос
/ 10 марта 2020

Используйте Format$, чтобы применить свой формат:

.Body =  Format$(xlSht.Range("B2").Value, "hh:mm AM/PM")

Дата и время - это просто числа в Excel; применение форматирования в Excel не меняет базовое значение, поэтому необходимо Format$, если вы читаете значение из ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...