ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 帮忙给解一下惑

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-26 14:06 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub test()
Application.ScreenUpdating = False  
Application.DisplayAlerts = False   
arr = Sheets(1).UsedRange         
With Sheets(3)
    For i = 2 To UBound(arr)      
        a = Split(arr(i, 4))        
        rq = Day(a(0))            
        If rq > rq1 Then rq1 = rq1 + 1
            If rq1 > 16 Then
                If C = 0 Then
                    r1 = n
                    n = 0
                End If
                C = 3
            End If
         If arr(i, 2) <> s Then
             If s <> "" Then
                r2 = IIf(r1 > n, r1, n)
                .Cells(r, 1).Resize(r2 + 1, 9).Borders.LineStyle = xlContinuous
                .Cells(r + r2 + 1, 1).Resize(12, 1) = Application.Transpose(Array("全月应出勤天数:天", "实际出勤天数:天", "正常月休天数:天", "休存假天数:天", "休年假天数:天", "事假天数:天", "病假天数:天", "夜班天数:个", "全月加班小时:小时", "剩余年假天数:天", "剩余存假:天", "确认无误后请签名:"))
             End If
             s = arr(i, 2)
             C = 0
             n = 0
             r = .[A65536].End(3).Row + 4
             .Cells(r, 1).Resize(1, 9) = [{"部门","姓名","考勤号码","日期","时间","备注","日期","时间","备注"}]
             rq1 = 1
        End If
        For j = rq1 To rq
            If j > 16 Then
                If C = 0 Then
                    r1 = n
                    n = 0
                End If
                C = 3
            End If
            n = n + 1
            .Cells(r + n, 1) = arr(i, 1)
            .Cells(r + n, 2) = arr(i, 2)
            .Cells(r + n, 3) = arr(i, 3)
            .Cells(r + n, 4 + C) = DateValue(Format(a(0), "YYYY/M/") & j)
        Next
        .Cells(r + n, 5 + C) = a(1)
        rq1 = rq
    Next
    r2 = IIf(r1 > n, r1, n)
    .Cells(r, 1).Resize(r2 + 1, 9).Borders.LineStyle = xlContinuous
    .Cells(r + r2 + 1, 1).Resize(12, 1) = Application.Transpose(Array("全月应出勤天数:天", "实际出勤天数:天", _
        "正常月休天数:天", "休存假天数:天", "休年假天数:天", "事假天数:天", "病假天数:天", "夜班天数:个", _
        "全月加班小时:小时", "剩余年假天数:天", "剩余存假:天", "确认无误后请签名:"))
     For j = r2 + r + 1 To 4 Step -1
         If .Cells(j, 4) <> "" And .Cells(j, 4) = .Cells(j - 1, 4) Then .Cells(j - 1, 4).Resize(2).Merge
         If .Cells(j, 7) <> "" And .Cells(j, 7) = .Cells(j - 1, 7) Then .Cells(j - 1, 7).Resize(2).Merge
     Next
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

这是“半百”帮我写的代码,能够完美的运行。有些地方我有些疑惑, If rq > rq1 Then rq1 = rq1 + 1 这行代码中rq在If语句之前已经赋值,rq1没有赋值,而是在后面的代码中才出现赋值。我不明白为什么 If rq > rq1 Then rq1 = rq1 + 1这句代码还能运行。后面的s,c也存在相同的疑惑

TA的精华主题

TA的得分主题

发表于 2023-4-26 15:39 | 显示全部楼层
解惑还是找原作者吧,他最有发言权。

TA的精华主题

TA的得分主题

发表于 2023-4-26 15:41 | 显示全部楼层
F8运行,看看rq1 初始值,你或许就明白了

TA的精华主题

TA的得分主题

发表于 2023-4-26 16:48 | 显示全部楼层
If rq > rq1 Then rq1 = rq1 + 1

这句代码,当 rq > rq1 成立时,执行rq1 = rq1 + 1;不成立时,不进行操作。
假定rq=1,rq1的初始值是0,执行这句代码的时候,不对rq1的值进行改动。后面的代码对rq1赋值3,循环回来执行到这句代码的时候,执行rq1 = rq1 + 1。

大约就是这个意思。

TA的精华主题

TA的得分主题

发表于 2023-4-27 15:10 | 显示全部楼层
If rq > rq1 Then rq1 = rq1 + 1 , rq1用来记录出现了多少个日期,比如1号第一次打卡,rq=1 , rq1还没赋值,可以默认为0,小于rq,那么 rq1 = rq1 + 1后, rq1 =1,第二次rq还是1(1号那天打了几次卡),rq1不变,还是1。第三次打卡是4号(2号3号没有打卡出勤),则rq=4,大于rq1,那么 rq1 = rq1 + 1后rq1=2,后边For j = rq1 To rq循环,即从2 到4,添加了2号3号的打卡空白记录,同时输出4号第一次打卡记录。rq1的作用就是添加没有打卡的日期。
s是记录员工姓名的,程序运行之初没有给它赋值,什么都不是,当然,你可以默认为等于0,如果与数字比大小的话,或等于"",如果与字符串比较的话。每一次(包括第一次)出现新的姓名时,s都不等于arr(i, 2),那么就要新增一个区域来处理该姓名的记录,然后s = arr(i, 2),记录下这个姓名,下边再出现这个姓名时,就一直在该区域中记录便不会新增区域,直到再出现新的姓名,再新增区域,如此循环。
实际上,相当于在For i = 2 To UBound(arr)前边,少写了rq1 = 0, s ="", c=0,这样的给变量赋初始值的语句,如果写上了,可能你就没有这样的疑惑了吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-28 08:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
多谢半百的解释。我现在只是对VBA很感兴趣,想学习一下,水平连入门都算不上。真想加你为好友,无奈新人权限有限。只能在这里表示感谢了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 05:21 , Processed in 0.033610 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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