- 최초 작성일: 2001-11-30
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 빈 행과 열 숨기기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 게시판에 올라온 질문을 살펴봅니다.
저번에 질문에 대한 답 너무 고맙습니다.(이 site에 자주 오는 편이고 유용하게
활용하고는 있었지만 질문은 처음이었고 저에게 답변을 해주시는 분들이 있다니
너무 기뻤습니다)
11메가짜리 엑셀파일은 다시 열리지 않아 지워 버렸습니다. 3일 정도 작업한 것인데
다행히 data는 입력 전이어서 (우연히 복사해놓은 파일이 있어서 다행…)
… (중략)…
하나에 쉬트에 약 2000줄정도 수식을 입력해놓고, vba를 활용해 빈 행 숨기기,
전체 행 보이기를 하고 있는데 코드는 for....next, if 순환문을 기록해 놓았습니다.
빈행 숨기기, 보이기를 2,3번 반복하다보니 메모리 부족 메세지가 뜹니다. 도움말
항목 엑셀 등록정보에 나오는 시스템 메모리가 작업을 반복할 때마다 현저히
떨어지더군요. 고민고민하다 엑셀문서가 아닌 엑셀프로그램자체를 닫았다 열면
시스템 메모리가 다시 70% ~ 85%로 되살아나더군요
하지만 여러사람이 같이 쓰는 파일이라 이러한 불편함을 해결할 방법은 없는지요.
빈 행과 열 숨기기
핵심 요약: 빈 행과 열 숨기기/보이기
CountA로 행·열의 값 개수가 0인지 확인하고 Hidden = Not Hidden으로 바꾸면 한 버튼으로 숨김과 표시를 번갈아 처리할 수 있습니다.
- 1단계: 여러 프로시저에서 쓸 변수는 전역 변수로 선언합니다.
- 2단계: For 문으로 행과 열을 순환하며 CountA가 0인지 확인합니다.
- 3단계: Hidden 속성에 Not을 적용해 숨김/표시를 반복합니다.
Step 1: 예제 시트로 확인해 보기
버튼을 누르시면 예제 시트를 만듭니다.
"Hide And Show" 버튼을 2~3번이 아니라 몇 번을 반복해서 누르더라도 메모리가 부족하다거나 하는 등의 에러 메시지는 나타나지가 않을 것입니다. 따라서 이것은 질문하신 분의 코드 중에서 무언가 다른 부분에서 연유한 것이 아닌가 생각됩니다.
코드를 보면…
Step 2: 예제 데이터 만들기 (HideAndShow)
Option Explicit
Dim intRow As Integer, intCol As Integer
'''여러 프로시저에서 공통적으로 사용하기 위한 변수를 프로시저 바깥에 선언해 두었습니다.
'''이와 같은 성격의 변수를 "전역 변수(Public Variables)"라고 부릅니다.
'''아래의 프로시저는 예제 데이터를 만들어 주기 위한 것입니다.
Sub HideAndShow()
Dim i As Integer
Dim rngCell As Range, rngStage As Range
Worksheets.Add after:=Sheets("Preface")
Set rngStage = [A1:H100]
For Each rngCell In rngStage
rngCell.Formula = "=int(rand()*1000)"
Next rngCell
'''워크시트를 한 장 삽입하고 A1:H100 셀에 Rand 함수를 사용하여 임의의 수를 뿌려줍니다.
With ActiveSheet.UsedRange
intRow = .Rows.Count
intCol = .Columns.Count
.Copy
.PasteSpecial xlValues
Application.CutCopyMode = False
'''현재 시트에서 사용된 영역의 행과 열 크기를 변수에 저장한 다음, 값 복사를 합니다.
For i = 1 To intRow
If i Mod 4 = 0 Then Rows(i).Clear
Next i
For i = 1 To intCol
If i Mod 3 = 0 Then Columns(i).Clear
Next i
'''매 4행 또는 매 3열에 있는 데이터들을 지웁니다.
End With
[A1].Select
With ActiveSheet.Buttons.Add([J2].Left, [J2].Top, [J2].Width * 3, [J2].Height * 2)
.Caption = "Click Me to Hide and Show"
.OnAction = "HideAndShow2"
End With
'''다음 작업을 진행하기 위한 버튼을 하나 그려 넣고 프로시저를 연결해 둡니다.
MsgBox "작업을 위한 데이터를 만들었습니다.", , "데이터 작성 완료//By Exceller"
End Sub
여러 프로시저에서 공통적으로 사용하기 위한 변수를 프로시저 바깥에 선언해 두었습니다. 이와 같은 성격의 변수를 "전역 변수(Public Variables)"라고 부릅니다. 위의 프로시저는 예제 데이터를 만들어 주기 위한 것으로, 워크시트를 한 장 삽입하고 A1:H100 셀에 Rand 함수를 사용하여 임의의 수를 뿌려준 다음 현재 시트에서 사용된 영역의 행과 열 크기를 변수에 저장하고 값 복사를 합니다. 그리고 매 4행 또는 매 3열에 있는 데이터들을 지우고, 다음 작업을 진행하기 위한 버튼을 하나 그려 넣고 프로시저를 연결해 둡니다.
Step 3: 빈 행과 열 숨기기 (HideAndShow2)
위의 프로시저 마지막 부분에서 만든 버튼에 연결되는 코드를 작성합니다. 실제 빈 행과 열을 숨기는 작업은 이 프로시저가 담당을 하게 됩니다.
Sub HideAndShow2()
Dim i As Integer
With [A1:J100]
intRow = .Rows.Count
intCol = .Columns.Count
End With
For i = 1 To intRow
If Application.CountA(Rows(i)) = 0 Then Rows(i).Hidden = Not Rows(i).Hidden
'''이 부분이 핵심입니다. CountA 함수는 지정한 영역 내에 값이 들어있는 셀을 카운팅 할 때
'''사용하는 함수이지요? 따라서 행 전체를 카운팅한 결과값이 0인 경우, 즉 아무 값이 없는
'''행이 있을 경우에는 Range 오브젝트의 Hidden 속성값을 조절해 주는 것입니다.
'''그런데 위의 예에서와 같이 …Rows(i).Hidden = Not Rows(i).Hidden 과 같은 형태로
'''해 두면 버튼을 한번 누를 때마다 True/False를 반복하게 되어 행 또는 열이 보였다가
'''숨겨졌다가를 반복하는 것입니다.
Next i
For i = 1 To intCol
If Application.CountA(Columns(i)) = 0 Then Columns(i).Hidden = Not Columns(i).Hidden
Next i
If Rows(4).Hidden Then
MsgBox "빈 행을 숨겼습니다"
Else
MsgBox "빈 행과 열을 다시 나타내었습니다"
End If
End Sub
이 부분이 핵심입니다. CountA 함수는 지정한 영역 내에 값이 들어있는 셀을 카운팅 할 때 사용하는 함수이지요? 따라서 행 전체를 카운팅한 결과값이 0인 경우, 즉 아무 값이 없는 행이 있을 경우에는 Range 오브젝트의 Hidden 속성값을 조절해 주는 것입니다. 그런데 위의 예에서와 같이 …Rows(i).Hidden = Not Rows(i).Hidden 과 같은 형태로 해 두면 버튼을 한번 누를 때마다 True/False를 반복하게 되어 행 또는 열이 보였다가 숨겨졌다가를 반복하는 것입니다.
많이 응용해 보시기 바랍니다. 아주 재미있는 것이 많이 나올 것입니다.
정리 — 빈 행/열 숨기기 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 전역 변수 | Dim intRow, intCol (프로시저 밖) | 여러 프로시저에서 공유 |
| 빈 행 확인 | Application.CountA(Rows(i)) = 0 | 값이 없는 행 판별 |
| 토글 | Rows(i).Hidden = Not Rows(i).Hidden | 숨김/표시 반복 |
| 빈 열 확인 | Application.CountA(Columns(i)) = 0 | 값이 없는 열 판별 |
| 상태 확인 | If Rows(4).Hidden Then | 메시지 분기 |
자주 묻는 질문 (FAQ)
Q1. 빈 행을 숨기고 보이기를 반복하면 메모리 부족이 발생하나요?
예제에서는 여러 번 반복해도 메모리 부족 메시지가 나타나지 않으므로 질문하신 분의 다른 코드 부분에서 원인을 찾아보아야 합니다.
Q2. Hidden = Not Hidden은 무슨 뜻인가요?
현재 값의 반대 값을 대입하는 것으로 버튼을 한 번 누를 때마다 True/False가 번갈아 바뀝니다.
Q3. 전역 변수란 무엇인가요?
프로시저 바깥에 선언하여 여러 프로시저에서 공통으로 사용할 수 있는 변수(Public Variables)입니다.
마치며
CountA와 Hidden 속성만 알면 빈 행과 열을 간단히 숨기고 다시 보이게 할 수 있습니다.