VBA实现将YYYYMMDD格式日期转换为dd/mm/yyyy格式
将E列YYYYMMDD格式批量转换为dd/mm/yyyy的VBA实现
核心思路
不用手动拆分日/月/年,直接利用VBA的DateSerial函数将8位数字的YYYYMMDD字符串/数值转换为日期值,再设置单元格显示格式为dd/mm/yyyy,既保证日期的可计算性,又实现目标显示效果。
基础版代码(适合小数据量)
Sub ConvertYYYYMMDDtoDDMMYYYY() Dim ws As Worksheet Dim lastRow As Long Dim rng As Range Dim cell As Range ' 替换为你的工作表名称 Set ws = ThisWorkbook.Worksheets("Sheet1") ' 获取E列最后一行有数据的行号 lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row ' 定义处理范围(假设E1是表头,从E2开始;无表头则改为E1:E" & lastRow) Set rng = ws.Range("E2:E" & lastRow) ' 逐个处理单元格 For Each cell In rng ' 验证内容是8位数字 If Len(cell.Value) = 8 And IsNumeric(cell.Value) Then ' 转换为日期值:年(前4位)、月(中间2位)、日(后2位) cell.Value = DateSerial(Left(cell.Value, 4), Mid(cell.Value, 5, 2), Right(cell.Value, 2)) ' 设置显示格式 cell.NumberFormat = "dd/mm/yyyy" End If Next cell End Sub
高效版代码(适合大数据量)
如果E列数据超过几千行,用数组批量处理比逐个循环单元格快得多:
Sub ConvertYYYYMMDDtoDDMMYYYY_Fast() Dim ws As Worksheet Dim lastRow As Long Dim arr As Variant Dim i As Long Set ws = ThisWorkbook.Worksheets("Sheet1") lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row ' 把单元格数据读入数组 arr = ws.Range("E2:E" & lastRow).Value ' 数组内批量处理 For i = LBound(arr) To UBound(arr) If Len(arr(i, 1)) = 8 And IsNumeric(arr(i, 1)) Then arr(i, 1) = DateSerial(Left(arr(i, 1), 4), Mid(arr(i, 1), 5, 2), Right(arr(i, 1), 2)) End If Next i ' 将处理后的数组写回单元格 ws.Range("E2:E" & lastRow).Value = arr ' 统一设置格式 ws.Range("E2:E" & lastRow).NumberFormat = "dd/mm/yyyy" End Sub
注意事项
- 确保E列内容是无空格、无特殊字符的8位数字(如
20230118),否则代码会跳过不符合条件的单元格 - 运行代码前建议先备份工作表,避免数据意外丢失
- 若E列没有表头,把代码中的
E2改为E1即可
内容的提问来源于stack exchange,提问作者user21226398
相关产品推荐
相关产品推荐

