将日期格式更改为yyyy-mm-dd

Jan*_*ejc 6 format excel vba date

我有一个日期列,其中包含混合格式的日期.例如:

A
1990年3
月21日 03/21/1990

所以,基本上一列中有两种不同的格式:dd.mm.yyyymm/dd/yyyy.我正在尝试编写一个VBA脚本来更改列中所有日期的格式yyyy-mm-dd.这就是我到目前为止所得到的:

Sub changeFormat()

Dim rLastCell As Range
Dim cell As Range, i As Long
Dim LValue As String

i = 1

With ActiveWorkbook.Worksheets("Sheet1")
    Set rLastCell = .Range("A65536").End(xlUp)
    On Error Resume Next
    For Each cell In .Range("A1:A" & rLastCell.Row)
        LValue = Format(cell.Value, "yyyy-mm-dd")
        .Range("B" & i).Value = LValue
        i = i + 1
    Next cell
    On Error GoTo 0
End With

End Sub
Run Code Online (Sandbox Code Playgroud)

我知道这不是优雅的代码,但我是VBA的初学者所以请原谅我.该代码的问题在于它只是将未更改的A列重写为B列,当我将Format函数中的参数更改yyyy-mm-dddd/mm/yyyy有效时,但仅适用于格式中的日期mm/dd/yyyy,并保持dd.mm.yyyy不变.我很感激任何建议.

aev*_*nko 8

更新:新的答案

这是一个可以完成这项工作的解决方案!子例程包括一个替换函数(函数本身非常有用!).运行sub,将修复A列中的所有出现.

Sub FixDates()

Dim cell As range
Dim lastRow As Long

lastRow = range("A" & Rows.count).End(xlUp).Row

For Each cell In range("A1:A" & lastRow)
    If InStr(cell.Value, ".") <> 0 Then
        cell.Value = RegexReplace(cell.Value, _
        "(\d{2})\.(\d{2})\.(\d{4})", "$3-$2-$1")
    End If
    If InStr(cell.Value, "/") <> 0 Then
        cell.Value = RegexReplace(cell.Value, _
        "(\d{2})/(\d{2})/(\d{4})", "$3-$1-$2")
    End If
    cell.NumberFormat = "yyyy-mm-d;@"
Next

End Sub 
Run Code Online (Sandbox Code Playgroud)

将此功能放在同一个模块中:

Function RegexReplace(ByVal text As String, _
                      ByVal replace_what As String, _
                      ByVal replace_with As String) As String

Dim RE As Object
Set RE = CreateObject("vbscript.regexp")

RE.pattern = replace_what
RE.Global = True
RegexReplace = RE.Replace(text, replace_with)

End Function
Run Code Online (Sandbox Code Playgroud)

它是如何工作的:我有一个漂亮的RegexReplace函数,允许你使用正则表达式替换.sub mearly循环通过你的A列,并为你提到的那两个案例做一个正则表达式替换.我首先使用Instr()的原因是为了阻止它是否需要替换,以及哪种类型.从技术上讲,你可以跳过这个但是对不需要它的单元进行替换是非常昂贵的.最后,我将单元格格式化为您的自定义日期格式,无论内部是什么安全措施.

如果您不熟悉Regex(对于ref:http://www.regular-expressions.info/),我使用的表达式是:

  • ()中的每个项目都是捕获组 - 也就是你要弄乱的东西
  • \ d代表数字[0-9].
  • {2}表示2,而{4}表示4.我在这里明确表示安全.
  • 之前的\.在第一次更换时需要"." 有特殊意义.
  • 在VBA正则表达式中,您使用$ + no来引用捕获组.小组 这是我如何翻转3项的顺序.