배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   워크시트, 개체
제목:   워크시트를 더듬어 찾아 봅시다.
     
 

새 페이지 1

  STEP> 따라하기


※ 오늘 Daily Tip은 곽승주님이 제공해주신 내용입니다.

파워포인트의 작업이 슬라이드에서 이루어지듯이 엑셀에서 대부분의 작업은 워크시트에서 이루어집니다. 그리고 워크시트에서 작업이 이루어지려면 워크시트를 참조하는 것이 우선입니다. 하늘을 봐야 별도 따고 언덕이 있어야 소도 비빌 테니 말이죠. 그런데 기껏 참조해둔 워크시트가 사용자가 삭제하거나 이름을 변경하는 경우 에러와 소개팅 하게 될 판 일겁니다.

대개의 경우 워크시트를 참조한다면 워크시트의 이름이나 인덱스번호를 사용합니다. 또 워크시트를 가리키는 개체의 이름을 사용합니다. 다음은 그러한 예입니다.

Worksheets(1)  인덱스번호를 사용하는 경우
Worksheets(Main) 워크시트의 이름을 사용하는 경우
Sheet1 개체의 이름을 사용하는 경우

만일 인덱스번호 1Main 워크시트를 참조하도록 했지만 사용자가 워크시트의 이름을 변경한다면 곤란합니다. 이를 확인하는 길은 둘의 인덱스 번호를 확인하는 것입니다.

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문을 사용하게 됩니다.