好吧,从你提出问题的方式来看,我不相信你真的想要或需要 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)
in C2.
现在这些仍然是字符串。通常我会使用 DATEVALUE 将字符串转换为日期,但我的 Excel 副本不喜欢那些疯狂的无意义*日期格式。因此我们将把日期解析到 DATE 函数中。推杆=DATE(RIGHT(B2,4),LEFT(B2,2),MID(B2,4,2))
and =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 应用程序
这里的过程是相同的,只是使用 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 sub 进行测试,或者 ChangeDateFormat 可以用作 Excel 公式中的用户定义函数=ChangeDateFormat(A2)
.
注意,在传递给 Format 的日期格式中,我转义了日期分隔符\/
而不是仅仅把/
这是因为Format函数会自动替换/
与 Windows 设置中的日期分隔符。由于我使用现代计算机友好的日期格式,我的分隔符是破折号......
Footnote
* 如果人们只使用,生活会变得容易得多ISO 8601 http://en.wikipedia.org/wiki/ISO_8601。它的存在是有原因的,一个很好的理由。