• 최초 작성일: 2001-11-27
  • 최종 수정일: 2026-09-30
  • 조회수: 12 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 브랜드별 시트만들기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

게시판에 올라오는 질문을 보노라면 가끔 가슴 한켠이 답답해 오는 질문을 접하곤 합니다. 엑셀과 VB를 마치 도깨비 방망이라도 되는 것처럼 여기고 있는 분이 있는 것 같아서 입니다.

몇 년 전에 베스트 셀러였던 "디지털 신경망 서비스(Digital Nervous Service)" 라는 부제가 붙은 빌 게이츠의 "생각의 속도"에 보면 이런 말이 나옵니다.

디지털 신경망은 인간의 신경 체계를 기업에 적용한 디지털 신경 체계로서, 적절하게 통합된 정보의 흐름을 꼭 필요로 하는 부서에 적시에 제공해준다. … 디지털 신경망의 핵심 요소는 지식관리, 사업운영, 상거래라는 각기 다른 시스템들을 서로 연결해 주는 것이다…

이런 말만 듣고 나서는, "아하~ 그렇다면 회사에 디지털 신경망과 같은 컴퓨터 시스템(예를 들면 ERP 시스템 같은 것)을 도입하기만 하면 자동으로 DNS 조직이 되겠군!" 이렇게 생각하는 분들이 있는 듯 합니다.

아무리 회사의 기간 시스템을 ERP 아니라 별 희안한 것을 가져다 놓아도 이것을 운영하는 사람의 의식이나 실제 업무 흐름이 인체의 신경망처럼 일사분란하게 움직이지 않는다면 말짱 헛 것입니다. 컴퓨터(엑셀)는 잘 정립되어 있는 업무 흐름을 자동화하고 신속하게 만드는 것이지 조직은 방만하고 비효율적으로 움직이고 있는데 컴퓨터 시스템만 자동화시키는 것은 비싼 돈만 쏟아붓는 것일 따름인 것이지요.

"과연 이러이러한 것이 VBA로 자동화가 가능합니까?" 라는 질문에 대해 Exceller는 "수작업으로 가능한지 여부"를 확인하곤 합니다. 그런데 1000개의 행을 가진 데이터가 있다고 할 경우, 각 행을 모두 수작업으로 해 주어야 하는 상황임에도 이것을 수작업으로 처리가 가능하다고 우긴다면 좀 곤란해 지겠지요?

예를 들어 DM 발송을 위한 주소록 정리를 하는데 이 사람은 전화번호를 02)-836-0000 이렇게 입력하고, 저 사람은 02 835-7000 이라고 입력하고, 또 저 사람은 그냥 836-7777, 또는 (02)-709-1234,… 하여튼 이런 식으로 입력하는 사람마다(개성이 강해서인지) 자기 마음 내키는대로 입력을 하였다면 이 데이터를 갖고 자동화를 시켜달라고 하면 될까요? (개성도 내세울 때 내세워야지 이런 경우에 개성있게 입력하면…)

하여튼 자동화도 현실 세계에서 일사분란하게 잘 돌아가도록 먼저 갖추어 놓고 난 다음에 구현을 해도 해야지 현실은 개떡같이(과격한 표현을 써서 죄송! Exceller는 다른 것은 다 참아도 엉터리 데이터베이스를 주면서 해결을 해 달라는 것만큼은 못 참습니다 ^^) 되어 있는데 이것을 컴퓨터로 자동화시키는 것은 어불성설입니다.

사설이 길었습니다. DB 얘기만 나오면 흥분을 하는 버릇이 있어서… ^^

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

브랜드별 시트만들기

핵심 요약: 브랜드별 시트 자동 생성

브랜드 제목 영역을 순환하면서 같은 이름의 시트를 지우고 새로 만든 뒤, 해당 열의 값이 있는 행만 옮겨 담고 합계와 자동 서식을 적용합니다.

  • 1단계: Start 이름과 End(xlToRight)로 브랜드 제목 영역을 잡습니다.
  • 2단계: 같은 이름의 시트가 있으면 삭제하고 새 시트를 만들어 이름을 지정합니다.
  • 3단계: 값이 0보다 큰 담당만 옮기고 계를 구한 뒤 AutoFormat을 적용합니다.

Step 1: 이번 시간의 예제

이번 강좌에서 다루어 볼 내용도 DB와 관련이 있는 내용입니다. 아래와 같은 데이터가 있다고 가정합니다. 이것은 어느 영업 지점의 담당별/브랜드별 판매 수량 집계표 입니다. 이런 식으로 실적 데이터를 엑셀 시트에 입력한 것 까지는 좋았는데… 이것을 브랜드별로 별도의 시트로 만들어야 할 경우가 있다면 어떻게 해야 할까요? 버튼을 눌러 보세요.

담당명아이오페라네즈마몽드미래파미쟝센설화수헤라베리떼
유승삼1006668713310
김명호14522290151528
김기화729244639025
한기철13052751917024
박기찬1439824237
박재현13520011731417
이세우1181002372464
최재석88339822284

뭣이 휙휙 거리더니... 각 브랜드별 시트가 만들어 졌지요? 머 하느라고 휙휙 거렸는지 코드를 보도록 할까요?

Step 2: MakeSeparateTable 프로시저

Sub MakeSeparateTable()
    Dim rngCell As Range, rngItem As Range
    Dim i As Integer, intNum As Integer
    Dim r As Integer, c As Integer
    Dim bytCount As Byte
    Dim lngTotal As Long
    Dim shtSheet As Worksheet
    '''작업에 필요한 변수들을 지정해 줍니다. 어떤 분의 질문 중에,
    '''Exceller님은 어떻게 변수가 프로그램 중에 사용될 것을 미리 알고 항상
    '''프로시저 앞 부분에 다 써 줍니까?"라고 하신 분이 있더군요.

    '''그것은 필요한 모든 변수를 미리 다 생각해서 적어주는 것이 아닙니다.
    '''그런 것은 천재들이나 하는 짓(?)이지요.
    '''코드를 짜기 전에 어떤 순서를 따를 것인가를 생각하여 최소한의 변수들만
    '''도입부분에 선언해 줍니다. 그리고 나머지는 프로그래밍을 하면서 하나씩
    '''추가를 한 다음 코드가 완성되고 나서 순서를 고쳐주는 것입니다.
    '''Exceller는 천재가 아니랍니다. ^^

    Application.DisplayAlerts = False
    Set rngItem = Range([Start].Offset(0, 1), [Start].Offset(0, 1).End(xlToRight))
    '''위의 B63 셀에 미리 Start라는 이름을 정의해 준 다음 코딩시 사용합니다.
    '''rntItem 이라는 영역은 Start 셀의 바로 오른쪽의 C63셀로부터 시작하여 오른쪽으로
    '''더 이상 데이터가 없는 영역, 그러니까 파란 점선으로 둘러싼 부분입니다.

    intNum = Range([Start], [Start].End(xlDown)).Cells.Count - 1

    For Each rngCell In rngItem
        For Each shtSheet In Worksheets
            If shtSheet.Name = rngCell Then
                MsgBox rngCell & "시트는 이미 존재합니다." & vbCr & _
                    "삭제하고 다시 만듭니다!", , "동일 시트 발견//By Exceller"
                shtSheet.Delete
            End If
            '''순환문을 돌면서 같은 이름의 시트가 있나 확인하여 있으면 지웁니다.

        Next shtSheet

        Worksheets.Add after:=ActiveSheet
        bytCount = bytCount + 1
        ActiveSheet.Name = rngCell
        [A1:B1] = Array("담당명", rngCell)
        '''새로운 시트를 한장 삽입하고 시트명을 rngCell, 즉 해당 브랜드 이름으로
        '''바꾸어 줍니다. 그리고 A1 셀과 B1 셀에 담당명, 해당 브랜드명을 기입합니다.
        '''이 때 배열을 사용하여 두 개의 셀에 한꺼번에 데이터를 입력한 방법에
        '''주의해서 보시기 바랍니다.

        For i = 1 To intNum
            If rngCell.Offset(i, 0) > 0 Then
                r = r + 1
                With [A1]
                    .Offset(r, 0) = rngCell.Offset(i, -c - 1)
                    .Offset(r, 1) = rngCell.Offset(i, 0)
                End With
                lngTotal = lngTotal + rngCell.Offset(i, 0)
            End If
            '''이 부분이 오늘 코드의 핵심입니다. rngCell.Offset(I, 0)이라는 것은
            '''C63 셀에서 행 방향으로 1, 열 방향으로 0만큼 이동한 것이니까 바로
            '''C64 셀이 되겠지요? 이 셀의 값이 0보다 크면 그 다음 구문을 실행합니다.
            '''새로 삽입한 시트의 A2 셀부터 데이터를 차곡차곡 옮겨담는 과정입니다.

            '''언제나 그렇듯이 순환문이 나오면 흰 종이를 한장 펼쳐놓고 직접 숫자값을
            '''대입해 가며 순환문을 세 바퀴만 돌려보면 답이 나올 것입니다.

        Next i
        With [A1]
            .Offset(r + 1, 0) = rngCell & " 계"
            .Offset(r + 1, 1) = lngTotal
            .AutoFormat Format:=xlRangeAutoFormatList1
            '''시트에 값을 옮겨 적었으면 "계" 부분을 구하고 "자동 서식"을 입힙니다.

        End With
        r = 0
        c = c + 1
        lngTotal = 0
    Next rngCell
    Application.DisplayAlerts = True
    Application.Goto Sheets("Preface").[A50], True
    MsgBox bytCount & " 개의 시트가 만들어졌습니다", , "시트 생성 완료//By Exceller"
End Sub

Start 이름은 위의 B63 셀에 미리 정의해 준 다음 코딩 시 사용합니다. rngItem 이라는 영역은 Start 셀의 바로 오른쪽의 C63셀로부터 시작하여 오른쪽으로 더 이상 데이터가 없는 영역, 그러니까 파란 점선으로 둘러싼 부분입니다. 코드의 핵심은 rngCell.Offset(i, 0)이라는 것이 C63 셀에서 행 방향으로 1, 열 방향으로 0만큼 이동한 것이니까 바로 C64 셀이 되고, 이 셀의 값이 0보다 크면 새로 삽입한 시트의 A2 셀부터 데이터를 차곡차곡 옮겨담는 부분입니다. 언제나 그렇듯이 순환문이 나오면 흰 종이를 한 장 펼쳐놓고 직접 숫자값을 대입해 가며 순환문을 세 바퀴만 돌려보면 답이 나올 것입니다.

Step 3: 오늘 강좌의 주제는?

오늘 강좌의 주제가 무엇이었을까요? 디지털 신경망 시스템? ……………………… 땡! 브랜드별 시트 만들기?? …………………… 또 땡!!

컴퓨터를 통한 자동하는 실제 업무 과정을 최대한 자동화시켜 놓고 난 다음의 일이라는 것. 그러기 위해서라도 DB는 항상 구축하기 전에 두번 세번 생각해 보아야 한다는 것이었습니다.

오늘은 여기까지…

정리 — 브랜드별 시트 생성 핵심

구분 사용한 코드 역할
영역 지정 Range([Start].Offset(0, 1), ...End(xlToRight)) 브랜드 제목 영역
시트 확인 For Each shtSheet In Worksheets 동일 이름 시트 삭제
시트 추가 Worksheets.Add / ActiveSheet.Name 브랜드 시트 생성
데이터 옮김 If rngCell.Offset(i, 0) > 0 값이 있는 행만 이동
서식 AutoFormat xlRangeAutoFormatList1 자동 서식 적용

자주 묻는 질문 (FAQ)

Q1. VBA로 무엇이든 자동화할 수 있나요?

수작업으로 가능한 업무 흐름이 정립되어 있고 데이터가 일정한 규칙으로 입력되어 있을 때 자동화가 의미 있습니다.

Q2. 변수는 왜 프로시저 앞부분에 미리 선언하나요?

코딩 전에 순서를 생각해 최소한의 변수를 선언하고 나머지는 코딩하면서 하나씩 추가한 다음 완성 후 순서를 정리하는 것입니다.

Q3. Start는 어떤 이름인가요?

표의 제목 셀(B63)에 미리 정의해 둔 이름으로 코드에서 기준 셀로 사용합니다.

마치며

자동화는 실제 업무 과정을 최대한 정리해 놓은 다음의 일이며, 데이터베이스는 구축하기 전에 두 번 세 번 생각해야 합니다.