Суппродукт в макросе - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь создать макрос, используя функцию SUMPRODUCT вместе с SUMIF.но когда я запускаю макрос, я получаю…

ошибка времени выполнения 13.

Я пытался сделать ту же функцию просто в ячейке, похожей на эту.

=SUMPRODUCT(SUMIF(B2:B3,K15:K18,L15:L18))

, и он отлично работает, поэтому я знаю, что концепция доказана.

Sub GrandTotal() 'Finds the last non-blank cell in a single row or column
    Dim lRow As Long
    Dim lCol As Long
    Dim GrandTotal As Variant
    Dim MyRg1 As Variant
    Dim MyRg2 As Variant
    Dim MyRg3 As Variant

    'Find the last non-blank cell in column A(1)
    lRow = Cells(Rows.Count, 1).End(xlUp).Row

    'Find the last non-blank cell in row 1
    lCol = Cells(1, Columns.Count).End(xlToLeft).Column

    MsgBox "Last Row: " & lRow & vbNewLine & _
           "Last Column: " & lCol

    'set range
    Set MyRg1 = Range("B2:B3")
    'set criteria
    Set MyRg2 = Range("$K$15:$K$18")
    'set sum range
    Set MyRg3 = Range("$L$15:$L$18")

    For Each cell In Range(Cells(lRow, 2), Cells(lRow, lCol))
        GrandTotal = WorksheetFunction.SumProduct(WorksheetFunction.SumIf(MyRg1, MyRg2, MyRg3))
        cell.Value = GrandTotal
    Next cell  
End Sub

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

надеюсь, что какая-то добрая душа может помочь

Ответы [ 4 ]

2 голосов
/ 23 июня 2019

Во-первых, каждая переменная, которой назначается объект Range, может быть объявлена ​​как Range, а не Variant.Кроме того, диапазоны, которые передаются в SUMIF, не кажутся правильными.Первый аргумент или диапазон критериев должен быть того же размера, что и третий аргумент или диапазон суммы.Поэтому я собираюсь предположить, что диапазоны, назначенные для MyRg1 и MyRg2, должны быть наоборот.Итак, для начала у нас должно быть следующее ...

Dim MyRg1 As Range
Dim MyRg2 As Range
Dim MyRg3 As Range

'set criteria range
Set MyRg1 = Range("$K$15:$K$18")

'set criteria
Set MyRg2 = Range("B2:B3")

'set sum range
Set MyRg3 = Range("$L$15:$L$18")

Во-вторых, вы не сможете использовать WorksheetFunction.Sumproduct таким образом.Однако вы можете использовать метод Evaluate.

GrandTotal = Evaluate("SUMPRODUCT(SUMIF(" & MyRg1.Address & "," & MyRg2.Address & "," & MyRg3.Address & "))")

Обратите внимание, что метод Evaluate имеет ограничение.Он не принимает более 255 символов.В любом случае, поскольку вы хотите перенести результат в ячейку, вы можете сначала ввести фактическую формулу в ячейку, а затем преобразовать ее в значение ...

With cell
    'enter the formula in the current cell
    .Formula = "=SUMPRODUCT(SUMIF(" & MyRg1.Address & "," & MyRg2.Address & "," & MyRg3.Address & "))"
    'convert the formula into a value
    .Value = .Value
End With

Надеюсь, это поможет!

0 голосов
/ 25 июня 2019

После того, как ваша функция заработает, вы можете включить Macro Recorder, щелкнуть ячейку с нужной вам функцией, нажать F2 и нажать Enter. У вас будет VBA, который делает то, что вы хотите.

0 голосов
/ 24 июня 2019

Это было бы неплохо для ConvertFormula , поскольку вы успешно построили формулу в Excel, вам просто нужен VBA для генерации значения.Обратите внимание, что convertformula не может обрабатывать формулы длиной более 255 символов.

Вот как это можно применить.Это

Sub heresExample()

'formula with the cell in exitance
Dim fCell As Range
Set fCell = Range("G10") 'set this up with a formula that works for 
   'if you were to copy paste formula.



'Your original code modified
Dim cell As Range
For Each cell In Range(Cells(lRow, 2), Cells(lRow, lCol)).Cells

        'Takes the formula and applies the value if from that exact cell.
        '(you don't really need grand total)
        GrandTotal = Evaluate(Application.ConvertFormula(fCell.Formula2R1C1, xlR1C1, xlA1, , cell))

        cell.Value = GrandTotal
Next cell


End Sub
0 голосов
/ 23 июня 2019

Ошибка 13 - ошибка несоответствия типов.Я посмотрел документацию WorksheetFunction.SumIf .В нем говорится, что первый аргумент должен иметь тип Range, а второй и третий - вариант.Я не могу проверить сейчас, но попробуйте объявить MyRg1 как Range.

...