- 최초 작성일: 2000-11-09
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 메모가 있는 셀 표시하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
셀에 메모를 삽입하게 되면 셀 우측 상단에 자그마한 빨간 세모가 표시됩니다. 그리고 이것은 마우스 포인터가 해당 셀 위에 위치할 때에만 화면상에 나타납니다. (물론 "메모 표시" 메뉴를 통해 항상 나타나도록 할 수도 있지만…) 또한 출력을 할 때에도 별도의 설정을 해 주지 않으면 메모가 포함된 셀인지 그렇지 않은 셀인지 분간이 안됩니다(이것도 "파일-페이지 설정" 메뉴에서 "시트"탭에 있는 "메모" 항목을 설정해 주면 가능하기는 합니다).
그래서 이런 식의 방법을 한번 생각해 보았습니다. 아래의 버튼을 누르면 "출력 범위"를 설정하는 대화상자가 나타날 것입니다. 그러면 마우스로 <표> 부분을 지정해 보세요.
아래와 같은 표에서 몇몇 셀에는 메모가 삽입되어 있다고 가정합니다(숫자는 임의로 만든 예시입니다).
메모가 있는 셀 표시하기
핵심 요약: 메모가 있는 셀 표시
출력 범위를 입력받아 메모가 있는 셀의 테두리를 저장한 뒤 굵은 빨간색으로 바꾸고, 미리보기 후 원래대로 복원합니다.
- 1단계: Application.InputBox(Type:=8)로 출력 범위를 지정받습니다.
- 2단계: NoteText가 있는 셀의 원래 테두리를 저장하고 굵은 빨간 테두리로 바꿉니다.
- 3단계: PrintPreview 후 저장한 값으로 테두리와 인쇄 영역을 되돌립니다.
Step 1: 코드 작성하기
코드를 보도록 하지요.
Sub DisplayNoteText()
'//셀에 메모가 삽입되어 있으면 미리보기 상태에서 표시가 되도록 설정하는 프로시저
Dim rngCell As Range
Dim rngTarget As Range
Dim arrOld() As Long
Dim arrEdge As Variant
Dim i As Long
Dim j As Long
'//셀의 상/하/좌/우 선의 두께, 색깔, 선 종류를 담아두기 위한 배열 변수와 테두리 위치를
'//담은 배열을 준비합니다. 변수의 타입이 Long인 점에 유의하시고…
arrEdge = Array(xlLeft, xlRight, xlTop, xlBottom)
On Error Resume Next
Set rngTarget = Application.InputBox(prompt:="출력할 범위를 지정하세요", _
Title:="출력 범위 지정//Exceller", Type:=8)
On Error GoTo 0
If rngTarget Is Nothing Then Exit Sub
'//InputBox를 통해 범위를 입력받기 위해서는 Excel 내장함수인 InputBox를 사용하며,
'//그러기 위해 앞에 Application을 붙여 주었습니다. 그리고 Type도 8로 지정해 줍니다.
'//[취소]를 누르면 범위가 지정되지 않으므로 프로시저를 빠져 나갑니다.
ReDim arrOld(1 To rngTarget.Cells.Count, 1 To 12)
For Each rngCell In rngTarget.Cells
i = i + 1
If Len(rngCell.NoteText) > 0 Then
'//NoteText의 길이가 0보다 크다는 것은 곧 그 셀에 메모가 있다는 의미입니다. 따라서
'//메모가 있는 셀의 상/하/좌/우 선의 Weight, ColorIndex, LineStyle 속성값을
'//배열에 담아둡니다.
'//왜 담아 두냐구요?
'//그래야 나중에 미리보기를 끝내고 시트로 돌아왔을 때 원래의 표 상태대로 되돌려
'//줄 수 있기 때문이지요. 만약 이 과정이 없다면 메모가 있는 셀의 외곽선은 굵은 빨간
'//색으로 표시가 되기 때문에 보기가 좋지 않을 것입니다.
For j = 0 To 3
With rngCell.Borders(arrEdge(j))
arrOld(i, j * 3 + 1) = .Weight
arrOld(i, j * 3 + 2) = .ColorIndex
arrOld(i, j * 3 + 3) = .LineStyle
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 3
End With
Next j
End If
Next rngCell
ActiveSheet.PageSetup.PrintArea = rngTarget.Address
ActiveWindow.SelectedSheets.PrintPreview
i = 0
For Each rngCell In rngTarget.Cells
'//미리보기가 끝난 다음에 메모가 들어 있는 셀의 외곽선을 다시 원상태로 되돌리기 위한
'//과정입니다.
i = i + 1
If Len(rngCell.NoteText) > 0 Then
For j = 0 To 3
With rngCell.Borders(arrEdge(j))
.LineStyle = arrOld(i, j * 3 + 3)
If .LineStyle <> xlNone Then
.Weight = arrOld(i, j * 3 + 1)
.ColorIndex = arrOld(i, j * 3 + 2)
End If
End With
Next j
End If
Next rngCell
ActiveSheet.PageSetup.PrintArea = ""
'//인쇄 영역을 설정했으니 이것을 다시 원상태로 되돌립니다. PrintArea 속성값을 아무 것도
'//주지 않으면 인쇄 영역 설정 해제가 됩니다.
End Sub
최신 버전의 엑셀에서는 기존의 메모(Note)와 협업용 스레드 댓글(Threaded Comment)이 구분됩니다. 이 코드가 사용하는 NoteText는 메모를 대상으로 하며, 댓글은 CommentThreaded 개체로 다룹니다. 또한 인쇄 설정에서 "시트 끝" 또는 "표시된 대로"로 메모를 출력하는 기능도 함께 사용할 수 있습니다.
마무리
"필요는 발명의 어머니(Necessity is the Mother of Invention!!!)"라는 말이 있지요. 이 세상의 모든 문제는 어떤 형태로든 해결이 가능합니다. 관건은 한정된 자원을 사용해서 얼마나 효율적으로 처리를 하느냐 이지요.
흔히들 "이론과 실제는 달라. 그래서…" 이런 말들을 많이 합니다.
물론 이론과 실제는 다릅니다. 당연히 다르지요. 그렇지만 그것 때문에 문제해결 자체가 불가능한 것은 아니라는 생각이 듭니다. "이론과 현실이 다르기 때문에 문제를 해결할 수 없다"고 말하는 사람은,
- 이론을 잘 모르거나,
- 현실을 정확히 모르거나,
- 이론과 현실, 둘 다 모르거나
이 세 가지 중 하나의 범주에 속하는 사람이라고 생각합니다(넘 과격했나? ^___^).
세상 사는데, 모두 나와 똑같은 생각과 주장을 한다면 그것 또한 얼마나 밋밋하고 재미없겠습니까? 가끔씩 Exceller가 이처럼 말도 안되는 억지 주장을 하더라도 '공짜 강의를 보시는 대가다'라고 생각하시고 한쪽 귀로 듣고 다른 한귀로 흘려 버리시기를…
오늘 강좌의 주제는 "불가능은 없다. 적어도 Excel과 VBA 상에서는…"이 되겠습니다.
다음 시간에 또…
정리 — 메모 셀 표시 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 범위 입력 | Application.InputBox(Type:=8) | 마우스로 범위 지정 |
| 메모 확인 | Len(rngCell.NoteText) > 0 | 메모가 있는 셀 찾기 |
| 테두리 변경 | .Borders(xlLeft).Weight = xlThick | 굵은 빨간 테두리 |
| 미리보기 | ActiveWindow.SelectedSheets.PrintPreview | 인쇄 미리보기 |
| 원상 복구 | .PageSetup.PrintArea = "" | 인쇄 영역 해제 |
자주 묻는 질문 (FAQ)
Q1. InputBox에서 범위를 입력받으려면 어떻게 하나요?
Excel의 Application.InputBox를 사용하고 Type 인수를 8로 지정하면 마우스로 범위를 선택할 수 있습니다.
Q2. NoteText는 무엇인가요?
셀에 삽입된 메모의 텍스트를 돌려주는 메서드로, 길이가 0보다 크면 메모가 있는 셀입니다.
Q3. 왜 테두리 값을 미리 저장해 두나요?
미리보기를 마친 뒤 표를 원래의 테두리 상태로 되돌리기 위해서입니다.
마치며
필요한 기능이 없어도 VBA로 원하는 동작을 만들어 낼 수 있습니다.