我在使用VBA for Excel中的Format()函数时遇到问题。我不知道问题是什么。我以前在很多地方都使用了Format()函数,并且没有像这样给它带来麻烦。
关于背景,让我简要解释一下情况。我有一堆工作表,所有工作表都以" mmm-yy"格式("主要表"表除外)。在下面的功能中(相关性简化),我的目标是循环显示每张纸,并在" 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月16日,4月16日,3月16日......),剩下的12张是2015年的12个月(12月15日, NOV-15 ...)。
当然,当我运行这个功能时,我会期待我的消息框&#39;输出为:&#34; 2016&#34;,&#34; 2016&#34;,&#34; 2016&#34;,&#34; 2016&#34;,&#34; 2016&#34; (2016年的五个月),然后是12次&#34; 2015&#34;。正确?
奇怪的是,我收到了17个消息框,他们都在说&#34; 2016&#34;。
出于某种原因,第7行的Format()函数似乎也在阅读2015年的2016年。
我不能为我的生活弄清楚这里发生了什么。有人请帮忙吗?
提前致谢!
答案 0 :(得分:1)
失败的原因是'May-16'不是日期。你可以做的是将它变成一个,将其转换为日期类型,然后格式化。 if和end之间的代码如果是:
Dim aDate as Date
aDate = CDate("01-" + ws.name) ' e.g. '01-May-2015' which is a real date
yyyyName = Format$(aDate, "yyyy")
应该这样做。
答案 1 :(得分:0)
假设,正如您所说,您保持格式相同:
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