excel日期格式与vba中的格式不同

时间:2013-12-06 02:32:27

标签: excel vba date excel-vba

我发现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):

Date format

结果:

Result

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

3 个答案:

答案 0 :(得分:1)

请尝试使用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

我对Format函数的体验是它不完整。

答案 1 :(得分:0)

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

公式设置:

Formula

结果:

Result

修改功能:

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

请查看这是否适用于您。

答案 2 :(得分:0)

我不确定它是否足以解决我的问题,但随时评论或加强这一点。

我遇到的问题似乎是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

dd-MMM-yyyy