假设我的单元格中有如下文本值:
02/23/15 to 03/01/15
我可以使用 Excel 函数将其转换为类似
23-Feb-15 to 1-Mar-15
到目前为止,我已经研究了公式,DATEVALUE
但它似乎并不能解决我的具体问题。
我想我正在寻找的是:如何为字符串(例如“02/16/15”)指定日期格式(例如“dd/mm/yy”)并将其转换为另一种格式的日期字符串(例如“dd-mmm-yy”)
答案1
无论您的区域设置如何,以下公式都适用于您的示例:
=TEXT(DATE(MID(A1,7,2),LEFT(A1,2),MID(A1,4,2)),"dd-mmm-yy") & " to " & TEXT(DATE(RIGHT(A1,2),MID(A1,13,2),MID(A1,16,2)),"dd-mmm-yy")
只要日期的格式为 mm/dd/yy 并且位于开始和结束,那么无论日期之间是什么,这个方法都可以起作用:
=TEXT(DATE(MID(A1,7,2),LEFT(A1,2),MID(A1,4,2)),"dd-mmm-yy") & MID(A1,9,LEN(A1)-16) & TEXT(DATE(RIGHT(A1,2),MID(A1,LEN(A1)-7,2),MID(A1,LEN(A1)-4,2)),"dd-mmm-yy")
根据您的情况,这个其他选项可能会或可能不会有帮助。您可以更改系统的默认日期格式。这会影响 Excel 的日期函数,因此它们会期望日期采用该格式。完成后,您可以DATEVALUE
正常使用该函数。如果这是一次性操作,我建议更改格式,运行公式,然后再改回来。否则,我会采用公式方法。您可以获取有关如何更改系统设置的所有详细信息这里。(我没有复制粘贴所有内容,因为它长的。
答案2
你可以试试这个(我使用英国日期格式)
=CONCATENATE(TEXT(LEFT(A1,8), "dd-mmm-yy")," to ",TEXT(RIGHT(A1,8), "dd-mmm-yy"))
如您所见,它期望日期格式为固定长度(8 个字符,例如 mm/dd/yy 或 /dd/mm/yy)。
由于上述方法不起作用,您可以尝试 VBa,它将读取 ColA 中的当前值并将新值粘贴到 ColB 中
Option Explicit
Sub YikesThereBePirates()
Dim row As Integer
row = 1
Do While Range("A" & row).Value <> ""
Dim splitty() As String
splitty = Split(Range("A" & row).Value, " to ")
Dim newFirstDate As String
Dim newSecondDate As String
newFirstDate = GetDate(splitty(0))
newSecondDate = GetDate(splitty(1))
Range("B" & row).Value = newFirstDate & " to " & newSecondDate
row = row + 1
Loop
End Sub
Function GetDate(d As String) As String
Dim splitty() As String
splitty = Split(d, "/")
Dim mnth As String
Select Case (splitty(0))
Case "01"
mnth = "Jan"
Case "02"
mnth = "Feb"
Case "03"
mnth = "Mar"
Case "04"
mnth = "Apr"
Case "05"
mnth = "May"
Case "06"
mnth = "Jun"
Case "07"
mnth = "Jul"
Case "08"
mnth = "Aug"
Case "09"
mnth = "Sep"
Case "10"
mnth = "Oct"
Case "11"
mnth = "Nov"
Case "12"
mnth = "Dec"
End Select
GetDate = splitty(1) & "-" & mnth & "-" & splitty(2)
End Function
另外,我也使用了美国日期格式,以便 VBa 能够与您的查询匹配。
记住,使用 VBa 时,请先复制文件作为备份(没有撤消选项)