VBA快速智能拆分日期

77 篇文章 6 订阅
56 篇文章 2 订阅
文章讲述了如何使用VBASubSplitDate函数处理Excel中的日期数据,包括不同格式的日期转换,筛选出大于等于5天的时间段,并提取起止日期。代码详细解析了日期处理过程和条件判断逻辑。
摘要由CSDN通过智能技术生成

实例需求:

  1. A列为待处理数据,日期有多种格式
  • 单个日期:6.16
  • 同月简写时间段:7.7-8,其含为7.7-7.8
  • 跨月时间段:5.29-6.2
  1. 现在需要将A列日期,按照如下规则筛选,并提取开始日期和结束日期,填写在B列和C列
  • 时间段(包含起止日期)大于等于5天
  • 如果没有符合条件的时间段,B列和C列留空
  • 如果有多个符合条件的时间段,提取最后一个,例如A2单元格中,5.15-19和5.29-6.2都符合条件,那么从5.29-6.2中提取起止日期

在这里插入图片描述

示例代码如下。

Sub SplitDate()
    Dim arrDT, arrDate, i As Long, j As Long
    Dim dDate1 As Date, dDate2 As Date, iMth As Long
    Const DT_FORMAT = "yyyy-mm-dd"
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        arrDT = Split(Cells(i, 1), ",")
        For j = UBound(arrDT) To 0 Step -1
            arrDate = Split(Replace(Replace(arrDT(j), "-", "|"), ".", "-"), "|")
            If UBound(arrDate) > 0 And IsDate(arrDate(0)) Then
                dDate1 = CDate(arrDate(0))
                iMth = Month(dDate1)
                If InStr(arrDate(1), "-") = 0 Then
                    arrDate(1) = iMth & "-" & arrDate(1)
                End If
                dDate2 = CDate(arrDate(1))
                If dDate2 - dDate1 >= 4 Then
                    Cells(i, 2) = Format(dDate1, DT_FORMAT)
                    Cells(i, 3) = Format(dDate2, DT_FORMAT)
                    Exit For
                End If
            End If
        Next
    Next
End Sub

【代码解析】
第5~23行代码循环遍历A列单元格处理数据。
第6行代码将原日期使用逗号拆分为单个时间段。
第7~22行代码倒序处理拆分后的时间段。
第8行代码将数据段再次拆分。首先将减号替换为竖线,然后将小数点替换为减号,最后使用数据作为分割符拆分为起止日期。多次替换的目的是为了将起止日期转换为y-m的格式,以便于后续处理。
第9行代码中UBound(arrDate) > 0说明时间段包含两个日期,否则为单日期。
第10行代码中将拆分后的开始日期字符串转换为日期数据,年份将使用当前日历年,例如:Cdate("5-2")的结果为2024/5/2
注意:本示例代码并不适用于计算跨年的日期间隔,例如12.30-1.2
第11行代码获取开始日期的月份。
第12行代码判断结束日期字符串中是否包含减号,如果不包含说明是简写格式,第13行在日期之前添加将添加月份和减号。
第15行代码将结束日期字符串转换为日期数据。
第16行代码判断日期间隔是否满足要求。
如果满足要求,第17~18行代码将开始日期和结束日期分别写入B列和C列。
第19行代码退出For循环。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值