Excel VBA, цикл, который суммирует, а затем подсчитывает заново с каждым новым значением - PullRequest
0 голосов
/ 08 октября 2018

Для каждого сотрудника в магазине было задание.Если сотрудник выполнил задание, у него есть «1» в столбце «Задание», прикрепленное к «Магазину».Я должен сложить все «1» для каждого магазина и проверить общий процент выполнения задач для каждого магазина.Пример, приведенный ниже:

Shop  Task
1002    0
1002    1
1002    0
1002    0
1002    0
1008    1
1008    1
1008    1
1008    1
etc...

Я не знаю, как создать цикл, который завершает сумму и процент , который изменяется с каждым изменением 'Shop' .Помощь высоко ценится.

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

Учитывая, как вы вводите свои данные (1 и 0), вы можете просто использовать сводную таблицу.

Перетащите Магазины в область строк и Задачи в область Значения дважды.Для первого экземпляра используйте SUM. Для% выполненного используйте AVERAGE

enter image description here

0 голосов
/ 08 октября 2018

Я сомневаюсь, что это на самом деле быстрее, чем SUMIF, но он собирает идентификаторы магазина, а также итоги за один проход.

sub shopTotals()

    dim i as long, arr as variant, dict as object

    set dict = createobject("scripting.dictionary")
    dict.comparemode = vbtextcompare

    with worksheets("sheet1")

        arr = .range(.cells(2, "A"), .cells(.rows.count, "B").end(xlup)).value2

        for i=lbound(arr, 1) to ubound(arr, 1)
            dict.item(arr(i, 1)) = dict.item(arr(i, 1)) + arr(i, 2)
        next i

        .cells(2, "D").resize(dict.count, 1) = application.transpose(dict.keys)
        .cells(2, "E").resize(dict.count, 1) = application.transpose(dict.items)

    end with

end sub

AVERAGEIF или COUNTIF могут получить другие статистические данные.

0 голосов
/ 08 октября 2018

Это пример цикла, как вы можете использовать объект словаря и вариантный массив.Иногда проще реализовать бизнес-логику в коде VBA на 100%.Вы можете делать все что угодно, зацикливая строки.Этот пример просто распечатывает массив [0]total,[1]=countIfOne values per Key.

   ' Tools/References: [x]Microsoft Scripting Runtime
    Public Sub sumShops()
        Dim ws As Worksheet
        Dim arr As Scripting.Dictionary
        Dim iRow As Long
        Dim val As String
        Dim item As Variant

        Set arr = New Scripting.Dictionary
        Set ws = Application.Worksheets("Shops")
        For iRow = 2 To ws.UsedRange.Rows.Count
            val = Trim(ws.Cells(iRow, 1)) ' 1001,1002,..
            If Not arr.Exists(val) Then
                ReDim item(0 To 1) As Long
                item(0) = 0 ' total count
                item(1) = 0 ' count if task=1
                Call arr.Add(val, item)
            Else
                item = arr.item(val)
            End If
            item(0) = item(0) + 1
            If ws.Cells(iRow, 2).Value = "1" Then item(1) = item(1) + 1 ' count task=1 rows
            ' we must reference array back to the dictionary key
            arr(val) = item
        Next

        ' Loop dictionary by keys and print an array(0..1)
        For iRow = 0 To arr.Count - 1
            val = arr.Keys(iRow)
            item = arr.item(val)
            Debug.Print val & "=" & item(0) & "," & item(1)
        Next
    End Sub
0 голосов
/ 08 октября 2018

Вы можете использовать проверку данных, чтобы выбрать магазин, с которым хотите работать, и sumifs () для расчета, см .: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...