2017-02-07 35 views
1

以下代碼在運行時會引發1004運行時錯誤。調試器突出顯示第2部分中的SUMIFS函數。VBA SUMIFS - 不工作,所有輸入返回正確值

該子部分的目標是使用第1,3和5列作爲「主鍵」來查找重複行,然後將行的值按行組合, 7和10-17基於每行的這些值。因此SUMIFS。

我很困惑。使用即時窗口,我可以爲SUMIFS功能的每個部分返回正確的值(ws.Cells(lRow,lCol).Select將選擇正確的單元格等)。我的下一個想法是,範圍沒有被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個單元,而其他的即"A9:A30"每個計數22個單元。

+1

呼叫良好。謝謝。代碼中的SUMIFS函數也錯誤地保存了不同數量的單元格。 –

+0

@JoshuaLowry很高興知道它幫助:) –