Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4725|回复: 16

[已解决]规范日期格式

[复制链接]
发表于 2017-1-14 22:11 | 显示全部楼层 |阅读模式
本帖最后由 cunfu2010 于 2017-1-17 14:51 编辑

如题,sheet1中A列为多种样式的日期格式(有规范的也有不规范的:有标准格式的、有5位数字的、有文本的、有数值的),如何用VBA代码实现最终规范的结果(C列)。谢谢!!!
最佳答案
2017-1-17 00:06
本帖最后由 today0427 于 2017-1-17 00:08 编辑

看看是否符合你的要求。
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-1-15 10:16 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, i&
  3. arr = Range("a1").CurrentRegion
  4. For i = 1 To UBound(arr)
  5.     If InStr(arr(i, 1), "-") Then
  6.         x = Split(arr(i, 1), "-")
  7.         arr(i, 1) = x(0) & x(1)
  8.     ElseIf Len(arr(i, 1)) > 6 Then arr(i, 1) = Left(arr(i, 1), 6)
  9.     ElseIf Left(arr(i, 1), 2) <> "19" Then arr(i, 1) = Year(arr(i, 1)) & Format(Month(arr(i, 1)), "00")
  10.     ElseIf Len(arr(i, 1)) < 6 Then arr(i, 1) = Left(arr(i, 1), 4) & Format(Mid(arr(i, 1), 5), "00")
  11.     End If
  12. Next
  13. Range("d1").Resize(UBound(arr)) = arr
  14. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-1-15 22:41 | 显示全部楼层
本帖最后由 cunfu2010 于 2017-1-15 22:43 编辑

谢谢,大部分实现了,但还有个别没有实现:如599行、628行、1370行、1758行等,前面几行是7位数的,1758行好像很正常,但实际上比较特殊,麻烦再给看看。

规范日期格式.rar

31.66 KB, 下载次数: 6

回复

使用道具 举报

发表于 2017-1-15 23:45 | 显示全部楼层
楼主你的数据源确实种类繁多我在二楼老师的基础上小小地改动一下,没仔细查看,你看看还有什么问题,结果显示在E列中,并且在F列写了个和你的结果进行比对的函数,基本咱俩差不多,有个别错误我感觉我的结果应该没错
  1. Sub Macro2()
  2. Dim arr, i&
  3. arr = Range("a1").CurrentRegion
  4. For i = 1 To UBound(arr)
  5.     If Len(arr(i, 1)) = 5 Then arr(i, 1) = Format(CDate(arr(i, 1)), "yyyy-mm-dd")
  6.     If InStr(arr(i, 1), "-") Or InStr(arr(i, 1), "/") Then
  7.         x = Split(arr(i, 1), IIf(InStr(arr(i, 1), "-"), "-", "/"))
  8.         arr(i, 1) = Format(x(0), "0000") & Format(x(1), "00")
  9.     ElseIf Len(arr(i, 1)) = 7 Then arr(i, 1) = Left(arr(i, 1), 4) & "0" & Mid(arr(i, 1), 5, 1)
  10.     ElseIf Len(arr(i, 1)) > 6 Then arr(i, 1) = Left(arr(i, 1), 6)
  11.     ElseIf Len(arr(i, 1)) < 6 Then arr(i, 1) = Left(arr(i, 1), 4) & Format(Mid(arr(i, 1), 5), "00")
  12.     End If
  13. Next
  14. Columns("e:e").Clear
  15. Range("e1").Resize(UBound(arr)) = arr
  16. End Sub
复制代码

规范日期格式.rar

46.57 KB, 下载次数: 5

回复

使用道具 举报

发表于 2017-1-16 02:50 | 显示全部楼层
还有,如果你的数据源还可能出现198079这种变态的年/月/日写法,那你告诉我,我得再给你加几句
回复

使用道具 举报

 楼主| 发表于 2017-1-16 11:10 | 显示全部楼层
today0427 发表于 2017-1-16 02:50
还有,如果你的数据源还可能出现198079这种变态的年/月/日写法,那你告诉我,我得再给你加几句

太感谢了,还真有这种情况,(6位或7位的就存在这种情况)需要进行判断,碰到这种情况最好是弹出信息框进行手动选择进行转换。麻烦您加上这种情况,谢谢!
回复

使用道具 举报

发表于 2017-1-16 11:41 | 显示全部楼层
A3单元格的数据源我修改了一下,你看看结果。再有其他状况出现,我就没戏唱了

规范日期格式.rar

46.81 KB, 下载次数: 3

回复

使用道具 举报

 楼主| 发表于 2017-1-16 15:59 | 显示全部楼层
today0427 发表于 2017-1-16 11:41
A3单元格的数据源我修改了一下,你看看结果。再有其他状况出现,我就没戏唱了

谢谢,很受教。基本解决的问题。但经过测试,还有一种情况是不是可以设置成手动选择最终输出结果:如628行(1976115)这种情况,可能是197601还有可能是197611,所以这种情况可以用手动选择是(Y)197601、否(N)197611
回复

使用道具 举报

发表于 2017-1-16 16:50 | 显示全部楼层
本帖最后由 today0427 于 2017-1-16 17:43 编辑

看看是不是你想要的结果,点是月取一位前面加0,点否月直接取两位

规范日期格式.rar

47.48 KB, 下载次数: 7

回复

使用道具 举报

 楼主| 发表于 2017-1-16 23:04 | 显示全部楼层
today0427 发表于 2017-1-16 16:50
看看是不是你想要的结果,点是月取一位前面加0,点否月直接取两位

谢谢!经测试,是不是可以对所有7位的全部提示转换,而是先判断7位中的第5、6如果大于12的则肯定是yyyymmdd格式的,如何小于等于12则进行判断:是yyyy0mdd还是yyyymm0d两种之一。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 13:47 , Processed in 0.698880 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表