2013-06-20 4 views
3

У меня есть следующие значения в таблице: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   | 
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?

Спасибо за вашу помощь

+1

Вы думали про Сводная таблица? –

+0

Через VBA? Я предпочел бы сделать это как скрипт – r1pster

+0

нет, просто на другом листе, используя исходный лист в качестве источника данных. Просто кажется слишком сложным сделать это как скрипт. Альтернативно используйте формулу в следующем столбце, в котором вычисляется количество страниц для каждой строки. –

ответ

1

Читайте в колонках E: G, а не только Е и использовать второе измерение этого массива для добавления страниц * копия, а не добавление 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 
1

Можно использовать формулу массива, чтобы получить клетки заселенных:

={SUMPRODUCT(IF($A$2:$A$6=$F2;1;0);$B$2:$B$6;$C$2:$C$6)} 

формула вставляется из формулы окна с Ctrl-Shift-Enter. Скошенные скобки вставлены excel, а не пользователем. Формула может быть скопирована в другом месте.

enter image description here

Смежные вопросы