Application 개체

SUBTOTAL 함수

노만e 2025. 3. 15. 05:17

엑셀의 SUBTOTAL 함수는 필터링된 데이터에서 특정 계산(합계, 평균, 개수 등)을 수행하는 함수입니다.

VBA에서는 WorksheetFunction.Subtotal을 사용하여 특정 데이터 범위의 합계를 구하거나, Range.Subtotal 메서드를 사용하여 자동 소계를 생성할 수 있습니다.


1. 엑셀 SUBTOTAL 함수 기본 구조

Application.WorksheetFunction.Subtotal(FunctionNum, Range)
매개변수
설명
FunctionNum
계산 유형 (예: 9 = 합계, 1 = 평균, 2 = 개수 등)
Range
계산할 범위

📌 필터링된 데이터에서만 작동하며 숨겨진 행은 계산에서 제외됨

📌 FunctionNum이 100 이상이면 수동 숨김된 행도 제외됨


2. FunctionNum 값과 계산 유형

FunctionNum
FunctionNum (100+)
계산 유형
1
101
평균 (AVERAGE)
2
102
숫자 개수 (COUNT)
3
103
빈 셀 개수 (COUNTA)
4
104
최대값 (MAX)
5
105
최소값 (MIN)
6
106
곱 (PRODUCT)
7
107
표준편차 (STDEV)
8
108
표준편차 (표본) (STDEVP)
9
109
합계 (SUM)
10
110
분산 (VAR)
11
111
분산 (표본) (VARP)

📌 100 이상을 사용하면 사용자가 숨긴 행까지 제외하고 계산됨


3. 필터링된 데이터의 합계 구하기

Sub 필터된데이터_합계()
Dim 합계 As Double
합계 = Application.WorksheetFunction.Subtotal(9, Range("B2:B100"))
MsgBox "필터링된 데이터의 합계: " & 합계
End Sub

📌 B2:B100 범위의 필터링된 데이터만 합계를 계산


4. 필터링된 데이터의 평균 구하기

Sub 필터된데이터_평균()
Dim 평균 As Double
평균 = Application.WorksheetFunction.Subtotal(1, Range("C2:C100"))
MsgBox "필터링된 데이터의 평균: " & 평균
End Sub

📌 C2:C100 범위에서 필터링된 데이터의 평균을 계산


5. 사용자가 숨긴 데이터도 제외한 합계

Sub 숨김행제외_합계()
Dim 합계 As Double
합계 = Application.WorksheetFunction.Subtotal(109, Range("D2:D100"))
MsgBox "숨겨진 행을 제외한 합계: " & 합계
End Sub

📌 109를 사용하면 필터링된 데이터 + 수동 숨긴 행도 제외하고 합계 계산


6. 엑셀 Range.Subtotal을 활용하여 자동 소계 삽입

Sub 자동소계추가()
Dim 데이터 As Range
Set 데이터 = Range("A1:D100") ' 데이터 범위 설정

' 기존 소계 제거
데이터.RemoveSubtotal

' A열(1번째 열)을 기준으로 그룹화 후 B열(2번째 열) 합계 계산
데이터.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2)
End Sub

📌 A열을 기준으로 그룹을 만든 후, B열의 합계를 자동으로 삽입

📌 기존 소계를 제거한 후 추가 (RemoveSubtotal 사용)


7. 자동 소계 생성 (여러 개의 열)

Sub 자동소계_여러열()
Dim 데이터 As Range
Set 데이터 = Range("A1:E100")

데이터.RemoveSubtotal ' 기존 소계 제거

' A열을 기준으로 B, C, D열의 합계를 계산하여 소계 삽입
데이터.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2, 3, 4)
End Sub

📌 A열 기준으로 B, C, D열의 합계를 계산하여 자동 소계를 생성


8. 자동 소계 제거

Sub 자동소계_제거()
Dim 데이터 As Range
Set 데이터 = Range("A1:D100")

데이터.RemoveSubtotal ' 기존 소계 제거
End Sub

📌 기존에 설정된 소계를 삭제하는 코드


9. 필터링된 데이터의 최대값 구하기

Sub 필터된데이터_최대값()
Dim 최대값 As Double
최대값 = Application.WorksheetFunction.Subtotal(4, Range("E2:E100"))
MsgBox "필터링된 데이터의 최대값: " & 최대값
End Sub

📌 E2:E100 범위에서 필터링된 데이터의 최대값 계산


10. 필터링된 데이터의 개수 세기

Sub 필터된데이터_개수()
Dim 개수 As Double
개수 = Application.WorksheetFunction.Subtotal(2, Range("F2:F100"))
MsgBox "필터링된 데이터의 개수: " & 개수
End Sub

📌 F2:F100 범위에서 필터링된 데이터의 개수를 계산


📌 SUBTOTAL 사용 시 주의할 점

  1. 필터링된 데이터만 계산할 경우 1~11을 사용
  2. 사용자가 숨긴 행도 제외하려면 101~111을 사용
  3. Range.Subtotal은 소계를 자동 추가하지만 기존 데이터를 변경할 수 있음
  4. 필터링되지 않은 전체 데이터를 대상으로 SUBTOTAL을 사용하면 일반 합계와 동일

📝 정리

기능
VBA 코드 (SUBTOTAL 활용)
필터링된 데이터 합계
Application.WorksheetFunction.Subtotal(9, Range("B2:B100"))
필터링된 데이터 평균
Application.WorksheetFunction.Subtotal(1, Range("C2:C100"))
숨긴 행 제외한 합계
Application.WorksheetFunction.Subtotal(109, Range("D2:D100"))
자동 소계 추가
Range("A1:D100").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2)
자동 소계 제거
Range("A1:D100").RemoveSubtotal
필터링된 데이터 최대값
Application.WorksheetFunction.Subtotal(4, Range("E2:E100"))
필터링된 데이터 개수
Application.WorksheetFunction.Subtotal(2, Range("F2:F100"))

🔥 VBA의 SUBTOTAL을 활용하면 필터링된 데이터만 계산하거나 자동 소계를 설정할 수 있습니다! 🚀