ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 392|回复: 15

求助:日期拆分并统一日期格式

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-12 16:45 | 显示全部楼层 |阅读模式
EXCEL文件中,B列为日期列,但部分行的B列出现出类似合并格式,如“9月19、26日、10月10日”,“12月12、17、19日”和“9月21日、11月23日”格式,现需要拆分单独行,如果B列出现"9月19、26日、10月10日”,“12月12、17、19日”和“9月21日、11月23日”等类似格式,则在下方插入行,拆分B列内容为每一天,其他列内容不变,B列要求的格式是“YYYY-MM-DD”,使用VBA生成在另一工作表。

image.png

测试0812.rar

20.64 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2024-8-12 17:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请测试代码

0812.rar

92.71 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2024-8-12 18:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
WPS里的JSA练习一下——


微信截图_20240812182625.png


240812_测试0812.rar

32.09 KB, 下载次数: 7

用WPS打开并启用宏

TA的精华主题

TA的得分主题

发表于 2024-8-12 21:55 | 显示全部楼层
关键字:iif
GIF 2024-08-12 21-54-00.gif

limonet.zip

31.01 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2024-8-12 21:55 | 显示全部楼层
Sub limonet()
    Dim Arr As Variant, Brr(1 To 999, 1 To 3) As Variant, h%, i%, j%, ArrTmp As Variant
    Arr = Range("A2:C9")
    For i = 1 To UBound(Arr)
        h = h + 1
        If Not IsDate(Arr(i, 2)) Then
            ArrTmp = Split(Arr(i, 2), "、")
            For j = 0 To UBound(ArrTmp)
                Brr(h + j, 1) = Arr(i, 1): Brr(h + j, 3) = Arr(i, 3)
                If ArrTmp(j) Like "*月*" Then
                    Brr(h + j, 2) = CDate("2024年" & IIf(ArrTmp(j) Like "*日", ArrTmp(j), ArrTmp(j) & "日"))
                Else
                    Brr(h + j, 2) = CDate("2024年" & Left(Arr(i, 2), InStr(Arr(i, 2), "月")) & IIf(ArrTmp(j) Like "*日", ArrTmp(j), ArrTmp(j) & "日"))
                End If
            Next j
            h = h + j - 1
        Else
            Brr(h, 1) = Arr(i, 1): Brr(h, 2) = Arr(i, 2): Brr(h, 3) = Arr(i, 3)
        End If
    Next i
    Range("H2").Resize(h, 3) = Brr
End Sub

TA的精华主题

TA的得分主题

发表于 2024-8-12 21:58 | 显示全部楼层
Sub limonet()
    Dim Arr As Variant, Brr(1 To 999, 1 To 3) As Variant, h%, i%, j%, ArrTmp As Variant
    Arr = Range("A2:C9")
    For i = 1 To UBound(Arr)
        h = h + 1
        If Not IsDate(Arr(i, 2)) Then
            ArrTmp = Split(Arr(i, 2), "、")
            For j = 0 To UBound(ArrTmp)
                Brr(h + j, 1) = Arr(i, 1): Brr(h + j, 3) = Arr(i, 3)
                If ArrTmp(j) Like "*月*" Then
                    Brr(h + j, 2) = CDate("2024年" & ArrTmp(j) & IIf(ArrTmp(j) Like "*日", Null, "日"))
                Else
                    Brr(h + j, 2) = CDate("2024年" & Left(Arr(i, 2), InStr(Arr(i, 2), "月")) & ArrTmp(j) & IIf(ArrTmp(j) Like "*日", Null, "日"))
                End If
            Next j
            h = h + j - 1
        Else
            Brr(h, 1) = Arr(i, 1): Brr(h, 2) = Arr(i, 2): Brr(h, 3) = Arr(i, 3)
        End If
    Next i
    Range("H2").Resize(h, 3) = Brr
End Sub

TA的精华主题

TA的得分主题

发表于 2024-8-12 22:51 | 显示全部楼层
  1. Sub test()
  2. Dim reGxp1 As Object, reGxp2 As Object, Arr, i&, j&, tmPobj As Object, jL&, tmPstr$, Trr, Mstr$
  3. Dim mRow&, Brr(1 To 100000, 1 To 3)
  4. On Error Resume Next
  5. Arr = Sheet1.[a1].CurrentRegion
  6. Set reGxp1 = CreateObject("vbScript.regExp")
  7. reGxp1.Global = True
  8. reGxp1.Pattern = "(\d+)月(\d+)日"
  9. Set reGxp2 = CreateObject("vbScript.regExp")
  10. reGxp2.Global = True
  11. reGxp2.Pattern = "(\d+)月((\d+)(、(\d+))*)"
  12. jL = 0
  13. For i = 2 To UBound(Arr, 1)
  14.     If IsDate(Arr(i, 2)) Then
  15.         jL = jL + 1
  16.         For j = 1 To 3
  17.             Brr(jL, j) = Arr(i, j)
  18.         Next j
  19.     Else
  20.         If reGxp1.test(Arr(i, 2)) Then
  21.             Set tmPobj = reGxp1.Execute(Arr(i, 2))
  22.             For Each m In tmPobj
  23.                 jL = jL + 1
  24.                 Brr(jL, 1) = Arr(i, 1): Brr(jL, 3) = Arr(i, 3)
  25.                 Brr(jL, 2) = DateValue(2024 & "-" & m.submatches(0) & "-" & m.submatches(1))
  26.             Next m
  27.             Arr(i, 2) = reGxp1.Replace(Arr(i, 2), "")
  28.         End If
  29.         If reGxp2.test(Arr(i, 2)) Then
  30.             Set tmPobj = reGxp2.Execute(Arr(i, 2))
  31.             For Each m In tmPobj
  32.                 Mstr = m.submatches(0)
  33.                 tmPstr = m.submatches(1)
  34.                 Trr = Split(tmPstr, "、")
  35.                 For k = 0 To UBound(Trr)
  36.                     If IsNumeric(Trr(k)) Then
  37.                         jL = jL + 1
  38.                         Brr(jL, 1) = Arr(i, 1): Brr(jL, 3) = Arr(i, 3)
  39.                         Brr(jL, 2) = DateValue(2024 & "-" & Mstr & "-" & Trr(k))
  40.                     End If
  41.                 Next k
  42.             Next m
  43.         End If
  44.     End If
  45. Next i
  46. With Sheet1
  47.     .Range("F:H").ClearFormats
  48.     .[f1:h1] = Arr
  49.     .[g2].Resize(jL, 1).NumberFormatLocal = "yyyy-mm-dd"
  50.     .[f2].Resize(jL, 3) = Brr
  51. End With
  52. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-13 09:54 | 显示全部楼层

这个好象跟我的要求不一样哦

TA的精华主题

TA的得分主题

发表于 2024-8-13 10:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
maihh2001 发表于 2024-8-13 09:54
这个好象跟我的要求不一样哦

好吧,看来色才是您的需求。

TA的精华主题

TA的得分主题

发表于 2024-8-13 10:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
参与一下
  1. Sub tt()
  2.     Dim ar, br, m%, i%, j%, r%, t, s
  3.     ar = Sheet1.[a1].CurrentRegion
  4.     ReDim br(1 To 100, 1 To 3)
  5.     r = 1
  6.     For i = 1 To UBound(ar)
  7.         If InStr(ar(i, 2), "、") > 0 Then
  8.             t = Split(ar(i, 2), "、")
  9.             For m = 0 To UBound(t)
  10.                 If InStr(t(m), "月") > 0 Then
  11.                     s = Split(t(m), "月")(0)
  12.                     If InStr(t(m), "日") = 0 Then t(m) = t(m) & "日"
  13.                 ElseIf InStr(t(m), "日") = 0 Then
  14.                     t(m) = s & "月" & t(m) & "日"
  15.                 ElseIf InStr(t(m), "日") > 0 Then
  16.                     t(m) = s & "月" & t(m)
  17.                 End If
  18.                 br(r, 1) = ar(i, 1)
  19.                 br(r, 2) = Format(t(m), "yyyy/mm/dd")
  20.                 br(r, 3) = ar(i, 3)
  21.                 r = r + 1
  22.             Next m
  23.         Else
  24.             For j = 1 To UBound(ar, 2)
  25.                 br(r, j) = ar(i, j)
  26.             Next j
  27.             r = r + 1
  28.         End If
  29.     Next i
  30.     Sheet1.[f18].Resize(UBound(br), 3) = br
  31. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 12:26 , Processed in 0.043934 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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