如何使用VBA将mm / dd / yyyy更改为dd / mm / yyyy

时间:2013-09-07 01:39:07

标签: vba excel-vba date excel

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

我有一张这样的表:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

好吧,从你提出问题的方式来看,我不相信你真的想要或需要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公式。 现在无论出于何种原因,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)