VBA中的Format()函数没有正确格式化date

我在使用Excel中的VBA中的Format()函数时遇到了问题。 我不知道问题是什么。 之前我已经在很多地方使用了Format()函数,从来没有像这样给过麻烦。

对于上下文,让我简单地解释一下情况。 我有一堆工作表,都以“mmm-yy”格式的月份年份组合(除了“主表格”表格)命名。 在下面的function(为相关性而简化)中,我的目标是循环遍历每张纸,并以“yyyy”格式显示其名称。 正如您所看到的,在第7行中,我使用Format()函数将工作表名称转换为“yyyy”格式。

Function populateYearsCBB() Dim WS As Worksheet Dim yyyyName As Integer For Each WS In ThisWorkbook.Worksheets If WS.name <> "Main Sheet" Then 'WS.name is therefore a month-year combo of "mmm-yy" format yyyyName = Format(WS.name, "yyyy") 'LINE 7 MsgBox (yyyyName) End If Next End Function 

更多的背景:我的前5张是2016年的前5个月(5月16日,4月16日,3月16日…),其余12个是2015年的12个月(2015年11月15日至15日…)。

当然,当我运行这个function的时候,我希望我的消息框的输出是:“2016”,“2016”,“2016”,“2016”,“2016”(2016年的五个月)然后是“2015”的12倍。 对?

奇怪的是,我收到17个消息框,都说“2016”。

出于某种原因,第7行的Format()函数似乎也是2016年的2015年。

我不能为了我的生活找出这里发生了什么事情。 有人请帮忙?

提前致谢!

这个失败的原因是'5月16日'不是约会。 你可以做的是把它合并为一个,将其转换为datetypes,然后格式为。 你的if和end之间的代码会是:

 Dim aDate as Date aDate = CDate("01-" + ws.name) ' eg '01-May-2015' which is a real date yyyyName = Format$(aDate, "yyyy") 

这应该做到这一点。

假设,如你所说,你保持你的格式是一样的:

 Function populateYearsCBB() Dim WS As Worksheet Dim yyyyName As Integer Dim yyyySplit() As String For Each WS In ThisWorkbook.Worksheets If WS.name <> "Main Sheet" Then yyyySplit = Split(WS.name, "-") yyyyName = 20 & CInt(yyyySplit(1)) 'WS.name is therefore a month-year combo of "mmm-yy" format 'yyyyName = Format(WS.name, "yyyy") 'LINE 7 'you can change the name here using WS.name = yyyyName MsgBox (yyyyName) End If Next End Function