2016-07-07 214 views
0

我在使用Excel中的VBA中的Format()函数时遇到问题。我不知道问题是什么。我之前在多个地方使用了Format()函数,并且从来没有像这样给出过麻烦。VBA中格式化()函数无法正确格式化日期

对于上下文,让我简单解释一下情况。我有一堆工作表,都以“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月16 ...),其余12是12个月的2015年( 12月15日,11月15日...)。

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

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

出于某种原因,第7行上的Format()函数似乎也将2016年的月份读为2016年。

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

在此先感谢!

+1

它解释了'15'和'16'如天,默认为2016年一年。对于你的特定格式'“20”&Right(WS.Name,2)'会起作用。 – arcadeprecinct

回答

1

这个失败的原因是'May-16'不是日期。你可以做的是把它合并为一个,将它转换为Date类型,然后格式为。您的代码之间的if和结束,如果然后将是:

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

这应该这样做。

+0

有趣的是,我确实想到你在说什么 - “5月16日”不是约会。因此,为了测试Format()函数的这种用法,我明确地给出了几个“mmm-yy”字符串(不同年份),并且每次在这些测试中它都正确识别年份并输出它。这就是为什么我不明白为什么只有当它传递'WS.name'字符串时才会失败。 –

+0

更新:我用你的建议的一部分。在传递它之前,我在'WS.name'前面加上了“01-”',现在看起来很完美。感谢那。我认为这个问题是因为“May-16”不是约会的事实,这可能是@arcadeprecinct的建议,即它将“yy”解释为日子,进入游戏。无论哪种方式,它仍然没有道理为什么它在测试中工作(正如我在上面的注释中解释的),而不是当传递'WS.name'字符串时。如果你知道了,让我知道。 **无论如何,感谢你们俩。** –

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 
+0

您正在将字符串'yyyySplit(1)'转换为整数,只有在转换回字符串。在我看来,使用'Right(WS.Name,2)'是更好的选择,因为不需要创建一个字符串数组。它也可以处理任何格式的年份在右侧(两位数和四位数年份以及不同的分隔符)。 – arcadeprecinct