전 강좌의 리플에서 말씀드린 내용이지만 이 강좌는 VB 에서 엑셀 핸들링을 위주로 다룰 것이고 필요에 따라서는 VBA와 엑셀의 기본
기능을 설명하고 기초적이고 기본적인 내용만 다룰 내용 예정이니 질문이 필요할 때 이 강좌와 관련이 있거나 누구나가 공감할 수 있
는 질문이면 여기다가 댓글을 남겨주시면 되고 지금 강좌에 보다 더 깊이 다뤄야 할 부분이 있는 질문은 회원가입은 하셔야 겠지만
http://excellove.com 의 묻고 답하기 게시판을 이용해 주시면 감사하겠습니다. 죄송하지만 쪽지 질문과 메일 질문은 제가 잘 확인하
지 않는 관계로 사양합니다. 위의 게시판을 이용해 주셨으면 합니다. 물론 엑셀을 다루는 싸이트이기 때문에 질문은 반드시 엑셀이나
VBA에 관련된 질문이어야 합니다.
그럼 시작하겠습니다. 이번 시간에는 Worksheet 개체에 대해서 설명을 드릴 것입니다.
제가 Workbook 은 그냥 엑셀 파일 정도로 생각하시면 된다고 말씀드렸고 시트라는 말이 생소한 분들이 있을지 모르겠습니다만 간단히
설명드리면 하나의 어플리케이션 안에 여러개의 워크북이 존재하듯이 하나의 워크북 안에도 여러개의 시트가 존재합니다. 엑셀 메뉴의
옵션에서 특별히 건드리지 않았다면 디폴트는 3개이지만 더 추가하거나 삭제할 수 있습니다. 하지만 0 은 될 수 없고 무조건 시트는 1개 이상
이어야 합니다. 워드의 페이지 개념하고 비슷하지만 출력 단위의 페이지 개념은 아니고 하나의 시트는 가로 256 열과 세로 65536 행의
셀이 모인 집합으로 구성이 됩니다. 이 정도 개념은 아시는 분이 더 많을 것이라 생각하고 더 깊이 들어가면 강의 주제와 벗어나기 때문에
이 정도까지만 설명 드리겠습니다.
VB에서 Worksheet 개체를 다룬다고 하면 크게 주된 작업으로 떠오르는 것은 시트 삽입, 삭제, 시트명 변경 등이 있습니다. 먼저 시트 삽입을
다뤄보면 워크북과 마찬가지로 Add 메서드를 쓰면 됩니다.
xlApp.Worksheets.Add

그런데 보통 시트를 위의 코드를 써서 추가하면 그림과 같이 맨 앞에 해당시트(그림에서 Sheet4)가 추가 되는데 실제 작업은 맨 뒤에 추가할 경우가 오히려 더 많이 쓰입니다.
참고적으로 그림과 같이 기본 시트가 3개이고 1개가 추가돼서 4개로 보이지 않는 경우는 엑셀 메뉴의 도구-옵션의 일반탭에서 새 통합
문서의 시트 수가 3개인지 확인하시기 바랍니다.

어쨌든 Add 의 인수를 살펴보면 Before, After, Count, Type 라는 인수들을 갖게 됩니다. Type 은 시트 종류로서 워크시트 외에는 쓸
일이 없겠지만 워크시트, 매크로 시트, 차트 시트 등의 종류가 있다는 정도만 알고 계시고 Sheets 컬렉션과 Worksheets 컬렉션에 대해
서는 나중에 다뤄보고 전자는 그냥 특별한 시트(차트시트, 매크로 시트)를 포함한 시트, 후자는 일반 시트 정도로 알아 두시고 넘어가
겠습니다. 여기서는 After 와 Count 만 설명드리자면 After 는 지정할 시트 뒤에 추가한다는 말이고 Count 는 추가할 시트의 수입니다.
예를 들어서 "Sheet2" 라는 시트명을 가진 시트 뒤에 2개의 시트를 추가해라 라는 것을 작성한다면 다음과 같습니다.
xlApp.Worksheets.Add After:=xlApp.Worksheets("Sheet2"), Count:=2
<참고>
:= 라는 것이 무엇이냐라고 물어보시는 분이 계셨던 것 같아서 혹시 모르시는 분들에 대해서 설명을 드리자면 인수명에 값을 대입할
때 쓰는 것이고 누구나 아는 MsgBox로 예를 들면 아래 2개의 문장은 같은 내용입니다.
MsgBox "메세지", , "제목"
MsgBox Prompt:="메세지", Title:="제목"
실제 코딩하실 때 MsgBox 하고 한칸 띄우면 Prompt 라는 인수명이 보이실 것입니다.
전자는 컴마(,)가 두개가 있고 후자는 하나임에 주목하시기 바랍니다.
MsgBox "메세지" 와 같이 인수명을 생략하면 인수의 순서에 맞게 값이 대입이 되는 것이고 중간의 인수를 생략할 때는 컴마(,)를 하나
더 찍어서 그 위치를 건너 뛰어서 입력해야 하는데 비해 Title:="제목" 과 같이 인수명을 지정을 해주면 인수의 순서와 상관없이 인수를
대입할 수 있습니다. Excel VBA 는 VB 보다 인수가 많은 경우가 더러 있으므로 "인수명:=값" 형태로 많이 쓰이게 되니 꼭 숙지하시고
넘어가시기 바랍니다. |
3번째 시트(시트탭 좌측에서 3번째 시트)에서 시트 하나를 추가 해라 라는 것은 다음과 같습니다.
xlApp.Worksheets.Add After:=xlApp.Worksheets(3)
현재 활성화 된 시트 뒤에 시트 하나를 더 추가 해라 라는 것은 다음과 같습니다.
xlApp.Worksheets.Add After:=xlApp.Activesheet
이것은 어떻게 되는 것인지 먼저 생각해 보시기 바랍니다.
xlApp.Worksheets.Add After:=xlApp.Sheets(xlApp.Sheets.Count)
xlApp.Sheets.Count 는 Count 를 보셨으면 이해가 되시겠지만 시트 전체의 개수를 의미합니다. Sheets(숫자)는 그 숫자 번째에
해당하는 시트를 의미합니다. 따라서 xlApp.Sheets(xlApp.Sheets.Count) 는 맨 마지막 시트(맨 우측에 있는 시트)를 의미하는 것이고
위의 예문은 맨 뒤에 시트를 추가하라는 것이죠.
Worsheets.Count 는 일반 시트의 개수이고 Sheets.Count 는 전체 시트(특별한 시트 포함)의 개수이지만 별로 구분해서 쓰실 일은 거의
없을 것입니다.
제가 가독성이 좋으라고 With ~ End With 구문은 쓰지 않았지만 With xlApp 로 코딩하시는 것이 좋겠죠. 그리고 After 대신에 Before
를 쓰면 시트 뒤가 아닌 앞을 의미합니다. 이 부분은 쉽게 응용하실 수 있다고 생각하고 넘어가겠습니다.
WorkBook 개체와 마찬가지로 Worksheet 도 사용방법이 비슷한데 위에서 예를 든
Worksheets("Sheet2"), Worksheets(3), ActiveSheet 실제 MSDN 에서 부르는 용어는 좀 다르긴 합니다만 모두 Worksheet 개체라고
생각하시면 됩니다.
Worksheets("Sheet2") 는 "Sheet2" 라는 이름을 가진 워크시트 개체, Worksheets(3)는 인덱스 3인(3번째) 워크시트 개체, ActiveSheet
현재 활성화 된 워크시트 개체를 의미합니다.
참고로 ActiveWorkbook 처럼 ActiveWorkSheet 가 아니고 ActiveSheet 라고 쓰셔야 활성화 된 시트를 의미합니다.
시트를 추가 하고 나서 실제 엑셀 데이터 핸들링하기 전에 보통 해야 하는 작업은 시트명을 바꿔줘야 합니다. 간단히 Name 속성을
이용하시면 됩니다.
xlApp.Worksheets("Sheet1").Name = "ABC"
시트명이 "Sheet1" 시트를 "ABC" 로 바꾼다는 내용입니다.
그럼 조합을 해보겠습니다. 맨 마지막에 위치에 시트명을 "ABC"로 추가한다면...
With xlApp
.Worksheets.Add After:=.Sheets(.Sheets.Count)
.ActiveSheet.Name = "ABC"
End With
이해가 되시는지요. 마지막에 시트를 추가하고 추가할 때 그 시트가 활성화가 되니 그 활성화 된 시트의 이름을 "ABC"로 바꿔주는 것
이죠. 결국 마지막에 "ABC" 라는 이름으로 시트를 추가 시켜라 라는 구문이죠.
소스를 줄여보겠습니다.
With xlApp
.Worksheets.Add(After:=.Sheets(.Sheets.Count)).Name = "ABC"
End With
이상하지요? 이 구문을 처음 보시면 Add 메서드 다음에 Name 속성이 나오는 것이 무엇인가라고 생각하시겠죠. Name 은 Add 에 연결이
되는 것이 아니라 추가된 워크북 개체에 연결된다고 생각하시면 됩니다. Worksheets.Add 로 추가된 WorkBook 에 Name 이 연결된다고
생각하시면 이해하시는데 무리가 없을 것 같습니다. 위의 소스 하나를 설명 드리기 위해서 여태까지 설명드렸던 것이죠. 다른 것 다
잊어버려도 Add 뒤에 Name 이 있는 위의 소스만 기억하도록 하십시오.
오늘의 마지막 주제 시트 삭제에 대해서 말씀을 드리겠습니다. 결론 부터 말씀드리면 Delete 메서드를 쓰시면 됩니다. 현재 활성화된
시트를 삭제하는 경우라면 다음과 같이 하시면 됩니다. 첫번째 시트라면 ActiveSheet 대신에 Sheets(1) 을 쓰시면 되겠죠. 다 같은
Worksheet 개체이니 Worksheets("Sheet1") 형식으로 쓰셔도 상관없습니다. 참고적으로 각 개체에는 코드네임이라는 것이 있습니다.
저는 Worksheets("Sheet1") 형태보다는 Sheet1 이라는 코드네임으로 처리하는 방법을 더 좋아합니다. 이것에 대해서는 VBE 창에 대해서
설명할 때 같이 설명드리겠습니다.
xlApp.ActiveSheet.Delete
삭제할 때 간과해서는 안되는 경우 예를 들어 엑셀에 데이터가 있는 경우 A1 셀에 "ABC" 라는 데이터를 넣고 삭제하는 경우
xlApp.Range("A1").Value = "ABC" 'Range 개체에 대해서는 뒤에서 다룰 예정이니 데이터를 넣어둔다 정도만 기억하고 넘어가시기 바랍니다.
xlApp.ActiveSheet.Delete
위의 소스를 실행을 해보면 다음과 같이 경고창이 뜹니다.

일반 엑셀 유저들은 데이터가 실수로 지워지지 않는 것 때문에 당연히 필요한 기능이지만 개발자들한테는 자동화에 거슬리는 구문이죠.
이런 경우에는 제가 첫회 때 말씀 드린 Application 개체의 주요 속성 중에 하나인 DisplayAlerts 를 쓰시면 됩니다. 다음과 같이
코딩하시면 경고창이 뜨지 않게 되죠.
xlApp.DisplayAlerts = False
xlApp.Range("A1").Value = "ABC"
xlApp.ActiveSheet.Delete
xlApp.DisplayAlerts = True
Application 개체의 주요 속성은 이 외에도 몇 개 있는데 필요할 때마다 하나하나씩 예를 들어서 설명 드리겠습니다.
엑셀에서 경고창이 뜨는 경우, 모든 경고창은 xlApp.DisplayAlerts = False 로 날려버리시고 사용 후에는 xlApp.DisplayAlerts = True
로 복원하세요. 서두에도 말씀드렸지만 시트를 삭제할 때 모든 시트를 삭제할 수는 없고 한개 이상의 시트는 반드시 존재해야 합니다.
설명드릴 부분이 많아서 아마도 Range 개체까지 설명드리고 나면 초보자 분들도 어느정도 감을 잡으실 수 있을 것 같으니 '이게 뭐야,
지금까지 강좌를 봐도 아무것도 만들 수 없네'하는 분들은 그 때까지는 좀 참아 주시기 바랍니다.
그리고 VBA를 어느정도 하시는 분들 중에 혹시나 매크로 기록기를 쓰면 되는 것을 이렇게 어렵게 강좌를 할 필요가 있나 하시는 분들도
좀 참아주시기 바랍니다. 매크로 기록기를 Range 개체 설명할 때 정도에 다루겠습니다. 왜 뒤에서 다루는지는 그 때 설명드리고 매크로
기록기에서는 최대한 자세히 다뤄보도록 하겠습니다. 그 때까지 좀 힘들더라도 잘 따라오시길 바랍니다.
강좌가 쉬운지, 보통인지, 어려운 것인지 모르겠으니 그것에 대해 리플 달아주시면 고맙겠고 리플이 없으면 강좌 수준은 제 마음대로
잡겠습니다.
그럼 오늘도 활기찬 하루를 시작하시기 바랍니다.