【问题标题】:Format() function in VBA not formatting dates correctlyVBA 中的 Format() 函数未正确格式化日期
【发布时间】:2016-11-09 20:09:55
【问题描述】:

我在 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 年的前五个月(May-16、Apr-16、Mar-16...),其余 12 张是 2015 年的 12 个月(Dec-15、 11 月 15 日...)。

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

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

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

我一生都无法弄清楚这里发生了什么。有人帮忙吗?

提前致谢!

【问题讨论】:

  • 它将1516 解释为天,默认为2016 年。对于您的特定格式,"20" &amp; Right(WS.Name,2) 可以工作。

标签: vba excel


【解决方案1】:

失败的原因是“May-16”不是一个日期。你可以做的就是把它合二为一,转换成Date类型,然后格式化。您在 if 和 end if 之间的代码将是:

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

应该可以的。

【讨论】:

  • 有趣的是,我确实想到了你所说的——“5 月 16 日”不是约会。因此,为了测试 Format() 函数的这种用法,我明确地给了它一些“mmm-yy”字符串(不同年份的),并且每次在这些测试中它都正确地识别并输出了年份。这就是为什么我不明白为什么它只有在传递WS.name 字符串时才会失败。
  • 更新:我使用了你的部分建议。我在通过之前将"01-" 前缀为WS.name,现在它似乎工作得很好。感谢那。我猜当时的问题“May-16”不是日期这一事实,这可能是@arcadeprecinct 将“yy”解释为天的建议出现的地方玩。但是,无论哪种方式,它为什么在测试中起作用(正如我在上面的评论中解释的那样)仍然没有意义,而不是在通过 WS.name 字符串时不起作用。如果你弄明白了,请告诉我。 无论如何,谢谢你们俩。
【解决方案2】:

假设,如您所说,您的格式保持不变:

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

【讨论】:

  • 您将字符串 yyyySplit(1) 转换为整数,只是为了将其转换回字符串。在我看来,使用Right(WS.Name,2) 会是一个更好的选择,因为没有必要创建一个字符串数组。它还可以处理年份在右侧的任何格式(两位数和四位数的年份以及不同的分隔符)。
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多