DDMMYY格式月末日期排序异常问题及简化实现方案咨询
无需辅助列的排序实现方案
直接修改你的VBA代码即可实现正确排序,不用新增额外列,修改后代码如下:
Sub SortDates() Dim ActDate As Long Dim sheet As String Dim targetWs As Worksheet Dim headCell As Range sheet = "Overall Activity" Set targetWs = ThisWorkbook.Worksheets(sheet) ' 定位ActivityDate列 With targetWs.Rows(1) Set headCell = .Find("ActivityDate", LookIn:=xlValues) If headCell Is Nothing Then Exit Sub ' 找不到对应列直接退出,避免报错 ActDate = headCell.Column End With Dim dateRng As Range Set dateRng = targetWs.Columns(ActDate) ' 先批量把DDMMYY格式的内容转换为标准日期,不改变显示样式 dateRng.TextToColumns Destination:=dateRng, DataType:=xlFixedWidth, _ FieldInfo:=Array(0, xlDMYFormat) dateRng.NumberFormat = "DDMMYY" ' 保持原来的显示格式 ' 执行排序,对整个使用区域排序避免单列排序打乱行数据对应关系 targetWs.UsedRange.Sort Key1:=headCell, Order1:=xlAscending, Header:=xlYes End Sub
实现说明
- 之前排序错误的原因是你把DDMMYY格式的内容当成普通数字/字符串排序,比较时会优先看前两位的日,自然会把上月月底日期排到当月日期后面
- 上面的代码用
TextToColumns方法批量把列内容转换为Excel可识别的DMY格式日期,之后再排序就会按真实日期的先后逻辑处理,最后设置单元格格式为DDMMYY,显示效果和原来完全一致,用户感知不到变化 - 额外增加了列名找不到的异常判断,避免代码空跑报错
手动操作方案(无需写代码)
如果临时需要手动排序,也不用加辅助列:
- 选中ActivityDate整列,点击「数据」选项卡→「分列」,连续点两次下一步,到第三步时列数据格式选「日期」,下拉选「DMY」,点完成
- 直接对该列升序排序即可,排序完成后可以右键设置单元格格式,自定义为
DDMMYY就能恢复原来的显示样式
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

