VBA - Ошибка времени выполнения 13 Несоответствие типов с использованием WorksheetFunction.SumIFs - PullRequest
0 голосов
/ 06 марта 2020

Не могли бы вы посоветовать, как исправить следующий код, который использует SUMIFS? Мне удалось собрать их из множества источников, и я знаю, что с типами данных должно быть что-то не так.

Sub snap2020()

'Declare a variable
    Dim wsOpps As Worksheet, wsSnapshot As Worksheet
    Dim i As Integer, r As Integer
    Dim CatSnapShot As Range

    Dim SumRgn As Range 'The desired Sum Range
    Dim CrtRgn1 As Range 'Range applied to Criteria 1
    Dim Crt1 As Range 'Criteria 1
    Dim CrtRgn2 As Range 'Range applied to Criteria 2
    Dim Crt2 As Range 'Criteria 2
    Dim CrtRgn3 As Range 'Range applied to Criteria 3
    Dim Crt3 As Range 'Criteria 3

    Set SumRgn = ThisWorkbook.Sheets("Opps tracker 2020").Range("T1:T2000")
    Set CrtRgn1 = ThisWorkbook.Sheets("Opps tracker 2020").Range("C1:C2000")
    Set Crt1 = ThisWorkbook.Sheets("Snapshot").Range("$A$3:$A$19")
    Set CrtRgn2 = ThisWorkbook.Sheets("Opps tracker 2020").Range("K1:K2000")
    Set Crt2 = ThisWorkbook.Sheets("Snapshot").Range("$B$1:$K$1")
    Set CrtRgn3 = ThisWorkbook.Sheets("Opps tracker 2020").Range("J1:J2000")
    Set Crt3 = ThisWorkbook.Sheets("Snapshot").Range("$A$2")

    Set wsOpps = ThisWorkbook.Sheets("Opps tracker 2020")
    Set wsSnapshot = ThisWorkbook.Sheets("Snapshot")


'Set up Message Box
    If MsgBox("Update Snapshot?", vbYesNo + vbQuestion + vbDefaultButton2, "Opportunity Snapshot 2020") = vbNo Then
        Exit Sub
    End If

'Turn off events
    Application.EnableEvents = False

'Clear old data in Worksheet Snapshot
    wsSnapshot.Range("B3:K20").ClearContents

'Apply SUMIFs and Update data
    For i = 3 To 19
        For r = 2 To 11
            wsSnapshot.Cells(i, r) _
                = Application.WorksheetFunction.SumIfs(SumRgn, CrtRgn1, Crt1, CrtRgn2, Crt2, CrtRgn3, Crt3)
        Next r
    Next i
'Turn on events
    Application.EnableEvents = True

End Sub

Так что целью кода является создание снимка общего количество по модели на категорию в 2020, 2021, 2022, 2023 и т. д. Я хотел, чтобы результаты были включены в диапазоны:

  1. B3: K20 для 2020 года
  2. B22: K39 для 2021 года
  3. B41: K58 для 2022 года
  4. B60: K77 для 2023 года

Предположение SumIfs должно выглядеть следующим образом:

=SUMIFS('Opps tracker 2020'!T1:T2000, 'Opps tracker 2020'!C1:C2000, 'Snapshot'!A3:A19, 
'Opps tracker 2020'!K1:K2000, 'Snapshot'!B1:K1, 'Opps tracker 2020'!J1:J2000)
  • Диапазон суммы I ' Мне нравится столбец T на листе «Opps tracker 2020», который я ограничил только первыми 2000 строками для проверки
  • SUMIFs поиска соответствующей категории (столбец K) на листе «Opp tracker 2020», которая сопоставить категорию на листе «Снимок» (диапазон B1: K1)
  • SUMIFs выполняет поиск соответствующей модели (столбец C) на листе «Opp tracker 2020», которая соответствует модели в «снимке» лист (диапазон A3: A19 для 2020 года, A22: A38 для 2021 года, A41: A57 для 2022 года, A60: A76 для 2023 года)
  • Затем, наконец, SUMIFs должен удостовериться, что для расчета снимка снимка 2020 год будет 2020 Диапазон 2020 года и то же самое для других лет

Вот экран печати моего листа «Снимок»

enter image description here

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

Пожалуйста, посоветуйте, как решить эту проблему. Большое спасибо!

1 Ответ

0 голосов
/ 07 марта 2020

Помимо предоставления формулы, я переместил ваше окно сообщения в начало вашего макроса, поскольку все зависит от ответа пользователя.

И я также переместил назначение ваших таблиц перед назначением диапазонов сумм и критериев, чтобы вы могли использовать эти переменные таблицы при назначении диапазонов сумм и критериев и т. д. c.

Sub snap2020()

'Set up Message Box
    If MsgBox("Update Snapshot?", vbYesNo + vbQuestion + vbDefaultButton2, "Opportunity Snapshot 2020") = vbNo Then
        Exit Sub
    End If

'Declare a variable
    Dim wsOpps As Worksheet, wsSnapshot As Worksheet
    Dim i As Integer, r As Integer

    Set wsOpps = ThisWorkbook.Sheets("Opps tracker 2020")
    Set wsSnapshot = ThisWorkbook.Sheets("Snapshot")

    Dim SumRgn As Range 'The desired Sum Range
    Dim CrtRgn1 As Range 'Range applied to Criteria 1
    Dim CrtRgn2 As Range 'Range applied to Criteria 2
    Dim CrtRgn3 As Range 'Range applied to Criteria 3

    With wsOpps
        Set SumRgn = .Range("T1:T2000")
        Set CrtRgn1 = .Range("C1:C2000")
        Set CrtRgn2 = .Range("K1:K2000")
        Set CrtRgn3 = .Range("J1:J2000")
    End With

'Turn off events
    Application.EnableEvents = False

'Clear old data in Worksheet Snapshot
    wsSnapshot.Range("B3:K20").ClearContents

'Apply SUMIFs and Update data
    For i = 3 To 19
        For r = 2 To 11
            wsSnapshot.Cells(i, r).Value = Application.SumIfs(SumRgn, CrtRgn1, wsSnapshot.Cells(i, 1).Value, CrtRgn2, wsSnapshot.Cells(1, r).Value, CrtRgn3, wsSnapshot.Range("A2").Value)
        Next r
    Next i

'Turn on events
    Application.EnableEvents = True

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