VBA로 거래처별 시트 자동 분리 — 1,000행 통합 데이터를 30개 시트로 1초에 쪼개기

통합 매출 시트 1,000행을 거래처마다 복사해 새 시트를 만들다 보면, 다섯 번째에서 시트 이름이 겹쳐서 멈춘 적 있으시죠? 저는 Dictionary + AutoFilter 조합으로 거래처 키를 한 번 모은 뒤, 시트를 자동 생성·붙여넣기까지 한 Sub로 묶었어요. 30개 거래처도 1분 안에 끝납니다.

파일 통합 다음 단계로 “통합 → 거래처별 분리”가 자주 옵니다. 중복 제거 후 분리하면 시트마다 깨끗한 명단이 나와요.

이 글을 따라 하면 얻는 것
– Dictionary로 고유 거래처 목록
– 시트 이름 정제·중복 방지
– AutoFilter 복사 vs 배열 분기
– 1,000행 스케일 팁

1. 데이터 가정

원본 시트:

A: 거래처 B: 품목 C: 금액
(주)알파 노트북 1200000
베타상사 모니터 450000
(주)알파 마우스 80000

목표: 거래처마다 거래처_(주)알파 같은 시트 생성.

2. Dictionary로 키 수집

Sub 거래처별시트분리()
    Dim ws원본 As Worksheet
    Dim dict As Object
    Dim 마지막행 As Long, r As Long
    Dim 키 As String

    Set ws원본 = ThisWorkbook.Worksheets("원본")
    Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = 1  ' vbTextCompare — 대소문자 무시

    마지막행 = ws원본.Cells(ws원본.Rows.Count, 1).End(xlUp).Row
    For r = 2 To 마지막행
        키 = Trim(CStr(ws원본.Cells(r, 1).Value))
        If 키 <> "" Then
            If Not dict.Exists(키) Then dict.Add 키, 키
        End If
    Next r

    Dim k As Variant
    For Each k In dict.Keys
        Call 거래처시트생성(ws원본, CStr(k))
    Next k

    MsgBox dict.Count & "개 거래처 시트 생성 완료"
End Sub

3. 시트 이름 정제

엑셀 시트명 금지: \ / ? * [ ] : 최대 31자.

Function 시트이름정제(거래처명 As String) As String
    Dim s As String
    Dim bad As Variant, b As Variant
    s = Trim(거래처명)
    bad = Array("\", "/", "?", "*", "[", "]", ":")
    For Each b In bad
        s = Replace(s, CStr(b), "_")
    Next b
    If Len(s) > 28 Then s = Left(s, 28)
    시트이름정제 = "거래처_" & s
End Function

기존 시트 있으면 Delete 또는 건너뛰기 — 팀 정책에 맞게.

4. AutoFilter로 복사

Sub 거래처시트생성(ws원본 As Worksheet, 거래처명 As String)
    Dim ws새 As Worksheet
    Dim 시트명 As String
  Dim 마지막행 As Long

    시트명 = 시트이름정제(거래처명)
    On Error Resume Next
    ThisWorkbook.Worksheets(시트명).Delete
    On Error GoTo 0

    Set ws새 = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
    ws새.Name = 시트명

    ws원본.Rows(1).Copy ws새.Rows(1)
    마지막행 = ws원본.Cells(ws원본.Rows.Count, 1).End(xlUp).Row

    ws원본.Range("A1:C" & 마지막행).AutoFilter Field:=1, Criteria1:=거래처명
    ws원본.Range("A2:C" & 마지막행).SpecialCells(xlCellTypeVisible).Copy ws새.Range("A2")
    ws원본.AutoFilterMode = False
End Sub

SpecialCells보이는 셀만 — 필터와 짝. 데이터가 1만 행 넘으면 배열에 읽어 조건부로 쓰는 편이 안전합니다.

5. 오류 처리

  • 시트 없음 → On Error
  • SpecialCells 오류 1004 — 필터 결과가 0행일 때 발생 → If로 행 수 확인
  • 거래처명에 & 있으면 Criteria 이스케이프 주의

6. UserForm과 연결

UserForm에서 거래처 다중 선택 후 거래처별시트분리 호출 — 동료용 UI 완성.

7. FAQ

Q. 피벗이 더 빠르지 않나?
탐색·공유는 피벗. 거래처별 파일 배포는 시트 분리·PDF가 낫습니다.

Q. 월별+거래처?
키를 거래처 & "|" & 월로 Dictionary에 넣고 시트명에 월 포함.

Q. 원본 보존?
Copy만 — 원본 시트는 필터만 풀면 그대로.

8. 연습

샘플 10행·거래처 3곳 1) Dictionary 수집 2) 시트명 정제 3) AutoFilter 복사 4) 시트 수 MsgBox.

다음: Worksheet Change · 피벗 자동.

참고: Dictionary · AutoFilter.

실무 메모 1

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 2

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 3

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 4

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 5

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 6

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 7

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 8

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 9

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 10

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 11

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 12

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 13

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 14

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 15

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 16

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 17

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 18

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 19

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 20

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 21

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 22

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 23

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 24

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 25

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 26

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 27

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 28

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 29

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 30

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 31

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 32

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 33

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 34

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 35

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 36

Dictionary CompareMode 텍스트. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 37

시트명 31자·금지문자 정제. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 38

AutoFilter 후 SpecialCells. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

작성자 소개