Excel VBA:脚本编写。字典计算

Excel VBA:脚本编写。字典计算,excel,vba,scripting.dictionary,Excel,Vba,Scripting.dictionary,我在电子表格中有以下值: Printer Name | Pages | Copies HP2300 | 2 | 1 HP2300 | 5 | 1 Laser1 | 2 | 2 Laser1 | 3 | 4 HP2300 | 1 | 1 如何获得每台打印机上打印的总页数(页数*份数),如下所示: Printer Name | TotalPages | HP2300 | 8

我在电子表格中有以下值:

Printer Name | Pages | Copies
HP2300       | 2     | 1
HP2300       | 5     | 1
Laser1       | 2     | 2
Laser1       | 3     | 4
HP2300       | 1     | 1
如何获得每台打印机上打印的总页数(页数*份数),如下所示:

Printer Name | TotalPages |
HP2300       | 8          |
Laser1       | 16         |
我设法创建了一个列表,统计打印机用于打印的次数:

Sub UniquePrints()

Application.ScreenUpdating = False
Dim Dict As Object
Set Dict = CreateObject("scripting.dictionary")
Dim varray As Variant, element As Variant

varray = Sheets("Prints").Range("E:E").Value
For Each element In varray
    If Dict.exists(element) Then
        Dict.Item(element) = Dict.Item(element) + 1
    Else
        Dict.Add element, 1
    End If
Next

Sheets("Stats").Range("D6").Resize(Dict.Count, 1).Value = _
    WorksheetFunction.Transpose(Dict.keys)
Sheets("Stats").Range("E6").Resize(Dict.Count, 1).Value = _
    WorksheetFunction.Transpose(Dict.items)

Application.ScreenUpdating = True
End Sub
如何计算每行打印的总页数(页数*份数)并将其保存在字典中,而不是仅添加1


感谢您的帮助

可以使用数组公式填充单元格:

={SUMPRODUCT(IF($A$2:$A$6=$F2;1;0);$B$2:$B$6;$C$2:$C$6)}
使用Ctrl-Shift-Enter键从“公式”窗口插入公式。卷曲括号由excel插入,而不是由用户插入。这个公式可以复制到其他地方


读入E:G列而不仅仅是E列,并使用该数组的第二个维度添加页面*副本,而不是添加1

Sub UniquePrints()

    Dim Dict As Object
    Dim vaPrinters As Variant
    Dim i As Long

    Set Dict = CreateObject("scripting.dictionary")

    vaPrinters = Sheets("Prints").Range("E2:G6").Value

    For i = LBound(vaPrinters, 1) To UBound(vaPrinters, 1)
        If Dict.exists(vaPrinters(i, 1)) Then
            Dict.Item(vaPrinters(i, 1)) = Dict.Item(vaPrinters(i, 1)) + (vaPrinters(i, 2) * vaPrinters(i, 3))
        Else
            Dict.Add vaPrinters(i, 1), vaPrinters(i, 2) * vaPrinters(i, 3)
        End If
    Next i

    Sheets("Stats").Range("D6").Resize(Dict.Count, 1).Value = _
        WorksheetFunction.Transpose(Dict.keys)
    Sheets("Stats").Range("E6").Resize(Dict.Count, 1).Value = _
        WorksheetFunction.Transpose(Dict.items)

End Sub

您是否考虑过使用VBA创建透视表?我宁愿把它当作脚本来做。不,只是在另一个工作表中使用原始工作表作为数据源。作为一个脚本似乎太复杂了。或者在下一列中使用计算每行页数的公式。扩展数组以覆盖其他两列,并使用(eg)
for r=1循环(arr,1)
页面计数和副本数将在“列”中数组的2和3:将它们相乘并将它们添加到字典中,而不是只添加一个。