HOWTO · VBA

VBA의 합계 함수

VBA에서 Excel의 SUM 워크시트 함수를 사용해 하나 이상의 범위를 합산하고, 결과를 셀에 쓰며, 배열이나 조건을 충족하는 값을 합산합니다.

이 페이지의 내용

VBA에서 Excel의 SUM 함수를 사용하려면 WorksheetFunction.Sum을 호출하고 범위나 값을 전달합니다. SUM은 WorksheetFunction 개체를 통해 VBA에서 사용할 수 있는 Excel 워크시트 함수이며, 독립적인 VBA 내장 함수는 아닙니다. 아래의 전체 VBA 프로시저는 복사해 사용할 수 있지만, 설정된 런타임이 VBA를 지원하지 않아 실행되지는 않았습니다.

VBA에서 Excel의 SUM 함수 사용하기

일반적인 형식은 Application.WorksheetFunction.Sum(argument1, argument2, ...)입니다. 매크로 실행 중 다른 시트가 활성화될 수 있다면 워크시트를 명시적으로 지정하세요. 그러면 항상 의도한 시트의 데이터를 계산합니다. 아래 예제는 모두 ThisWorkbook.Worksheets("Sales")를 사용하므로, 통합 문서에 해당 이름의 워크시트가 있어야 합니다.

하나 이상의 범위 합산하기

이 프로시저들은 Sales 시트에 예시 값을 입력하고 합계를 계산한 뒤 E2에 기록합니다. 첫 번째 프로시저는 B2:B4의 값(12 + 8 + 5 = 25)을 합산합니다. 두 번째 프로시저는 B2:B3과 D2:D3을 각각 별도의 범위 인수로 전달합니다(12 + 8 + 5 + 10 = 35). 이처럼 서로 떨어진 범위의 합계를 구할 수 있습니다.

범위 하나:

Sub SumOneRange()
    Dim ws As Worksheet
    Dim total As Double

    Set ws = ThisWorkbook.Worksheets("Sales")
    ws.Range("B2").Value = 12
    ws.Range("B3").Value = 8
    ws.Range("B4").Value = 5

    total = Application.WorksheetFunction.Sum(ws.Range("B2:B4"))
    ws.Range("E2").Value = total
End Sub

서로 떨어진 두 범위:

Sub SumTwoRanges()
    Dim ws As Worksheet
    Dim total As Double

    Set ws = ThisWorkbook.Worksheets("Sales")
    ws.Range("B2").Value = 12
    ws.Range("B3").Value = 8
    ws.Range("D2").Value = 5
    ws.Range("D3").Value = 10

    total = Application.WorksheetFunction.Sum( _
        ws.Range("B2:B3"), ws.Range("D2:D3"))
    ws.Range("E2").Value = total
End Sub

범위가 하나라면 Sum에 Range 개체 하나를 전달합니다. 범위가 두 개라면 각 Range 개체를 별도의 인수로 전달하세요. 주소들을 하나의 범위 문자열로 합치면 안 됩니다. 두 프로시저 모두 total을 ws.Range("E2").Value에 할당해 계산 결과를 E2에 저장합니다.

다음 실행 가능한 Python 예제는 12, 8, 5의 산술 합계를 보여 줍니다. WorksheetFunction.Sum을 호출하거나 Excel 또는 VBA를 실행하지는 않습니다.

이 예제를 실행하세요:

values = [12, 8, 5]
total = sum(values)
print(total)
25

합계를 워크시트 셀에 기록하기

앞선 프로시저는 결과를 변수에 저장한 뒤 대상 셀의 Value 속성에 할당합니다. 일반적인 패턴은 total = Application.WorksheetFunction.Sum(ws.Range("B2:B10"))으로 합계를 계산하고, 이어서 ws.Range("E2").Value = total로 셀에 기록하는 것입니다. VBA에서는 =를 사용해 할당하면 Value에 결과가 전달됩니다. 읽을 범위와 대상 셀을 모두 명시적으로 지정하면 현재 활성화된 워크시트에 의존하지 않습니다.

VBA 배열 합산하기

값이 이미 VBA 배열에 들어 있다면 반복문으로 누적 과정을 직접 제어할 수 있습니다. Array(...)는 Variant 배열을 반환하므로 numbers As Variant로 선언하세요. 반복문을 시작하기 전에 total을 초기화하고 LBound(numbers)부터 UBound(numbers)까지 각 요소를 더합니다. 이 전체 프로시저의 합계는 15이며, 결과는 VBA 즉시 창에 표시됩니다. VBA에서 값을 누적하는 예제이므로 Excel의 SUM 워크시트 함수를 호출하지 않습니다. 설정된 런타임에서는 이 VBA 예제를 실행하지 않았습니다.

Sub SumArray()
    Dim numbers As Variant
    Dim total As Double
    Dim i As Long

    numbers = Array(1, 2, 3, 4, 5)
    total = 0

    For i = LBound(numbers) To UBound(numbers)
        total = total + numbers(i)
    Next i

    Debug.Print total
End Sub

조건을 충족하는 값 합산하기

이 프로시저는 Sales 시트의 A2:A6에 예시 값을 입력하고, 5보다 큰 값만 더해 합계(22)를 VBA 즉시 창에 표시합니다. If 문이 누적 합계에 포함할 값을 결정합니다. 이는 VBA에서 조건에 따라 값을 누적하는 방법입니다. 워크시트에서 조건부 합계를 계산하려면 Excel의 SUMIF도 사용할 수 있습니다. 이 방법이 더 적합한 경우 WorksheetFunction.SumIf를 호출하세요. 설정된 런타임에서는 이 VBA 예제를 실행하지 않았습니다.

Sub SumValuesGreaterThanFive()
    Dim ws As Worksheet
    Dim total As Double
    Dim i As Long

    Set ws = ThisWorkbook.Worksheets("Sales")
    ws.Range("A2").Value = 2
    ws.Range("A3").Value = 6
    ws.Range("A4").Value = 9
    ws.Range("A5").Value = 4
    ws.Range("A6").Value = 7

    total = 0
    For i = 2 To 6
        If ws.Cells(i, 1).Value > 5 Then
            total = total + ws.Cells(i, 1).Value
        End If
    Next i

    Debug.Print total
End Sub

자주 묻는 질문

WorksheetFunction.Sum은 어떤 기능을 하나요? VBA에서 Excel의 SUM 워크시트 함수를 호출해 전달한 숫자 값이나 범위의 합계를 반환합니다.

서로 떨어진 범위도 합산할 수 있나요? 네. 위 예제처럼 각 범위를 별도의 인수로 전달하세요.

참조된 범위의 숫자가 아닌 셀은 어떻게 처리되나요? Excel SUM은 참조 범위의 텍스트와 빈 셀을 무시합니다. 인수로 직접 전달한 값은 변환 방식이 다를 수 있습니다. 여러 종류의 입력을 함께 사용할 때 결과가 처리 방식에 따라 달라진다면 입력을 확인하고 일관되게 범위를 사용하세요.

서로 다른 워크시트의 범위도 사용할 수 있나요? 네. Worksheets("North").Range("B2:B10") 및 Worksheets("South").Range("B2:B10")처럼 각각 워크시트를 지정한 참조를 같은 SUM 호출의 인수로 전달하면 됩니다.