我发现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
,有没有办法解决?
答案 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)
可能是您的功能设置方式存在问题。修改了它们,这是我的结果。
公式设置:
结果:
修改功能:
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
。