2

我在使用 VBA 将 mm/dd/yyyy 转换为 dd/mm/yyyy 日期格式时遇到问题。

我有一张这样的桌子:

在此处输入图像描述

仅供参考,该表格是从报告工具自动生成的。“字符串操作”或任何 excel 函数有帮助吗?希望知道如何解决这个问题的任何人都可以给我一些想法。

4

1 回答 1

2

好吧,从你提出问题的方式来看,我不相信你真的想要或需要 VBA。

查看您发布的图像,第一个单元格似乎包含字符串05/06/2013 - 05/10/2013而不是日期05/06/2013。因此,您需要做的第一件事就是拆分这些部分,以便内置的 Excel 或 VBA 函数可以对其进行转换。

通过 Excel 公式

所以我们可以使用 SEARCH 或 FIND 来找到“-”并动态地做事。但我觉得很懒所以我只假设字符串的前 10 个字符是第一个日期,最后 10 个字符是第二个日期。源字符串上的 TRIM 函数应该使这在前后有额外空格的情况下更安全。

因此,如果我们的字符串05/06/2013 - 05/10/2013在单元格 A2 中,我们可以=LEFT(TRIM(A2),10)输入 B2 和=RIGHT(TRIM(A2),10)C2。

现在这些仍然是字符串。通常我会使用 DATEVALUE 将字符串转换为日期,但我的 Excel 副本不喜欢那些疯狂的废话* 日期格式。所以我们将日期解析到 DATE 函数中。分别将=DATE(RIGHT(B2,4),LEFT(B2,2),MID(B2,4,2))=DATE(RIGHT(C2,4),LEFT(C2,2),MID(C2,4,2))放入单元格 C2 和 D2 中。

从这里我们可以使用 TEXT 函数(很像 VBA 中的格式函数)和一些字符串连接将它们重新组合成原始的单单元格日期范围格式。假设这是想要的结果。

所以我们的最后一个单元格 F2 将是=TEXT(D2,"dd/MM/yyyy") & " - " & TEXT(E2,"dd/MM/yyyy"). 我们当然可以将所有这些公式组合成一团糟,如下所示:

=TEXT(DATE(RIGHT(LEFT(A2,10),4),LEFT(LEFT(A2,10),2),MID(LEFT(A2,10),4,2)),"dd/MM/yyyy") & " - " & TEXT(DATE(RIGHT(RIGHT(TRIM(A2),10),4),LEFT(RIGHT(TRIM(A2),10),2),MID(RIGHT(TRIM(A2),10),4,2)),"dd/MM/yyyy")

通过 Visual Basic for Applications

这里的过程相同,只是使用 VBA 函数和语法而不是 Excel 公式。现在无论出于何种原因,DateValue 的 VBA 版本将在我的 Excel 副本中接受这些日期。所以我会用它。

Public Function ChangeDateFormat(inputString As String) As String
  Dim firstDate As Date
  Dim secondDate As Date
  Dim trimmedInput As String
  trimmedInput = Trim$(inputString)
  firstDate = DateValue(Left$(trimmedInput, 10))
  secondDate = DateValue(Right$(trimmedInput, 10))

  ChangeDateFormat = Format(firstDate, "dd\/MM\/yyyy") & " - " & Format(secondDate, "dd\/MM\/yyyy")
End Function

Public Sub Test()
  Sheet1.[B2] = ChangeDateFormat(Sheet1.[A2])
End Sub

这可以通过运行提供的 Test sub 进行测试,或者 ChangeDateFormat 可以用作 excel 公式中的用户定义函数=ChangeDateFormat(A2)

请注意,在传递给 Format 的日期格式中,我转义了日期分隔符\/而不是仅仅/输入。这是因为 Format 函数将自动替换/为 Windows 设置中的日期分隔符。而且由于我使用现代计算机友好的日期格式,我的分隔符是破折号......

脚注

* 如果人们只使用ISO 8601,生活会轻松很多。它的存在是有原因的,一个很好的理由。

于 2013-09-07T04:21:49.663 回答