[原创] [置顶] Windows 打印日志数据提取(Excel VBA 数据提取)

阿炳哥 阿炳哥 2022.6.29 11:55 浏览(1076) 评论 (0)

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

公司用一台windows server服务器作为打印服务器,开启打印日志记录之后,客户端打印操作都会在服务器上有记录。为了统计每个人每个月打印量(用纸量)需要将windows的日志提取出来汇总。具体的日志开启方式及导出方法这里就不赘述了,有需要的可以上网搜寻。

将日志导出为XML文档,用EXCEL打开之后是这个样子,圈出来的部份就是待会要提取的内容

 

要用VBA来提取数据,解决思路也很简单,将所有单元格从上到下循环一遍取出想要的内容即可。

点工具栏上的“开发工具“,点”visusl Basic.

如果“工具栏“上没有“开发工具“这一项。在” 工具栏“空白处点右键,选”自定义功能区,“

开发工具勾选上,工具栏上就会显示

打开”visusl Basic“之后点当时工作簿,点”右键““插入“”模块“

 

将以下代码复制黏贴到“模块“中

Option Explicit

Public Sub 打印记录数据提取()
Dim ScoreSheet As Worksheet
Dim n As Long
Dim sheetName As String
Dim Sht As Worksheet
Dim newrow As Long
newrow = 0

Dim PrintDate, str As String
Dim 打印时间 As Date
Dim 姓名 As String
Dim 电脑名称 As String
Dim 打印数量 As String

sheetName = InputBox("请输入工作表名称")

If Len(sheetName) <> 0 Then
    Set ScoreSheet = Sheets("Sheet1")
    Dim i, k, SystemTimeColumnNo, UserNameColumnNo, ComputerNameColumnNo, PrintCountColumnNo, KeywordColumnNo As Integer
    Dim Keyword As String
       
    i = 1
    k = 1
    Do
        Keyword = ScoreSheet.Cells(1, i).Value
        KeywordColumnNo = i
        i = i + 1
    Loop While Keyword <> "ns1:Keyword" '找出ns1:Keyword所在的列数
    
    For n = 1 To KeywordColumnNo
        If ScoreSheet.Cells(1, n).Value = "SystemTime" Then
        SystemTimeColumnNo = n '找出打印时间所在的列数
        End If
        If ScoreSheet.Cells(1, n).Value = "ns2:Param3" Then
        UserNameColumnNo = n '找出姓名所在的列数
        End If
        If ScoreSheet.Cells(1, n).Value = "ns2:Param4" Then
        ComputerNameColumnNo = n '找出电脑名称所在的列数
        End If
        If ScoreSheet.Cells(1, n).Value = "ns2:Param8" Then
        PrintCountColumnNo = n '找出打印数量所在的列数
        End If
    Next n

    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 = "打印数量"   
    Do                 
        str = ScoreSheet.Cells(k, KeywordColumnNo).Value                     
            If (str = "文档打印作业") Then
                PrintDate = ScoreSheet.Cells(k, 9).Value
                PrintDate = Format(Left(PrintDate, 10) + " " + Mid(PrintDate, 12, 8), "dd/mm/yy hh:mm:ss") '提取时间
                
                打印时间 = CDate(PrintDate) + TimeValue("08:00:00") '将格林威治时间改变成北京时间
                姓名 = ScoreSheet.Cells(k, UserNameColumnNo).Value
                电脑名称 = ScoreSheet.Cells(k, ComputerNameColumnNo).Value
                打印数量 = ScoreSheet.Cells(k, PrintCountColumnNo).Value
                               
                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 = 打印数量
                
                newrow = newrow + 1
            End If            
        k = k + 1
    Loop While Len(ScoreSheet.Cells(k, 1).Value) <> 0    
End If
End Sub

 

运行VBA程序

输入工作表名称点“确定“

Excel 生成一个新的工作表,结果正是我们想要的。

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

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