2017-02-07 7 views
1

Следующий код бросает 1004 ошибки во время выполнения при запуске. Отладчик подсвечивает функцию SUMIFS только над частью 2.VBA SUMIFS - не работает, все входы возвращают правильные значения

Цель этого подраздела - найти дубликаты строк с использованием столбцов 1, 3 и 5 в качестве «первичных ключей», а затем объединить значения по столбцу для строк 6- 7 и 10-17, основываясь на этих значениях для каждой строки. Следовательно, СУММЫ.

Я смущен. Используя немедленное окно, я могу вернуть правильные значения для каждого раздела SUMIFS fuction (ws.Cells (lRow, lCol). Выбор позволит выбрать правильную ячейку и т. Д.). Моя следующая мысль заключалась в том, что диапазоны не были правильно интерпретированы SUMIFS, поэтому я применил ту же функцию, используя определенные диапазоны, в ближайшее окно и получил ту же ошибку. См. Строку ниже для немедленного ввода окна - обратите внимание, что целью является объединение значений между строками 21:23 в этом примере.

debug.Print application.WorksheetFunction.SumIfs(range("F21:F23"), range("A9:A30"), range("A21").Value, range("C9:C30"), range("C21").Value, range("E9:E30"), range("E21").Value) 

Я предполагаю, и 100% уверены, что названные диапазоны, .codenames и переменные работают по желанию. Тем не менее, я раньше ошибался.

Любая помощь была бы принята с благодарностью.

Private Sub dba_combine_rows() 

Const COL_TRIPS = 6 
Const COL_EMP_TRIP = 7 
Const COL_LN_HC = 10 
Const COL_USN_PR = 17 
Dim lLastRow As Long 

Dim ws As Worksheet 
Set ws = DBA 

Dim answer As Integer 
answer = MsgBox("Are you sure you want to combine rows?", vbYesNo, "Combine Rows") 
If answer = vbNo Then 
    Exit Sub 
End If 

'Get the last row 
    Dim i As Long 
    For i = Range("inputRange" & ws.CodeName).Column To (Range("inputRange" & ws.CodeName).Column + Range("inputRange" & ws.CodeName).Columns.Count - 1) 
     If ws.Cells(ws.Rows.Count, i).End(xlUp).Row > lLastRow Then 
      lLastRow = ws.Cells(ws.Rows.Count, i).End(xlUp).Row 
     End If 
    Next i 

''Combine, start modify 

    'Set aliases for columns A & B & C, used for checking duplicates 
    Dim rngA As Range, rngB As Range, rngC As Range 
    Set rngA = ws.Range("inputRange" & ws.CodeName).Columns(1) 
    Set rngB = ws.Range("inputRange" & ws.CodeName).Columns(3) 
    Set rngC = ws.Range("inputRange" & ws.CodeName).Columns(5) 

    Dim lRow As Long, lCol As Long, strHolderA As String, lHolderR As Long 
    For lRow = ws.Range("inputRange" & ws.CodeName).Row To lLastRow 

    'Part 1 - Check for duplicate entity-country 
     If Application.CountIfs(rngA, ws.Cells(lRow, rngA.Column), rngB, ws.Cells(lRow, rngB.Column), rngC, ws.Cells(lRow, rngC.Column)) > 1 Then 

     strHolderA = (ws.Cells(lRow, rngA.Column).Value & ws.Cells(lRow, rngB.Column).Value & ws.Cells(lRow, rngC.Column).Value) 
     lHolderR = lRow 

      For lCol = COL_TRIPS To COL_USN_PR 
       If lCol = COL_EMP_TRIP Then 
        lCol = COL_LN_HC 
       End If 
       ws.Cells(lRow, lCol).Value = Application.WorksheetFunction.SumIfs(_ 
        ws.Range(Col_Letter(lCol) & lRow & ":" & Col_Letter(lCol) & lLastRow), rngA, ws.Cells(lRow, rngA.Column).Value, rngB, ws.Cells(lRow, rngB.Column).Value, rngC, ws.Cells(lRow, rngC.Column).Value) 
      Next lCol 

     'Part 2 - Delete similar rows, excluding 1st 
      Dim lRow2 As Long 
      For lRow2 = ws.Range("inputRange" & ws.CodeName).Row To lLastRow 

       If (ws.Cells(lRow2, rngA.Column).Value & ws.Cells(lRow2, rngB.Column).Value & _ 
         ws.Cells(lRow2, rngC.Column).Value) = strHolderA And lRow2 <> lHolderR Then 
        Rows(lRow2 & ":" & lRow2).Select 
        Selection.Delete Shift:=xlUp 
        lRow2 = lRow2 - 1 
       End If 
      Next lRow2 

     End If 

    Next lRow 

End Sub 
+0

Диапазон сумм и диапазоны критериев должны быть одинакового размера. – SJR

ответ

0

sum_range параметр (первый) должен быть того же размера, как диапазоны критерии, которые все. также должны быть одного размера.

"F21:F23" всего 3 ячейки, в то время как другие i.e "A9:A30" подсчитывают по 22 ячейки каждый.

+1

Хороший звонок. Благодарю. Функция SUMIFS в коде также неверно содержала разные ячейки. –

+0

@JoshuaLowry рад узнать, что это помогло :) –