• 최초 작성일: 2006-08-11
  • 최종 수정일: 2026-09-30
  • 조회수: 20 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 값이 있는 셀에만 번호 매기기

들어가기 전에

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

방명록에 김대종님께서 다음과 같은 글을 올려 주셨습니다.

엑셀러님 그동안 잘 지내셨고 휴가는 갖다 오셨는지요?

한동안 다른 부서에 파견나가 있어서 홈피에 접속을 상당기간 못했지만 지금은 관심을 갖고 꾸준히 공부하고 있습니다. 좋은 자료에 감사하다는 말 다시한번 전해드리고 싶습니다.

항상 느끼는 거지만 엑셀만 잘 사용을 해도 회사 업무 중복 및 손실의 50%는 줄일 수 있을 것 같다는 개인적인 생각입니다. 특히 전산화가 덜 된 중소기업의 경우는 활용도가 무궁무진한것 같습니다.

엑셀 내에 수많은 오브젝트가 있다고 하셨는데 이 오브젝트와 회사 내 조직 및 업무가 매우 유사하다는 느낌이 자주 듭니다. 톱니바퀴가 맞물려 돌아가듯 회사업무도 손실없이 계획대로 진행된다면 얼마나 좋겠습니까?

한 일 또하고 또하고(한심할 정도로 함), 전에 있던 자료 잊어먹어서 또하고, 어디에 있는지 몰라서 또하고(직원마다 개인컴에 저장되어 있음) 하여튼 이런 비효율적인 면을 최대한 줄이고자 엑셀을 공부하고 있습니다.

엑셀은 자영자분들도 필요하시겠지만 샐러리맨들에겐 필수요소라 생각합니다. 주위에 이런 엑셀을 무시하는 사람 치고 꼼꼼히 일처리하는 사람 별로 없는 듯 합니다.

엑셀공부하랴, 영어공부하랴, 해당업무 관련 자격증 공부하랴, 또는 집에서 애보랴 어느 것을 우선시 해야할지 고민도 많이 되지만 자기 좋아하는 것을 찾아서 빠져드는 것도 괜찮은 것 같습니다. 삶의 재미도 있구요..

이런 걸 보면 세상의 행복은 꼭 돈이 아니라는 말도 맞다는 자위감이 듭니다.

이런 자아도취에 빠질수 있도록 기회를 주신 엑셀러님.. 고맙습니다. 몸 건강하시구요.

다시 안부 드리겠습니다.

방명록에 김대종님께서 이런 글을 올려주셨군요. 참으로 공감이 가는 내용입니다. 자신의 경험에서 우러난 얘기이므로 더욱 그러합니다.

자의로 타의로 엑셀계(?)를 떠나 있다가 다시 돌아와서 소식을 전해주시는 분들을 보면 참으로 반갑습니다.

엑셀을 가만히 들여다 보고 있노라면 볼수록 잘 만들었다는 생각이 듭니다. (정확하게 말하면 '엑셀'이 아니라 '스프레드시트'라고 불리는 유형의 프로그램을 의미합니다. 오늘날 스프레드시트의 대명사로 자리잡다시피 한 것이 엑셀이니까 결국 같은 의미가 되기도 하겠군요 ^^)

지금까지 Exceller의 강좌 파일을 보신 분들이라면 누구나 느끼시겠지만 엑셀은 회사의 업무 처리를 위해 사용되는 것만은 아닙니다. 참으로 다양한 계층의 사람들이 다양한 용도로 사용을 하고 있습니다.

'엑셀을 무시하는 사람 치고 꼼꼼히 일처리하는 사람 별로 없는 듯 합니다'라고 하셨는데, 부모로 물려받은 재산이 엄청나게 많다거나 로또에 1등으로 당첨되어 더 이상 아둥바둥 살 필요가 없는 사람을 제외하고는 엑셀이 불필요한 사람은 없을 것입니다. 아니 그런 부류의 사람이라도 형성된 자산을 제대로 관리하기 위해서는 엑셀을 잘 사용할 필요가 있을 것입니다.

(자산 관리를 위한 회계사나 Financial Planner를 고용하면 되지 않냐구요? 어느 정도까지는 가능하겠지만 그렇게 해서 100% 해결되는 것은 아니겠지요?)

인생을 제대로 살기 위해서는, 다른 말로 인생을 제대로 관리하기 위해서는 엑셀을 잘 활용해야 할 필요가 있다고 생각합니다. 엑셀을 사용하여 자신의 생활을 관리(정리)하다 보면 요즘 많이 회자되고 있는 WLB(Work-Life Balance), 즉 '일과 생활의 균형'에 대해서도 관리해 나갈 수 있는 노하우가 자연스레 생깁니다.

사설은 이쯤에서 접고…

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

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

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


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

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

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

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

값이 있는 셀에만 번호 매기기

핵심 요약: 값이 있는 행에만 순번 매기기

B~F열 중 하나라도 입력되어 있는 행에만 A열에 1, 2, 3… 순번을 매기는 VBA 코드입니다. 수작업 과정을 그대로 코드로 옮기면 간단히 해결됩니다.

  • 1단계: 이름 정의(번호)로 순번을 넣을 A열 영역을 지정하고 기존 내용을 지웁니다.
  • 2단계: 각 셀의 오른쪽 B~F열 영역에 CountA를 적용해 값이 있는지 확인합니다.
  • 3단계: 값이 있으면 카운터 i를 1 증가시켜 셀에 입력합니다.

Step 1: 어떤 질문이었을까요?

언제 올라온 질문인지 모르겠지만 다음과 같은 내용의 것이 있었습니다. (혹시 다른 사이트에 올라온 것인지도 모르겠습니다)

질문 하나

안녕하세요! 화창한 하루 입니다. 어제 선거를 보고 제주도 도민의 우수성(?)을 느끼게 되었읍니다. 흔들리지 않는 유권자의 가장 멋진 모습이 아닌가 싶네요! ^^ 저 개인의 생각 입니다. 질문을 올려 보겠읍니다. A열에 "순"의 번호를 B,C,D,E,F 열에 하나라도 입력이 되어 있으면 "A"열에 순번으로 입력 하고 싶습니다. 사용 이유는요! 순번을 고유번호로 활용하여, 삭제,수정 때 쉽게 찾기 위하여 이 방법을 사용 하려 합니다. [요점] 확인 버튼을 누르면 A열에 B,C,D,E,F 열중 하나만 입력이 되어 있으면 A열에 순번을 나오게 하는 방법 을 VBA로 표현 하고 싶습니다 감사합니다.

선거 얘기가 등장하는 것으로 보아... 좀 오래 된 질문인가 봅니다. ^^ 다음 버튼을 눌러 보세요.

Step 2: 코드 살펴보기

Const strID As String = "www.iExceller.com"
' 프로시저 바깥에 상수를 하나 선언하고 값을 지정해 두었습니다.
' 이처럼 프로시저 외부에 변수나 상수를 선언하면 다른 프로시저에서도 불러와서 사용할 수
' 있게 됩니다.

Sub Numbering()

    Dim rngTarget As Range
    Dim rngArea As Range
    Dim rngCell As Range
    Dim i As Integer
    Dim strMsg As String

    Set rngTarget = Range("번호")
    ' Workplace 시트의 A3:A20 영역에 미리 이름 정의를 해 두었습니다.
    ' 동적 이름 정의를 해 두면 보다 융통성 있게 작업을 할 수 있겠지요?

    strMsg = "작업 대상 영역의 내용을 모두 지웠습니다." & vbCr
    strMsg = strMsg & "이제 순번을 새로 매깁니다."

    rngTarget.ClearContents
    MsgBox strMsg, , strID
    ' 이미 번호가 입력되어 있다면 지웁니다.

    For Each rngCell In rngTarget
        With rngCell
            Set rngArea = Range(.Offset(0, 1), .Offset(0, 5))
            ' B열에서 F열에 데이터가 들어있는지를 파악하기 위해 rngArea 변수에 해당 영역을
            ' 할당합니다.

            If WorksheetFunction.CountA(rngArea) > 0 Then
            ' 데이터가 들어있는지 여부는 워크시트 함수인 CountA를 이용합니다. 즉 CountA의
            ' 결과값이 0보다 크면 무언가 값이 들어있다는 의미가 되므로 카운터 변수 i 값을 1
            ' 증가시키고 셀에 표시합니다.

                i = i + 1
                .Value = i
            End If
        End With
    Next rngCell

    MsgBox "모두 " & i & "개의 아이템이 있습니다", , strID

End Sub

참고: Integer 대신 Long을 쓰면 더 안전합니다. 예제에서는 카운터 변수 i를 Integer로 선언했습니다. Integer는 최대 32,767까지만 저장할 수 있으므로, 번호를 매길 행이 수만 개에 이른다면 Dim i As Long으로 선언하는 편이 안전합니다.

코드는 무지 간단하지요? 프로그래밍을 하기 전에 '수작업으로 한다면 어떤 프로세스로 처리가 되는가?'를 충분히 고민해 보면 답은 쉽게 나올 수 있습니다.

오늘은 여기까지…

정리 — 번호 매기기 코드 핵심

구분 사용한 코드 역할
상수 선언 Const strID As String 프로시저 바깥에 선언해 다른 프로시저에서도 사용
대상 영역 Set rngTarget = Range("번호") 이름 정의된 A3:A20 영역 지정
기존 번호 삭제 rngTarget.ClearContents 이미 입력된 번호를 먼저 지움
값 유무 확인 WorksheetFunction.CountA(rngArea) > 0 오른쪽 5개 셀에 값이 있는지 확인
번호 입력 i = i + 1 : .Value = i 카운터를 늘리며 순번 입력

자주 묻는 질문 (FAQ)

Q1. CountA 함수는 어떤 셀을 값이 있는 것으로 세나요?

CountA는 비어 있지 않은 셀의 개수를 셉니다. 숫자, 문자, 수식은 물론 수식 결과가 빈 문자열("")인 셀도 값이 있는 것으로 계산하므로, 이런 셀을 비어 있는 것으로 보려면 별도의 조건이 필요합니다.

Q2. 프로시저 바깥에 상수나 변수를 선언하면 무엇이 좋은가요?

모듈 맨 위(프로시저 바깥)에 선언한 상수나 변수는 같은 모듈의 모든 프로시저에서 사용할 수 있습니다. 여러 프로시저에서 똑같은 메시지 제목을 쓸 때 매번 선언하지 않아도 되어 편리합니다.

Q3. 번호를 매길 영역이 늘어나면 코드를 고쳐야 하나요?

이름 정의를 동적으로(OFFSET 등으로) 지정해 두면 데이터가 늘어나도 코드를 수정하지 않고 그대로 사용할 수 있습니다.

마치며

프로그래밍을 하기 전에 수작업으로 한다면 어떤 과정을 거치는지 먼저 생각해 보면 코드는 의외로 간단하게 풀립니다. 값이 있는 행에만 번호를 매기는 이 코드도 그렇게 만들어졌습니다.