excel日期格式与vba中的不同

Posted

技术标签:

【中文标题】excel日期格式与vba中的不同【英文标题】:excel date format not same as in vba 【发布时间】:2013-12-23 06:29:08 【问题描述】:

我发现excel中的日期格式有问题,显示格式与vba中的numberformat不一样 我已经为这个案例创建了一个测试。

Regional Setting for Short Date: MM/dd/yyyy

模块:

Function RetrieveNumberFormat() As String
    Dim rng As Range
    Set rng = Application.Caller    
    RetrieveNumberFormat = rng.NumberFormat       
    Set rng = Nothing
End Function

Function SetDate() As String
    Dim rng As Range    
    Set rng = Application.Caller    
    SetDate = Format(Now, rng.NumberFormat)    
    Set rng = Nothing
End Function

在 Excel 中

Col A (Date w default format) | Col B (MM/dd/yyyy)      | Col C (dd-mmm-yyyy)     | Col D (dd/mm/yyyy)      | Col E ([$-404]mm/dd/yyyy)
=Now()                        | =Now()                  | =Now()                  | =Now()                  | =Now()
=RetrieveNumberFormat()       | =RetrieveNumberFormat() | =RetrieveNumberFormat() | =RetrieveNumberFormat() | =RetrieveNumberFormat()
=SetDate()                    | =SetDate()              | =SetDate()              | =SetDate()              | =SetDate()

默认格式的日期(Col A):

结果:

我可以知道为什么 Excel 将 System Date Format MM/dd/yyyy 更改为 m/d/yyyy,有没有解决方法?

【问题讨论】:

Excel VBA date formats 的可能副本。看看this answer,它解释了你正在处理的一些事情。 感谢您的回答,但我认为这与我的情况有点不同,当我使用日期格式开始时,excel 似乎会将数字格式保存为m/d/yyyy(美国语言环境的默认格式) *,所以我无法区分实际格式还是系统格式。但是,它可能会给我一种方法来解决这个问题。 我的这个问题和答案可能会有所帮助:***.com/q/9839676/973283 【参考方案1】:

您的函数设置方式可能存在问题。修改它们,这是我的结果。

公式设置:

结果:

修改功能:

Function RetrieveNumberFormat(rng As Range) As String
    Application.Volatile
    RetrieveNumberFormat = rng.NumberFormat
End Function

Function SetDate(rng As Range) As String
    Application.Volatile
    SetDate = Format(Now, rng.NumberFormat)
End Function

请看看这是否适用于您。

【讨论】:

@Alex:基于Control Panel 中的Region and Language,它是Short date: M/d/yyyyLong date: ddd, MMMM, dd, yyyy。即使我把它改成MM/dd/yyyy,结果也是一样的。 :) 谢谢,我试过了,但结果和我以前一样。我已将整列设置为相同的日期格式,所以我认为这与Application.Caller 无关。顺便说一句,你能帮忙检查一下 A1 的单元格格式吗?默认格式的日期应以*开头,受regional setting影响 很奇怪。改变了周围的事情,我遇到了同样的错误。当我使用默认的Date 设置时,12/06/2013 现在变成了12/6/2013。 Methinks VBA 读取日期的方式与 Excel 在区域设置中的读取方式不同。【参考方案2】:

尝试改用Application.Text

所以你的 SetDate 函数看起来像

Function SetDate() As String
    Dim rng As Range    
    Set rng = Application.Caller    
    SetDate = Application.Text(Now, rng.NumberFormat)    
    Set rng = Nothing
End Function

我对@9​​87654325@ 函数的体验是它并不完整。

【讨论】:

谢谢,但我的结果是一样的,因为rng.NumberFormat 返回m/d/yyyy,在这种情况下Application.TextFormat 没有区别。 Format怎么不完整? @Jean-FrançoisCorbett This question 例如我问过。 哈!对,显然我忘了我有answered it :-) @Jean-FrançoisCorbett 是的,我确实发现了 :)【参考方案3】:

我不确定它是否足以解决我的问题,但请随时发表评论或改进。

我遇到的问题好像excel会将date formats that begin with (*)保存为m/d/yyyy,这是美国地区的默认格式(嗯,Excel是美国公司创建的),而不是实际的日期格式。

直接在excel中输入值很好,excel会自动改变日期格式,但是,当我使用VBA输出时,这可能会产生问题,尤其是在使用autofilter时。

我增强了SetDate功能:

Function SetDate(refCell As Range) As String
    If refCell.NumberFormat = "m/d/yyyy" And refCell.Text = Format(refCell.Value, "Short Date") Then
        SetDate = Format(Now, "Short Date")
    Else
        SetDate = Format(Now, refCell.NumberFormat)
    End If
End Function

但是这种方法在使用日期格式时仍然存在问题:dd-MMM-yyyy,excel 将显示为dd-MM-yyyy

【讨论】:

以上是关于excel日期格式与vba中的不同的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 日期格式

如何使用 VBA 在 Excel 注释中查找和替换日期格式

VBA批量修改excel格式

excel用vba宏处理一些日期时间

Excel 和 OpenOffice 中的日期格式不同

如何用EXCEL VBA批量提取JPG文件日期时间信息到表格中?