使用VBA将mm / dd / yyyy转换为dd / mm / yyyy日期格式时遇到问题。
我有一张这样的表:
fyi,该表是从报告工具自动生成的。 “字符串操作”或任何excel函数可以帮助吗?希望任何知道如何解决这个问题的人都能给我一些想法。
答案 0 :(得分:1)
好吧,从你提出问题的方式来看,我不相信你真的想要或需要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公式。 现在无论出于何种原因,VBA版本的DateValue都会在我的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,生活会变得容易得多。它存在是有原因的,是一个很好的理由。
答案 1 :(得分:0)
format(varDate, "dd/MM/yyyy")