You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改VBA代码保留Excel工作表时间格式(如16:00:00)

解决Excel VBA发送邮件时时间格式变为小数的问题

嘿,这个问题我太熟悉了——你遇到的时间格式变成小数的情况,根源就在代码里的这一段:

With wb.Sheets(1).UsedRange
    .Cells.Copy
    .Cells.PasteSpecial xlPasteValues
End With

Excel里的时间本质是日期序列号的小数部分(比如16:00:00对应的就是0.666666667),你看到的“16:00:00”只是单元格的显示格式。当你只粘贴值的时候,格式信息就丢失了,接收方看到的就是原始的小数数值。

怎么修改?

把单纯粘贴值的操作,改成同时粘贴值和数字格式——这样既能把公式转成静态值(这应该是你原来用xlPasteValues的目的),又能保留时间的显示格式。

只需要把粘贴的枚举值换成xlPasteValuesAndNumberFormats就行,修改后的核心片段:

With wb.Sheets(1).UsedRange
    .Cells.Copy
    ' 替换原来的xlPasteValues,同时保留值和数字格式
    .Cells.PasteSpecial xlPasteValuesAndNumberFormats
End With

完整的修改后代码

Option Explicit
Sub Mail_Every_Worksheet()
    'Working in Excel 2000-2016
    Dim sh As Worksheet
    Dim wb As Workbook
    Dim FileExtStr As String
    Dim FileFormatNum As Long
    Dim TempFilePath As String
    Dim TempFileName As String
    Dim OutApp As Object
    Dim OutMail As Object

    TempFilePath = Environ$("temp") & "\"

    If Val(Application.Version) < 12 Then
        'Excel 97-2003 兼容
        FileExtStr = ".xls": FileFormatNum = -4143
    Else
        'Excel 2007+
        FileExtStr = ".xlsm": FileFormatNum = 52
    End If

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    Set OutApp = CreateObject("Outlook.Application")

    For Each sh In ThisWorkbook.Worksheets
        If sh.Range("A1").Value Like "?*@?*.?*" Then
            sh.Copy
            Set wb = ActiveWorkbook

            ' 转换为静态值并保留数字格式(包括时间)
            With wb.Sheets(1).UsedRange
                .Cells.Copy
                .Cells.PasteSpecial xlPasteValuesAndNumberFormats
            End With
            Application.CutCopyMode = False

            TempFileName = "Sheet " & sh.Name & " of " _
                          & ThisWorkbook.Name & " " & Format(Now, "dd-mmm-yy h-mm-ss")

            Set OutMail = OutApp.CreateItem(0)

            With wb
                .SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
                On Error Resume Next
                With OutMail
                    .To = sh.Range("A1").Value
                    .CC = ""
                    .BCC = ""
                    .Subject = "TEST"
                    .Body = "Hi there"
                    .Attachments.Add wb.FullName
                    ' 可以在这里添加其他附件
                    '.Attachments.Add ("C:\test.txt")
                    .Send ' 换成.Display可以先预览邮件再发送
                End With
                On Error GoTo 0
                .Close savechanges:=False
            End With

            Set OutMail = Nothing
            Kill TempFilePath & TempFileName & FileExtStr
        End If
    Next sh

    Set OutApp = Nothing

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub

额外提示

  • 如果需要兼容Excel 2003版本,xlPasteValuesAndNumberFormats对应的数值是12,可以写成.Cells.PasteSpecial 12(因为2003没有这个枚举名)。
  • 这个修改不仅能保留时间格式,所有数字相关的格式(比如货币、百分比、自定义数字格式)都会被保留下来,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Stephen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:19