[原创] EXCEL表格中使用VBA提取数据

阿炳哥 阿炳哥 2022.6.29 14:02 浏览(2909) 评论 (0)

版权声明:本文为博主原创文章,未经博主允许不得转载。

表格如下:

如上图可以看到表格是一份考勤汇总表,现在需要核对所有人的考勤数据,如某个人的实际总工时、标准出勤天数、加班小时等。如果就按这个表格由上到下进行核对,那工作量非常大,而且容易出错。有没办法可以把里面每个员工的工号、姓名、部门、考勤统计数据提取出来,如下图,那效率会高很多,且不容易出错。

对于这个需求,如果使用Excel公式是很难实现的。如果用VBA那会容易得多。

思路很简单,只要把所有单元格都循环一遍,把想要的数据取出来即可。

点主选项卡上的“开发工具”,点”Visual Basic”

点当前表格所在工程,插入一个“模块”。

把以下代码粘贴到新建的模块中

Option Explicit

Public Sub 考勤数据提取()

Dim ScoreSheet As Worksheet
Dim rowNo, n As Integer

Dim sheetName As String
Dim Sht As Worksheet

Dim newrow As Integer
newrow = 0

Dim 工号, str As String
Dim 姓名 As String
Dim 部门 As String
Dim 职位 As String
Dim 实际总工时 As String
Dim 标准出勤天数 As String
Dim 实际出勤天数 As String
Dim 加班小时 As String
Dim 六日加班小时 As String
Dim 法定加班 As String
Dim 停工时数 As String
Dim 事假 As String
Dim 年假 As String
Dim 法定假 As String
Dim 病假 As String
Dim 婚产丧有薪假 As String
Dim 迟到早退分钟 As String
Dim 迟到次数 As String
Dim 旷工时数 As String
Dim 疫情放假 As String
Dim 病毒休假 As String
sheetName = InputBox("请输入工作表名称")

If Len(sheetName) <> 0 Then

    Set Sht = Worksheets.Add(after:=Worksheets(Worksheets.Count))
    Sht.Name = sheetName   
    Sht.Cells(1, 1).Value = "工号"
    Sht.Cells(1, 2).Value = "姓名"
    Sht.Cells(1, 3).Value = "部门"
    Sht.Cells(1, 4).Value = "职位"
    Sht.Cells(1, 5).Value = "实际总工时"
    Sht.Cells(1, 6).Value = "标准出勤天数"
    Sht.Cells(1, 7).Value = "实际出勤天数"
    Sht.Cells(1, 8).Value = "加班小时"
    Sht.Cells(1, 9).Value = "六日加班小时"
    Sht.Cells(1, 10).Value = "法定加班"
    Sht.Cells(1, 11).Value = "停工时数"
    Sht.Cells(1, 12).Value = "事假"
    Sht.Cells(1, 13).Value = "年假"
    Sht.Cells(1, 14).Value = "法定假"
    Sht.Cells(1, 15).Value = "病假"
    Sht.Cells(1, 16).Value = "婚产丧有薪假"   
    Sht.Cells(1, 17).Value = "迟到早退分钟"
    Sht.Cells(1, 18).Value = "迟到次数"   
    Sht.Cells(1, 19).Value = "旷工时数"
    Sht.Cells(1, 20).Value = "疫情放假"
    Sht.Cells(1, 21).Value = "病毒休假"    
    Set ScoreSheet = Sheets("Sheet1")  
    rowNo = 1 '表格行数
    Do                  
        str = ScoreSheet.Cells(rowNo, 1).Value                
            If (str Like "*工号*") Then            
                工号 = Mid(str, 4, Len(str))
                姓名 = Mid(ScoreSheet.Cells(rowNo, 6).Value, 4, Len(ScoreSheet.Cells(rowNo, 6).Value))
                部门 = Mid(ScoreSheet.Cells(rowNo, 13).Value, 4, Len(ScoreSheet.Cells(rowNo, 13).Value))
                职位 = Mid(ScoreSheet.Cells(rowNo, 18).Value, 4, Len(ScoreSheet.Cells(rowNo, 18).Value))
            End If
            If (str Like "*实际总工时*") Then
                实际总工时 = ScoreSheet.Cells(rowNo + 1, 1).Value
                标准出勤天数 = ScoreSheet.Cells(rowNo + 1, 2).Value
                实际出勤天数 = ScoreSheet.Cells(rowNo + 1, 4).Value
                加班小时 = ScoreSheet.Cells(rowNo + 1, 6).Value
                六日加班小时 = ScoreSheet.Cells(rowNo + 1, 8).Value
                法定加班 = ScoreSheet.Cells(rowNo + 1, 10).Value
                停工时数 = ScoreSheet.Cells(rowNo + 1, 11).Value
                事假 = ScoreSheet.Cells(rowNo + 1, 12).Value
                年假 = ScoreSheet.Cells(rowNo + 1, 13).Value
                法定假 = ScoreSheet.Cells(rowNo + 1, 14).Value
                病假 = ScoreSheet.Cells(rowNo + 1, 15).Value
                婚产丧有薪假 = ScoreSheet.Cells(rowNo + 1, 16).Value              
                迟到早退分钟 = ScoreSheet.Cells(rowNo + 1, 18).Value
                迟到次数 = ScoreSheet.Cells(rowNo + 1, 20).Value               
                旷工时数 = ScoreSheet.Cells(rowNo + 1, 21).Value                
                疫情放假 = ScoreSheet.Cells(rowNo + 1, 22).Value
                病毒休假 = ScoreSheet.Cells(rowNo + 1, 23).Value
                               
                Sht.Range("A2").Offset(newrow, 0).NumberFormat = "@"
                Sht.Range("A2").Offset(newrow, 0).Value = 工号
                Sht.Range("A2").Offset(newrow, 1).Value = 姓名
                Sht.Range("A2").Offset(newrow, 2).Value = 部门
                Sht.Range("A2").Offset(newrow, 3).Value = 职位
                Sht.Range("A2").Offset(newrow, 4).Value = 实际总工时
                Sht.Range("A2").Offset(newrow, 5).Value = 标准出勤天数
                Sht.Range("A2").Offset(newrow, 6).Value = 实际出勤天数
                Sht.Range("A2").Offset(newrow, 7).Value = 加班小时
                Sht.Range("A2").Offset(newrow, 8).Value = 六日加班小时
                Sht.Range("A2").Offset(newrow, 9).Value = 法定加班
                Sht.Range("A2").Offset(newrow, 10).Value = 停工时数
                Sht.Range("A2").Offset(newrow, 11).Value = 事假
                Sht.Range("A2").Offset(newrow, 12).Value = 年假
                Sht.Range("A2").Offset(newrow, 13).Value = 法定假
                Sht.Range("A2").Offset(newrow, 14).Value = 病假
                Sht.Range("A2").Offset(newrow, 15).Value = 婚产丧有薪假               
                Sht.Range("A2").Offset(newrow, 16).Value = 迟到早退分钟
                Sht.Range("A2").Offset(newrow, 17).Value = 迟到次数               
                Sht.Range("A2").Offset(newrow, 18).Value = 旷工时数               
                Sht.Range("A2").Offset(newrow, 19).Value = 疫情放假
                Sht.Range("A2").Offset(newrow, 20).Value = 病毒休假               
                newrow = newrow + 1
            End If
            If (str Like "*上班日期*") Then
                rowNo = rowNo + 1 '因上下两行合并,避免跳出循环
            End If
        rowNo = rowNo + 1
    Loop While Len(ScoreSheet.Cells(rowNo, 1).Value) <> 0
End If
End Sub


点“保存”

“运行”程序

为提取出来的数据起一个工作表名,如“汇总”,点“确定”,excel会自动生成一个名字为“汇总”工作表。如下图

如果这个这个数据提取的工作经常要用,excel还支持把VBA功能做成一个加载项放到EXCEL工具栏中。操作如下:

“保存类型”选Excel加载宏(*.xlamexcel会自动跳到以下系统用户目录下的C:\User\*\AppData\Roaming\Microsoft\AddIns.输入一个文件名,点保存。

接下来点“Excel加载项”,

选“浏览”

 

选刚保存的“.xlam”文件。点“打开”。

然后你就会发现Excel工具栏上多了一项我的工具。

本文链接 https://www.mangoxo.com/blog/ko8y2rx2 版权所有,转载请保留地址链接,感谢!

阿炳哥 关注
  • 0 动态
  • 0 相册
  • 0 粉丝
  • 0 获赞