2017-02-07 1 views
1

내가 도망 갈 때 다음 코드는 1004 런타임 오류를 던지고있다를 돌려줍니다. 디버거는 2 부 바로 위의 SUMIFS 함수를 강조 표시합니다.VBA SUMIFS - 작동하지 않음은, 모든 입력은 올바른 값

이 하위의 목표는 1, 3 및 5 열을 사용하여 "기본 키"로 중복 행을 찾은 다음 6 행에 대해 열로 값을 결합하는 것입니다. 7 및 10-17은 각 행에 대한 값을 기반으로합니다. 그러므로 SUMIFS.

나는 혼란 스러워요. 즉각적인 윈도우를 사용하여 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) 

명명 된 범위, .codname 및 변수가 원하는대로 작동한다고 가정하고 100 % 확신합니다. 즉, 나는 전에 잘못 본 적이있다.

도움을 주시면 감사하겠습니다.

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 도움이 된 것을 기쁘게 생각합니다. :) –