• 최초 작성일: 2000-10-04
  • 최종 수정일: 2026-09-30
  • 조회수: 12 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 체크 표시하기

들어가기 전에

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

이번 강좌에도 아주 재미있는 것을 하나 알아볼까요? 먼저, 적당한 영역을 범위로 지정한 다음에 아래의 버튼을 눌러 보세요. 너무 많이 잡으면 시간이 많이 걸리니까 20~30셀 정도만 잡으세요. 아래의 검정색 선 부분을 범위로 지정한 다음, 버튼을 눌러 보시기 바랍니다.

재미있습니까? 무슨 일을 하든지 재미를 느껴야 지속적으로 계속할 수 있겠지요?

범위를 지정한 다음에 버튼을 누르니까 범위 내의 각 셀마다 난수가 발생이 되면서 평균값이 계산되고, 평균값을 상회하는 셀에 대해서 체크표시와 셀 색상을 입히는 프로그램을 만들어 보겠습니다.

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

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

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


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

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

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

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

체크 표시하기

핵심 요약: 평균 이상 셀에 체크 표시

난수 발생과 서식 지정을 두 개의 프로시저로 나누어 작성하면 관리하기 편합니다.

  • 1단계: 선택 범위를 지우고 =rand()*100으로 난수를 채운 뒤 값으로 변환합니다.
  • 2단계: Application.Average로 평균값을 구합니다.
  • 3단계: 평균 이상인 셀에 색상을 입히고 선으로 체크 표시를 그립니다.

Step 1: 프로그램 구성

이 프로그램은,

  • (1) 난수를 발생시키는 부분
  • (2) 평균이상인 셀에 서식을 지정하는 부분

이렇게 나누어서 작성을 하는 것이 여러 모로 편리합니다.

Step 2: 난수를 발생시키는 프로시저

Sub MakeRandomNumber()
'//지정된 범위에 난수를 발생시키는 프로시저
    Dim i As Integer
    Dim intNum As Integer
    Dim rngCell As Range
    Dim rngAll As Range
    Dim obj As Object

    Set rngAll = Selection
    rngAll.Clear
    '//선택된 영역을 rngAll이라고 지정을 해 준 다음, 그 내부를 모두 지웁니다. Clear 메서드는
    '//ClearContents와 ClearFormats가 합쳐진 메서드라고 생각하시면 됩니다.

    For Each obj In ActiveSheet.DrawingObjects
        If TypeName(obj) = "Drawing" Then obj.Delete
        '//TypeName은 변수에 대한 정보를 알려줍니다. TypeName(obj) 라고 하면 선택된
        '//오브젝트가 어떤 것인지를 되돌려 줍니다. 따라서 현재 시트 내의 각종 Objects 중에서
        '//타입이 Drawing이면 그 오브젝트를 지우라는 것이 되지요.
    Next obj

    For Each rngCell In rngAll
        intNum = intNum + 1
        For i = 1 To 20
            With rngCell
                .Interior.ColorIndex = xlNone
                .Formula = "=rand()*100"
            End With
        '//이제 선택된 범위 내의 각 셀에다가 원하는 작업을 하는 것입니다. 먼저, 셀 내부에 이미
        '//색깔이 입혀져 있으면 없애주고(xlNone), rand() 함수를 써서 난수를 발생시킵니다.
        '//순환문을 또 한번 더 써준 것은… 그냥 시각적인 효과를 위해서입니다 ^^.
        Next i
    Next rngCell

    With rngAll
        .Copy
        .Cells(1).Select
        Selection.PasteSpecial Paste:=xlValues
        '//셀에 rand() 함수로 발생된 값을 그냥 그대로 두면 수시로 재계산되므로 공식을 없애고
        '//해당 셀의 값으로 치환해 주는 과정입니다.
    End With
    Call CheckMark
    '//평균값을 상회하는 셀에 표시를 해주기 위해서 다른 프로시저를 불러옵니다.
    '//여기서 Call이라는 문장을 사용했는데 이것은 생략하고 그냥 CheckMark라고만 해도
    '//상관없습니다. 예전에 BASIC을 배울 때(Visual Basic말고) 버릇이 남아 있는 것입니다.
    '//이것은 외부 프로시저를 불러올 때 사용하는 것입니다. 제 경우에는 이것이 보기에
    '//더 좋더군요. 어떻게 사용할 것인지는 여러분이 판단하실 일!
    rngAll.Cells(1).Select
End Sub

Step 3: 체크마크와 셀 색상을 입히는 프로시저

이제 두 번째 프로시저인 셀에 체크마크와 셀 색상을 입히는 프로시저입니다.

Sub CheckMark()
    Dim rngCell As Range
    Dim rngAll As Range
    Dim intAver As Integer
    Dim intCount As Integer

    Set rngAll = Selection
    intAver = Application.Average(rngAll)
    '//Average 함수는 Excel 내장함수입니다. 이것을 VBA에서 불러와서 사용하려면 위와 같이
    '//Application 또는 Application.WorksheetFunction을 붙이면 됩니다.

    MsgBox "선택된 영역의 평균값은 " & intAver & " 입니다" & _
        vbCr & "지금부터 해당 셀에 표시를 합니다", , "//Exceller"

    For Each rngCell In rngAll
        If rngCell.Value >= intAver Then
            intCount = intCount + 1
            With rngCell
                .Interior.ColorIndex = 22
                ActiveSheet.Drawings.Add(.Left, .Top, _
                    .Left + 10, .Top + 10, False).Select
                '//지정한 범위 내에서 평균값 이상인 셀에 대해 사선을 그리는 부분입니다.
                '//Drawing Object의 좌표 지정하는 방법은 예전에 사각형 그릴 때의 그것과 같으므로
                '//VB0002, VB0003 강좌를 참고하시기 바랍니다.

                '//간단하게 다시 한번 설명을 드리자면,
                '//ActiveSheet.Drawings.Add(ActiveCell.Left, ActiveCell.Top,ActiveCell.Left+10,
                '//, ActiveCell.Top+10)에서

                '//ActiveCell.Left는 현재 셀의 왼쪽 좌표, ActiveCell.Top은 현재 셀의 윗부분의 좌표,
                '//ActiveCell.Left+10은 현재 셀 왼쪽부분에서 10포인트 오른쪽으로 이동한 곳의 위치,
                '//ActiveCell.Top+10은 현재 셀 윗부분에서 10포인트만큼 아래로 이동한 곳의 위치를
                '//각각 나타냅니다. 따라서 사선이 한 줄 그어지게 되는 것이지요.

                With Selection
                    .AddVertex rngCell.Left + 10, rngCell.Top
                    .Border.ColorIndex = 3
                    '//위에서 그은 사선에 연이어서 위로 세로줄을 한 줄 긋고, 색상을 3, 즉 빨간색으로
                    '//지정합니다. ColorIndex의 색상에 대해서는 도움말이나 VB0036(PowerTools)
                    '//강좌 중에서 "색상 지정하기"를 참고하시기 바랍니다.
                End With
            End With
        End If
    Next rngCell
    MsgBox "평균값 이상인 셀은 모두 " & intCount & " 개 입니다" _
        , , "//Exceller"
End Sub

이 예제의 Drawings.Add와 "Drawing" 형식의 도형은 Excel 95 시절의 그리기 개체 방식으로, 최신 버전의 엑셀에서는 사용할 수 없습니다. 최신 버전에서는 Shapes.AddLine 또는 Shapes.AddShape로 선을 그리거나, 조건부 서식 또는 셀에 체크 문자(✓)를 입력하는 방법으로 대체할 수 있습니다.

마무리

이상입니다. 별로 어려운 부분은 없는 것으로 생각됩니다만… 선을 그리는 방법은 잘 기억해 두시면 도움이 될 것입니다. 많이 응용해 보시기 바랍니다.

그럼…

정리 — 체크 표시 핵심

구분 사용한 코드 역할
난수 발생 .Formula = "=rand()*100" 셀에 난수 입력
값 변환 PasteSpecial Paste:=xlValues 수식을 값으로
평균 계산 Application.Average(rngAll) 선택 범위 평균
색상 지정 .Interior.ColorIndex = 22 평균 이상 셀 표시
프로시저 호출 Call CheckMark 서식 프로시저 실행

자주 묻는 질문 (FAQ)

Q1. 난수를 값으로 바꾸는 이유는 무엇인가요?

rand() 함수 결과를 그대로 두면 수시로 재계산되므로, 수식을 없애고 값으로 치환합니다.

Q2. Call 문은 꼭 써야 하나요?

생략하고 프로시저 이름만 써도 됩니다. 어느 쪽을 쓸지는 취향의 문제입니다.

Q3. 엑셀 내장 함수는 VBA에서 어떻게 사용하나요?

Application 또는 Application.WorksheetFunction을 앞에 붙여 사용합니다.

마치며

선을 그리는 방법을 잘 기억해 두면 다양하게 응용할 수 있습니다.