Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

WorkSheet |Worksheets.Add|Delete|Application.DisplayAlerts|Index|
|Copy|Protect|Unprotect|Visible|TypeName()|
|LCase()|UCase()|Select|PrintOut|Array()|

Worksheet오브젝트를 다루는 몇가지 중요 속성,메소드들

엑셀프로그래밍을 할때 워크시트를 어떻게 다루어야 할것인지는
아주 중요한 문제다
데이타가 들어 있는 시트
요약만 다루어야 할 시트
시각적으로 보여 주어야 할 시트
자료를 입력하기 위한 시트등등
소루션의 목적에 따라서 아주 다양한 시트로 구성을 하게 된다
새로운 시트를 삽입해야 할때도 있고

Worksheets.Add

삽입한 시트에 특정한 이름을 지어주어야 하기도 하고

Worksheets.Add.Name="Data_" & Year(Date()) & "_" & Month(Date()) & "_" & Day(Date())

삽입하고 이름을 지을때 이미 같은 이름이 있는지 확인도 해야 하고

(아래에서 별도로 다룬다)
필요없는 시트는 삭제를 하기도 하고

Worksheets("시트이름").Delete

이때 사용자에게 시트를 삭제하겠느냐는 메시지가 나타나지 않고
소리소문 없이 삭제하기 위하여

Application.DisplayAlerts=False
Worksheest("시트이름 혹은 Index").Delete
Application.DisplayAlerts=True

하기도 한다는 기본적인것을 앞에서 보았다

몇가지를 더 살펴보기로 하자
만약 여러개의 통합문서가 열렸을때 같은 Sheet1이라는 시트가
모든 통합문서에 들어있을때는

Workbooks("화일명이나 열려있는 문서중 Index번호").Worksheets("Sheet1")

으로 접근한다
워크시트의 모든 내용을 지우고 싶을때는
WorkSheets("시트이름").Cells.ClearContents

통합문서내의 시트가 모두 몇장인지 알고 싶다면
Worksheets.Count
하면 몇장인지 알수 있고

기존에 있는 시트를 똑같이 복사하여 마지막시트에 삽입하고 싶다면
Worksheets("시트이름").Copy After:=Worksheets(Worksheets.count)
라고 하면 되고

시트를 보호모드로 걸고 싶다면
Worksheets("시트이름").Protect password:="걸고 싶은 패스워드"

시트를 보호모드에서 해제하려면
Worksheets("시트이름").Unprotect password:="걸려있는 패스워드"

시트내에 정보가 있는지 없는지 알고 싶을때
Variable=IIf(Application.CountA(Worksheets("시트이름").Cells)=0,"없음","있음")

시트를 보이지 않게 감추기
Worksheets("시트이름").Visible=False(보이게 하고 싶다면 True)

만약에 Sheet1이라는 이름의 시트가 활성화된 시트라면

Worksheets("Sheet1")로 접근하기도 하고
ActiveSheet로 접근하기도 할수 있다(Application오브젝트의 속성이며 Application은 생략해도 된다)

Sheets집합체오브젝트(Collection Object)의 속성,메소드

통합문서에는 Worksheet만 있는것이 아니고 아래의 그림과 같이 Chart도 있고



요사이는 거의 사용하지 않는 매크로 4.0시트나 다이어로그시트가
있다,이 두개의 시트(매크로시트와 다이어로그시트)는
이제 신경쓰지 않으셔도 된다 모두 오래된 버전사용자들을 위한것이고
지금은 거의 사용하지 않는다
엑셀로 VB를 배웁시다의 초기 화일에도 다이아로그시트를 다루었으나
이 부분은 그냥 생략하고 보시는것이 좋다

그러나 Chart시트는 여전히 사용하는것이고
Chart시트나 Worksheet를 모두 집합체로 관리해주는 집합체오브젝트가
Sheets오브젝트인것이다
만약 여러장의 시트중에서 Chart시트를 모두 삭제하고 싶다면

Sub deleteChartSht()
Dim shtX As Object
Application.DisplayAlerts = False
For Each shtX In Sheets
    If TypeName(shtX) = "Chart" Then
       shtX.Delete
    End If
Next
Application.DisplayAlerts = True
End Sub

위와 같이 영문 문자열을 비교할때
If TypeName(shtX) = "Chart" Then
보다는
If Ucase(TypeName(shtX))="CHART" Then
혹은
If LCase(TypeName(shtX))="chart" Then
과 같이 대문자,소문자를 통일 시켜주는것이 좋은 습관이다

VBA의 TypeName,LCase,UCase함수를 잘 기억하시고 있는것이 좋다

아래의 그림을 보면 Worksheet "keyword","checklist","picsheet","studio" 4장
"Chart2","Chart3"라는 이름의 Chart시트가 2장 들어있다
이것들에 각각 어떻게 접근할수 있는지 보도록 한다


아래의 명령문을 크릭해 보시기 바란다
Sheets(Array("keyword","checklist","picsheet")).Select
Sheets.Select
Worksheets.Select
Charts.Select
Sheets("sudio").Select 혹은 Worksheets("studio").Select

오브젝트에 접근하는 방법을 이렇게 다양하게 제공하고 있는것이고
편리한것을 사용하면 되는것이다
Worksheets라는 집합체오브젝트와 더불어 Sheets라는 집합체오브젝트를
같이 생각하는것이 좋을것이다
만약 워크시트 "keyword","checklist","picsheet" 3장을 한꺼번에 인쇄하고 싶다면

Sheets(Array("keyword","checklist","picsheet")).PrintOut
혹은
Worksheets(Array("keyword","checklist","picsheet")).PrintOut

이라고 하면 된다
VBA에서 보았던 Array함수가 여기에서 유용하게 활용된다는점
다시 한번 확인하시고

워크시트가 있는지 없는지 알아보기

프로그래밍에서 어떤 작업을 하던 어떤 상태인지 알아보는것은
참으로 중요하다
엑셀워크시트에서도 정보함수라고 하는 카테고리의 함수들을 보았을것이다
여기에서는 Worksheet라는 오브젝트가 어떠한 상황인지 알아야 하는 경우다
"Sample_X"라는 이름의 시트를 만들고 싶다면
우선 어떤 정보를 얻어야 한다
"Sample_X"라는 이름의 시트가 이미 존재하는지 알아야 한다
물론 존재하는데 삽입을 하려고 한다면 당연히 에러가 나게 되는것이고
또한 "Sample_X"라는 시트를 삭제하고 싶다면
존재하지도 않는 "Sample_X"라는 시트를 삭제한다면 이것도 에러의 원인이 된다
이것을 알아내는 속성이나 메소드는 없다
이럴때는 만들어서 사용하는것이다..아래와 같이

워크시트존재여부 확인 정보함수_1 워크시트존재여부 확인 정보함수_2

이미 앞페이지에서 사용하였던 함수를 다시 올려 놓은 것이다
프로그래밍에서
작업을 하기전에 상황파악이 중요하다는것을 강조하기 위함이다
또한 프로그래밍에서 어떻게 작성하느냐의 원칙은 없다
VBA의 문법을 지킨다면 자유롭게 스스로 다르게 만들어서 사용할수 있는것이다
그래서 위에도 목적은 같지만 두가지를 올려놓은것이다