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/yyyy
和Long 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
我对@987654325@ 函数的体验是它并不完整。
【讨论】:
谢谢,但我的结果是一样的,因为rng.NumberFormat
返回m/d/yyyy
,在这种情况下Application.Text
和Format
没有区别。
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中的不同的主要内容,如果未能解决你的问题,请参考以下文章