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

标签 excel vba date format

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

A
21.03.1990
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

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

最佳答案

更新:新答案

这是一个可以完成这项工作的解决方案!子例程包含一个执行替换的函数(该函数本身非常有用!)。运行子程序,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 

将此函数放在同一模块中:

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

工作原理:我有一个漂亮的 RegexReplace 函数,允许您使用正则表达式进行替换。 sub 几乎循环遍历您的 A 列,并对您提到的两种情况进行正则表达式替换。我首先使用 Instr() 的原因是确定它是否需要替换以及哪种替换。从技术上讲,您可以跳过此步骤,但对不需要它的单元进行替换确实成本高昂。最后,为了安全起见,我将单元格格式化为您的自定义日期格式,无论里面有什么内容。

如果您不熟悉正则表达式(引用:http://www.regular-expressions.info/),我使用的表达式是:

  • () 中的每个项目都是捕获组 - 也就是您想要搞乱的内容
  • \d 代表数字 [0-9]。
  • {2} 表示 2 个,{4} 表示 4 个。为了安全起见,我在这里明确表示。
  • 之前的\。在第一次替换中需要因为“.”有特殊意义。
  • 在 VBA 正则表达式中,您可以使用 $ + no 来引用捕获组。组的。这就是我翻转这 3 个项目的顺序的方法。

关于excel - 将日期格式更改为 yyyy-mm-dd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7106238/

相关文章:

excel - 使用VBA清除立即窗口?

python - 基于 'date' 列的月份和年份的列值

java - 如何读取 Excel 日期并将其存储到我的数据库中?

excel - 列表框中选定的行复制到另一个列表框

excel - 如果 excel-vba 无模式用户窗体窗口重新获得焦点,会触发哪个事件?

c# - 通过 OleDb c# 在 Excel 中插入回车符

perl - 确定日期的开始时间

vba - Excel VBA - 带分隔符和单引号的字符串连接

vba - 在powerpoint VBA中,如何更改文本框中字体的间距?

excel - 对两个不同表中的两列求和