如何通过VBA统一Excel日期格式 解决运行后单元格显示####问题
问题根因
原有代码仅修改了单元格的显示格式,没有对不同存储类型的日期值做转换,且存在三个明显缺陷:
- 仅处理A列,未覆盖需求提到的B列
- 8位数字型文本日期、文本存储的斜杠日期本质不是日期类型值,仅修改显示格式不会生效
- 没有处理列宽不足的情况,日期值长度超过列宽时就会显示为
####
可直接运行的VBA代码
Sub 统一AB列日期格式() Dim lastRow As Long, i As Long Dim targetRng As Range, cellText As String Dim convertDate As Date ' 关闭屏幕刷新提升大批量数据处理速度 Application.ScreenUpdating = False ' 取A列最后非空行行号,兼容所有Excel版本,不再硬编码65536 lastRow = Cells(Rows.Count, "A").End(xlUp).Row ' 从第2行开始遍历,逐行处理A、B两列 For i = 2 To lastRow For Each targetRng In Array(Range("A" & i), Range("B" & i)) cellText = Trim(targetRng.Value) If cellText <> "" Then ' 按存储类型做值转换 Select Case True ' 匹配8位数字/数字型文本日期,例如20200714 Case Len(cellText) = 8 And IsNumeric(cellText) convertDate = DateSerial(Left(cellText, 4), Mid(cellText, 5, 2), Right(cellText, 2)) targetRng.Value = convertDate ' 匹配日期序列号、文本存储的斜杠日期、原生日期值 Case IsDate(cellText) targetRng.Value = CDate(cellText) End Select ' 设置为要求的无前置零斜杠日期格式 targetRng.NumberFormatLocal = "yyyy/m/d" End If Next ' 处理完当前行后自动调整A、B列宽,避免出现#### Range("A:B").EntireColumn.AutoFit Next Application.ScreenUpdating = True MsgBox "日期标准化处理完成", vbInformation End Sub
代码效果说明
- 自动识别提到的4种日期存储格式:8位数字型文本、Excel日期序列号、带前导零斜杠日期、无前置零斜杠日期,全部先转换为真正的日期类型值,再设置显示格式,不会出现格式不生效的问题
- 同时覆盖A、B两列的处理需求
- 自动调整列宽,彻底解决
####显示问题 - 兼容.xls、.xlsx等所有Excel格式,处理上万行数据时也不会卡顿
内容的提问来源于stack exchange,提问作者Dou
相关产品推荐
相关产品推荐

