【发布时间】:2013-09-07 01:39:07
【问题描述】:
我在使用 VBA 将 mm/dd/yyyy 转换为 dd/mm/yyyy 日期格式时遇到问题。
我有一张这样的桌子:
仅供参考,该表格是通过报告工具自动生成的。 “字符串操作”或任何 excel 函数有帮助吗?希望知道如何解决这个问题的人可以给我一些想法。
【问题讨论】:
-
我假设日期对在一个单元格中。对是用破折号还是 {space dash space} 分隔??
我在使用 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 子程序进行测试,或者 ChangeDateFormat 可以用作 excel 公式 =ChangeDateFormat(A2) 中的用户定义函数。
注意,在传递给 Format 的日期格式中,我转义了日期分隔符 \/ 而不是仅仅将 / 放入其中。这是因为 Format 函数会自动将 / 替换为 Windows 设置中的日期分隔符.由于我使用现代计算机友好的日期格式,我的分隔符是破折号......
* 如果人们只使用ISO 8601,生活会轻松很多。它的存在是有原因的,一个很好的理由。
【讨论】: