|
- Sub GenerateSummaryReport()
- Dim srcSheet As Worksheet, destSheet As Worksheet
- Dim lastRow As Long, i As Long, m As Long, rowIndex As Long
- Dim client, jobNumber As String, key
- Dim jobQty As Double, defectQty As Double, monthNum As Long
- Dim mainDict As Object, clientsDict As Object, jobDict As Object
- Dim result() As Variant, data As Variant, clients() As Variant
-
- Set srcSheet = ThisWorkbook.Worksheets("数据源") ' 原始数据所在工作表
- Set destSheet = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) ' 新建汇总表
- destSheet.Name = "汇总 结果"
- lastRow = srcSheet.Cells(srcSheet.Rows.Count, 1).End(xlUp).Row
-
- ' 初始化主字典
- Set mainDict = CreateObject("Scripting.Dictionary")
-
- ' 遍历原始数据
- For i = 2 To lastRow
- client = Left(Trim(srcSheet.Cells(i, 1).Value), 2)
- jobNumber = CStr(srcSheet.Cells(i, 3).Value)
- jobQty = CDbl(srcSheet.Cells(i, 2).Value)
- defectQty = CDbl(srcSheet.Cells(i, 5).Value)
-
- ' 处理日期
- If IsDate(srcSheet.Cells(i, 4).Value) Then
- monthNum = Month(CDate(srcSheet.Cells(i, 4).Value))
- Else
- monthNum = 0 ' 无效日期跳过
- End If
- If monthNum < 1 Or monthNum > 12 Then GoTo NextRow
-
- key = client & "|" & monthNum
-
- If Not mainDict.Exists(key) Then
- Set jobDict = CreateObject("Scripting.Dictionary")
- jobDict(jobNumber) = 1
- mainDict(key) = Array(jobDict, jobQty, defectQty)
- Else
- data = mainDict(key)
- Set jobDict = data(0)
- If Not jobDict.Exists(jobNumber) Then
- data(1) = data(1) + jobQty
- jobDict(jobNumber) = 1
- End If
- data(2) = data(2) + defectQty
- mainDict(key) = data
- End If
- NextRow:
- Next i
-
- ' 收集客户列表
- Set clientsDict = CreateObject("Scripting.Dictionary")
- For Each key In mainDict.Keys
- clientsDict(Split(key, "|")(0)) = 1
- Next
- clients = clientsDict.Keys
-
- ' 准备结果数组 (客户数*3行 x 14列)
- ReDim result(1 To 3 * clientsDict.Count, 1 To 14)
- rowIndex = 1
-
- For Each client In clients
- ' 客户名称
- result(rowIndex, 1) = client
- result(rowIndex + 1, 1) = client
- result(rowIndex + 2, 1) = client
-
- ' 指标类型
- result(rowIndex, 2) = "工单总数"
- result(rowIndex + 1, 2) = "不良总数"
- result(rowIndex + 2, 2) = "不良率"
-
- ' 填充月份数据
- For m = 1 To 12
- key = client & "|" & m
- If mainDict.Exists(key) Then
- data = mainDict(key)
- result(rowIndex, m + 2) = data(1) ' 工单数
- result(rowIndex + 1, m + 2) = data(2) ' 不良数
- result(rowIndex + 2, m + 2) = data(2) / data(1) ' 不良率
- Else
- result(rowIndex, m + 2) = 0
- result(rowIndex + 1, m + 2) = 0
- result(rowIndex + 2, m + 2) = 0
- End If
- Next m
- rowIndex = rowIndex + 3
- Next client
-
- ' 写入结果
- With destSheet
- .Cells.Clear
- .Range("A2").Resize(UBound(result, 1), UBound(result, 2)).Value = result
-
- ' 添加标题
- .Range("A1:B1").Value = Array("客户名称", "指标")
- For m = 1 To 12
- .Cells(1, m + 2).Value = m & "月"
- Next m
-
- ' 设置百分比格式
- For i = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
- If .Cells(i, 2).Value = "不良率" Then
- .Range(.Cells(i, 3), .Cells(i, 14)).NumberFormat = "0.00%"
- End If
- Next i
- .Columns.AutoFit
- End With
- End Sub
复制代码 |
-
-
|