※ 오늘 Daily Tip은 곽승주님이 제공해주신 내용입니다.
파워포인트의 작업이 슬라이드에서 이루어지듯이 엑셀에서 대부분의 작업은 워크시트에서 이루어집니다.
그리고 워크시트에서 작업이 이루어지려면 워크시트를 참조하는 것이 우선입니다.
하늘을 봐야 별도 따고 언덕이 있어야 소도 비빌 테니 말이죠.
그런데 기껏 참조해둔 워크시트가 사용자가 삭제하거나 이름을 변경하는 경우 에러와 소개팅 하게
될 판 일겁니다.
대개의 경우 워크시트를
참조한다면 워크시트의 이름이나 인덱스번호를 사용합니다.
또 워크시트를 가리키는 개체의 이름을 사용합니다.
다음은 그러한 예입니다.
Worksheets(1) |
인덱스번호를 사용하는 경우 |
Worksheets(“Main”) |
워크시트의 이름을 사용하는 경우 |
Sheet1 |
개체의 이름을 사용하는 경우 |
만일 인덱스번호
‘1’이
‘Main’
워크시트를 참조하도록 했지만 사용자가 워크시트의 이름을 변경한다면 곤란합니다.
이를 확인하는 길은 둘의 인덱스 번호를
확인하는 것입니다.
Sub ReferToWorksheet()
Dim wkSheetByIndex As Worksheet
Dim wkSheetByName As Worksheet
Set wkSheetByIndex =
Worksheets(1)
Set wkSheetByName = Worksheets("Main")
If wkSheetByIndex.Index =
wkSheetByName.Index Then
Debug.Print "1번 워크시트이름은
Main입니다"
Else
Debug.Print "1번 워크시트이름은
Main이 아닙니다"
End If
End Sub |
그래서 필자는 이러한 난점을
피하기 위해 Sheet1, Sheet2 등등과 같이 바로
개체이름을 사용하여 참조합니다.
워크시트만을 참조하는 방식은
아니지만
For Each~Next에서는
여러 장의 워크시트를 편리하게 다음과 같이 참조할 수
있습니다.
Sub ReferToWorksheets()
Dim wksCurrent As Worksheet
For Each wksCurrent In
ThisWorkbook.Worksheets
...(워크시트 작업)...
Next
End Sub |
위의 코드는 모든 워크시트를
순환하면 작업을 합니다. 그러나 일부를 생략하거나 일부만을
다루는 경우 어떤가요? If문을 사용하여 워크시트의 이름을
판단하여 작업을 차별적으로 해야겠죠.
Sub ReferToWorksheets()
Dim wksCurrent As Worksheet
For Each wksCurrent In
ThisWorkbook.Worksheets
If wksCurrent.Name <> "Main" Then
...(워크시트 작업)...
End If
Next
End Sub |
위의 코드는
Main이라는 워크시트를 제외하고 작업을
하는 경우입니다.
그러나 일부를 제외하는 것이
아니라 일부만을 포함하는 경우
Array()함수를 사용하여 다음과 같이
작업할 수 있습니다.
Sub ReferToWorksheets()
Dim wksCurrent As Worksheet
For Each wksCurrent In
ThisWorkbook.Worksheets(Array("Sheet2",
"Sheet3"))
Next
End Sub |
위에서
Array()함수는
"Sheet2",
"Sheet3"라는
워크시트이름을 돌려주게 됩니다. 따라서 모든 워크시트가
아닌 일부 워크시트를 대상으로 For Each~Next문을
사용하게 됩니다.
|