VBA是Visual Basic for Applications的缩写,是一种应用程序编程语言,主要用于自动化Microsoft Office应用程序中的任务和操作。在处理EXCEL数据的过程中,VBA比函数更加强大,他可以轻松的实现跨表、跨工作簿的操作,并且可以以多种方式灵活的选取数据。同时,chatgpt也能提供VBA代码,因此,利用chatgpt辅助VBA编程能够极大的提升工作效率。
在工作中,笔者需要需要将员工的绩效工作簿与出勤工作簿匹配,给全勤者加分,同时要插入批注体现加分项。
在向GPT提供提示词的时候,要尽可能的准确完整,我们提供的信息最好包括工作簿、工作的名字,数据的范围,最好用EXCEL提供的标注来描述要处理的行列关系。
下面简要介绍一下代码的编写思路,供大家参考。
首先是选择当前工作表,这里的A列是姓名列,用来匹配数据,同时去除表头区域。
Set scoreSheet = ThisWorkbook.Worksheets("运行积分统计表")
scoreLastRow = scoreSheet.Cells(Rows.Count, "A").End(xlUp).Row
Set scoreNameRange = scoreSheet.Range("A3:A" & scoreLastRow)
然后打开文件夹中的“全勤”工作簿,这里的B是姓名列,同样要跳开表头区域。
'要打开的工作簿
Set attendanceWorkbook = Workbooks.Open(ThisWorkbook.Path & "\全勤.xlsm")
' 要打开的工作表
Set attendanceSheet = attendanceWorkbook.Worksheets("Sheet1")
attendanceLastRow = attendanceSheet.Cells(Rows.Count, "B").End(xlUp).Row
Set attendanceNameRange = attendanceSheet.Range("B2:B" & attendanceLastRow)
然后是最为关键的循环部分,代码通过循环遍历运行积分统计表中的所有人员,对于每个人员,它会先从运行积分统计表中获取该人员的姓名和成绩,然后通过姓名在全勤表中查找对应的行,获取该人员的月度全勤加分,使用 Find 方法查找当前人员的姓名,xlWhole 是一个常量,表示按完全匹配方式查找。如果该人员存在于考勤表中,且月度全勤加分不为空,则将月度全勤加分加到该人员的运行积分统计表上,并在对应成绩单元格中添加一条注释,注明该人员获得了月度全勤加分。在添加注释的时候要区分原来已有注释的内容,和没有注释的内容。
运行积分统计表中的T列是员工该月积分,全勤表的第三列则是全勤加分情况,这个例子中,全勤加三分。
For Each scoreCell In scoreNameRange
'循环便利员工该月积分列
name = scoreCell.Value
score = scoreCell.Offset(0, 19).Value + 3 ' T列
' 在全勤表上找到相应的行
Set attendanceCell = attendanceNameRange.Find(What:=name, LookAt:=xlWhole)
' 如果在全勤表上找到此人,并且他们的分数不为空
If Not attendanceCell Is Nothing And Not IsEmpty(attendanceCell.Offset(0, 1).Value) Then
' 获取全勤分
attendanceScore = attendanceCell.Offset(0, 2).Value ' 第三列
' 将出勤分数添加到积分表
scoreCell.Offset(0, 19).Value = score + attendanceScore
' 检查单元格是否已有注释
If Not scoreCell.Offset(0, 19).Comment Is Nothing Then
' 获取现有注释文本
commentText = scoreCell.Offset(0, 19).Comment.Text
' 添加新注释
commentText = commentText & Chr(10) & "月度全勤+3"
' 更新注释内容
scoreCell.Offset(0, 19).Comment.Text commentText
Else
' 添加全勤分
scoreCell.Offset(0, 19).AddComment "月度全勤+3"
scoreCell.Offset(0, 19).Comment.Shape.TextFrame.Characters.Text = "月度全勤+3"
End If
End If
Next scoreCell
最后是保存数据。
attendanceWorkbook.Save
attendanceWorkbook.Close