Excel 自动电子邮件中的时间格式为;“一般”;而不是hh:nn上午/下午

Excel 自动电子邮件中的时间格式为;“一般”;而不是hh:nn上午/下午,excel,vba,time,outlook,format,Excel,Vba,Time,Outlook,Format,我有一个Excel电子表格,在一列中列出日期,在另一列中列出时间 我的Outlook VBA代码提取日期/时间并将其放入电子邮件中 在电子表格中,使用Excel中的“单元格格式”功能将其格式设置为“下午1:30”(例如) 如果我只是从电子表格中提取值,例如 .Body = xlSht.Range("A2") 它显示为0.375,或“一般”形式的另一个数字 如果我先用这个代码格式化时间 Dim Time1 As Object Set Time1 = xlSht.Range("B2") Time1

我有一个Excel电子表格,在一列中列出日期,在另一列中列出时间

我的Outlook VBA代码提取日期/时间并将其放入电子邮件中

在电子表格中,使用Excel中的“单元格格式”功能将其格式设置为“下午1:30”(例如)

如果我只是从电子表格中提取值,例如

.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


是否有其他方法可以实现此目的?

使用
格式$
应用您的格式:

.Body =  Format$(xlSht.Range("B2").Value, "hh:mm AM/PM")
日期时间只是Excel中的数字;在Excel中应用格式不会更改基础值,因此,如果您正在从单元格中读取值,则需要使用
格式$

注意,此答案(除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声明为对象,然后
Set Time1=xlSht.Range(“B2”)
Time1
变量是单元格B2的引用。这意味着从现在开始,写
Time1
实际上与写
xlSht.Range(“B2”)
完全相同,只是更短

这意味着如果您现在将该单元格的值
0.375
转换为字符串
格式(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:00am
,然后想:“啊,用户想写一个时间/日期,所以让我们聪明一点,把这个字符串转换成一个日期值(这样我们就可以用它来计算)。”所以它将它转换成一个数字,实际上是
0.375
,哇哦,你又回到了开始的位置

现在有两种方法可以解决这个问题:

  • 不要将
    Time1声明为对象,而是声明为字符串

    Dim Time1 As String
    Time1 = xlSht.Range("B2").Value 'no Set!
    
    因此,行
    Time1=Format(Time1,“hh:nn AM/PM”)
    不会将其写回单元格,而只将其写回变量
    Time1

  • 或者,确保在将其写回单元格时,Excel将其理解为
    文本
    ,并且不会尝试通过添加
    作为第一个字符将其再次转换为时间/日期(这不会显示在单元格中):

    请注意,强烈建议不要将日期/时间作为文本写入单元格。你不能再用它来计算了。所以我推荐第一种选择


  • 为什么是nn而不是mm?我理解这个问题是关于将时间从Excel拖到电子邮件中…@BigBen是的,你可能是对的,我认为同样的,你的答案非常有效(我投了票)。我只是觉得有必要解释一下为什么会发生这种情况,以及为什么OP的代码没有按预期工作。因此,这被认为是一种解释,而不是解决方案。^^^^^啊,明白了。虽然当我看到
    暗淡的时间1是字符串时,我内心会畏缩@BigBen yep,这只是为了显示对象引用和普通变量(包含值)之间的差异。我通常会按照你的回答做。@BigBen是的,我知道这是一个不必要的类型转换。但是我不想让它变得更加混乱,我试着坚持原来的代码。但是是的,你是对的。最好是:
    Dim Time1作为字符串:Time1=Format(xlSht.Range(“B2”).Value,“hh:nn AM/PM”)
    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