VBA中的Format()函数未正确格式化日期

时间:2016-07-07 13:21:31

标签: excel vba excel-vba

我在使用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年。

我不能为我的生活弄清楚这里发生了什么。有人请帮忙吗?

提前致谢!

2 个答案:

答案 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