You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:12:02