VBA使用MID转换美制日期为澳制日期写入单元格失效问题
问题原因
1. 代码存在笔误
你代码里Mid$(OldDate, 1, 1)的参数错误,该参数表示从第1位开始截取1位字符,仅能拿到日期的第一位数字,和你预期取两位日的逻辑不符。你弹窗能输出正确结果大概率是实际测试时此处参数写的是2,属于粘贴代码时的疏漏。同时原代码取年份的起始位也有错误,08/02/2021这类格式的日期年份从第7位开始,而非第6位。
2. Excel单元格自动格式转换是核心原因
你拼接得到的Newdate是字符串格式的澳制日期,写入单元格时,Excel会自动将符合日期规则的字符串识别为日期类型数值,再按照单元格默认的美制日期格式渲染显示,所以看起来和原日期一致,本质是显示格式的问题,不是赋值失败。而MsgBox输出的是纯字符串,不会触发自动格式转换,所以显示正常。
修复方案
方案1:保留字符串处理逻辑,规避自动格式转换
写入值前先将目标单元格设置为文本格式,强制显示你拼接的字符串:
Sub Reverse() For Each cell In Selection OldDate = CStr(cell.Value) ' 强制转为字符串再处理,避免日期类型隐式转换的问题 Newdate = Mid$(OldDate, 4, 2) & "/" & _ Mid$(OldDate, 1, 2) & "/" & _ Mid$(OldDate, 7, 4) cell.Offset(0, 2).NumberFormat = "@" ' 设置为文本格式 cell.Offset(0, 2) = Newdate Next End Sub
方案2:直接操作日期类型,更稳定(推荐)
不需要手动截取字符串,直接利用VBA日期函数转换,转换后的结果还支持正常的日期计算:
Sub ReverseDate() For Each cell In Selection If IsDate(cell.Value) Then ' 交换月和日的位置生成新的日期值 NewDate = DateSerial(Year(cell.Value), Day(cell.Value), Month(cell.Value)) cell.Offset(0, 2).Value = NewDate ' 设置单元格显示格式为澳制日/月/年 cell.Offset(0, 2).NumberFormat = "dd/mm/yyyy" End If Next End Sub
内容的提问来源于stack exchange,提问作者Kelvin C
相关产品推荐
相关产品推荐

