我在使用 VBA 将 mm/dd/yyyy 转换为 dd/mm/yyyy 日期格式时遇到问题。
我有一张这样的桌子:
仅供参考,该表格是从报告工具自动生成的。“字符串操作”或任何 excel 函数有帮助吗?希望知道如何解决这个问题的任何人都可以给我一些想法。
好吧,从你提出问题的方式来看,我不相信你真的想要或需要 VBA。
查看您发布的图像,第一个单元格似乎包含字符串05/06/2013 - 05/10/2013
而不是日期05/06/2013
。因此,您需要做的第一件事就是拆分这些部分,以便内置的 Excel 或 VBA 函数可以对其进行转换。
所以我们可以使用 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")
这里的过程相同,只是使用 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,生活会轻松很多。它的存在是有原因的,一个很好的理由。