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

WorkSheet|Index|Worksheets.Add|Worksheets.Add.Name|
|Do While~Loop|Delete|InStr()|Split()|Move|
|Application.DisplayAlerts|WorkBook_NewWorkSheet|
|Exit Function|Sort|Offset|

Range오브젝트를 담고 있는 오브젝트..즉 Range오브젝트의
Parent속성으로 얻어 올수 있는 오브젝트가 워크시트오브젝트이다
직접실행창에 아래명령을 하나씩 실행해보면..

MsgBox (ActiveCell.Parent.Name)
MsgBox (Activesheet.Name)
MsgBox (workSheets(ActiveSheet.Index).Name)

모두 같은 결과인것을 볼수있다
이렇게 같은 Name이라는 속성값을 얻기 위해서는 다양한 접근방법이 있다!!
Name속성뿐아니라..오브젝트의 족보(Hierarchy)를 알아가게 되면
자연스럽게 원하는 작업을 수행하는 오브젝트에 접근하게 된다

워크시트오브젝트는
또한 Range오브젝트만 자식으로 데리고 있는것이
아니라 다양한 오브젝트들을 갖고 있다
오브젝트들을 하나..하나 설명하는데 있어서 계속 중복되는것이 나타날것이다
그러니 Range오브젝트의 기초를 Range오브젝트부분에서
감을 대강 잡은 셈이고 이제 다른 오브젝트를 살펴 보면서
반복하여 나올것이니..
이해못하고 왔더라도 걱정하지 않아도 된다
실은 엑셀의 모든것이 Range오브젝트가 기본이고 나머지 오브젝트는
페이지의 이름만 바꿔서 소개할뿐..Range오브젝트의 확장적 설명이다

워크시트를 10장을 만들고 이름을 짓고 정렬하기

워크시트를 생성하는것은 간단하다
VB편집기의 직접실행창(Immediate Window)에서
아래와 같이 입력하고 엔터키를 쳐라!!

WorkSheets.Add

정말 간단하네..
시트로 돌아 가보니 워크시트가 한장 삽입되었음을 보았을것이다



10장을 만든다면 그냥 순환문 열번 돌리면 되겠다
이번에는 시트의 생성과 동시에 이름을 지어 줘보자

마찬가지로 직접실행창에

WorkSheets.Add.Name="Sample"

이라고 입력한후 Enter키를 치면 아래의 그림과 같이



순간적으로 생성됨을 볼수 있다
그럼 생성된 워크시트의 범위(Range오브젝트)에 값을 넣어볼까??
WorkSheets.Add.Range("A1:K20")="X"

라고 입력하고 엔터키를 쳐보시기 바란다
그리고 워크시트로 가보면 지정된 범위에 "X"라는 값이 입력된것을
볼수 있을것이다

WorkSheets.Add.Name="Sample"

Worksheets집합체오브젝트의 Add메소드에 의하여
새로운 Worksheet오브젝트가 만들어지고 만들어진 오브젝트의
Name속성을 사용하는 순간적으로 이루어지는 한줄의 명령인것이다
실은 위의 것은 아래와 같이 표현하는것이 좋을것이다

Dim shtX As WorkSheet
Set shtX=WorkSheets.Add
shtX.Name="Sample"

그러나 만들어낸 오브젝트의 하나의 속성값만 주는 간략한 작업
이라서 WorkSheets.Add.Name="Sample"로 할수도 있다는 이야기다

그럼 이름도 지어주고 범위에 값도 주고 싶다면 어떻게 할까??
직접실행창은 한줄의 명령문만 실행할수 있으므로
이름짓는것 한번 명령하고 범위에 값넣는것 또 한번 해야 한다
그래서 명령의 묶음 프로시져가 필요하다
그림 아래의 버튼을 크릭하면 ..


Sub Test()   
Dim shtX As WorkSheet
Set shtX=Worksheets.Add
  With shtX
    .Name="Sample2"
    .Range("A1:D8")="XXX"
  End With
End Sub

직접실행창에서 프로시져의 이름인 Test를 입력하고 엔터키를
치도(아래의 그림과 같이)실행된다!#@!



Range오브젝트는 정해진 시트의 행과 열로 제한되지만
다른 오브젝트들은 대개가..Add하면 추가생성된다
그리고 해당오브젝트에 접근만 하면 이런 작업..저런작업
손으로 하던 작업을 마음대로 자동화할수 있는것이다

초보님들은 궁금한것이 있을것이다
위의 작업은 범위에 모두 같은 값이 들어갔다
범위내의 각각의 셀에 다른 값을 넣으려면 어떻게 해야되나??
초보님은 궁금하다..아직 오브젝트,순환문들에 대한 감각이 없는 분들
그래서 하나 더 해보자 위의 범위의 각각의 셀에 값을 넣는 작업을

Sub Test1()
Dim shtX As Worksheet, rX As Range Dim iX As Integer Set shtX = Worksheets.Add With shtX .Name = "Sample3" For Each rX In .Range("A1:D8").Cells iX = iX + 1 rX = iX Next End With End Sub

아래의 화일에서는
시트를 생성하고
각각 이름을 짓고
이름을 엑셀의 시트의 범위에 모아서
Range오브젝트의 Sort메소드를 사용하여 원하는 방향을 정렬하고
정렬된 상태의 정보를 읽어서
Worksheet오브젝트의 Move메소드를 활용하여
Worksheet위치를 재배치시킨다
모든 정보는 변수를 만들어서 사용하는 습관이 좋다
또한 각각의 작업내용별로 프로시져를 별도로 작성하는 습관을
갖도록 하고 메인프로시져만 사용자가 매크로상자에서
볼수 있도록 하고 다른 프로시져는 눈에 보이지 않게 처리하는것이 좋다
또한 Range오브젝트의 Offset속성도 활용해본다

Add Sheet And Sort By Sheet Name

워크시트를 삽입할때..같은 이름의 시트가 있는지 확인이 필요하다

어떤 오브젝트나 마찬가지 이지만
같은 이름을 갖고 있는
WorkSheet오브젝트를 생성한다면 이름의 충돌로 인하여 에러가 난다
프로그래머는 사전에 이런것을 방지 하는 습관을 갖어야 한다
WorkSheet를 삽입하고 이름을 "Sample"이라고 지어주려고 하는데
같은 이름이 있는지 없는지 확인을 하고 싶다 있다면
일련번호를 붙여가면서 중복되지 않는 이름을 지어주고
싶은것이다
중복되는 이름인지 아닌지 확인하는 함수를 아래와 같이 하나 만들고
함수의 결과값(Return Value)가 참인지 거짓인지에 따라서
다음 작업을 하고 싶은것이다

Function IsSheetExist(sSheetName As String)
On Error GoTo X
If ThisWorkBook.Worksheets(sSheetName).Name <> "" Then
    IsSheetExist= True
    Exit Function
End If
X:
IsSheetExist = False
End Function

위의 함수를 좀더 개선하여 중복되면 일련번호를
붙여서 새로운 이름을 리턴값으로 돌려주는 함수를 만들어서
아래와 같이 해볼수 있을것이다



아래의 화일에는 계속 시트를 삽입하면서 중복되는 이름을
발견하면 일련번호를 붙여 나간다
Do While~Loop순환문의 쓰임새를 다시 살펴 보고
시트를 삭제할때 메시지박스가 나타나게 하지 않으려면
어떤 오브젝트의 어떤 속성이 필요한지 보고
추가된 Worksheet오브젝트를 삭제(Delete) 할때는 어떻게 할지..
InStr,Split함수의 응용을 한다


Add Worksheet With Serial Number

워크시트를 추가하지 못하게 하고 싶을때..

경우에 따라서는 사용자가 워크시트를
추가하지 못하게 하고 싶을때도 있을것이다
추가하려는 순간 발생하는 이벤트가 있고 해당 이벤트프로시져에서
취소를 시키면 된다
VB편집기의 프로젝트장에서 ThisWorkBook을
더블크릭하면 그림과 같이 통합문서의 모듈시트가 열린다



이 이벤트프로시져에 아래와 같은 구문을 작성하면
시트의 추가는 불가능해진다

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Application.DisplayAlerts = False
MsgBox "시트를 추가 못함!!",,"UNO21.COM"
Sh.Delete
Application.DisplayAlerts = True
End Sub

실은 추가 못하게 하는것이 아니고
추가되자 마자 삭제한것이다
통합문서의 Workbook_NewSheet이벤트는 통합문서내에 시트를 삽입하는
순간 발생하는 이벤트이다