• 최초 작성일: 2003-04-25
  • 최종 수정일: 2022-07-10
  • 조회수: 167,638 회
  • 작성자: 엑셀러 권현욱
  • 강의 제목: 워크시트 개체 ㅡ Worksheet Object

엑셀러 권현욱

들어가기 전에

거의 4개월 만에 VBA 입문 강의를 재개합니다. 그 동안 많은 변화가 있었습니다. 이제나 저제나 본 강좌만을 기다려온 분들(...이 과연 얼마나 될 지는 알기 어렵지만 ^^)께 죄송하단 말씀을 드립니다. 앞으로도 뜨문뜨문 강의가 되지 않으리란 보장을 할 수 없음에 미리 죄송해 하면서...



워크북 오브젝트의 하위에 있는 오브젝트 중 하나로서 워크시트를 만들어 주는 것이 워크시트 오브젝트 Worksheet Object입니다. 워크북 오브젝트와 마찬가지로 워크시트 오브젝트도 Worksheets라는 컬렉션과 Worksheet 오브젝트가 있습니다. 컬렉션 오브젝트에 대해서는 지난 시간 강의를 참고하세요.

워크시트 개체 (Worksheet Object)

워크시트 오브젝트란 '워크시트 그 자체'를 말합니다. 우리가 돈을 빌리려면 우선 돈을 가진 사람이 누구인지를 알고 있어야 가서 사정을 하든, 협박(?)을 하든 해도 하겠지요? 워크시트의 이름을 바꾼다거나 셀에 어떤 값을 입력하고자 할 때에도 마찬가지입니다.

Sub FindActiveSheetName()
    MsgBox "지금 보시는 시트는 " & ActiveSheet.Name & "입니다"
End Sub

CODE

이 코드를 실행하면 현재 시트ActiveSheet의 이름을 MsgBox에 표시해줍니다.

MsgBox는 지정한 명령을 수행하고 난 결과를 화면에 표시해 주는 함수입니다. Activesheet.Name은 지금 선택되어 있는 시트(ActiveSheet)의 이름(Name)을 알아내라는 명령입니다. Active라는 단어는 ActiveCell, ActiveWindow, ActivePane, ActiveWorkbook, ActiveChart 등과 같이 자주 사용되는 것이므로 잘 기억해 두시기 바랍니다. 다른 사람에게 일을 시킬 때, " 철수야, 물 좀 떠와!"라고 할 수도 있지만, "거기 움직이는 녀석, 물 좀 떠와!"라고 할 수도 있겠지요? 이 때 후자에 해당되는 표현이라고 이해하시면 되겠습니다.

워크시트 삽입하기

워크시트를 삽입하려면 Add 메서드를 사용합니다. 다음 프로시저를 실행하면 현재 시트 앞(왼쪽)에 새로운 워크시트가 하나 삽입됩니다.

Sub AddWorkSheet()
    Worksheets.Add
End Sub

CODE

Add 메서드 뒤에 after, Count 인수를 추가하면 시트를 삽입할 위치와 삽입 매수를 지정할 수 있습니다.

Sub AddWorkSheet2()
    Worksheets.Add after:=Worksheets(1), Count:=2
End Sub

CODE

시트 선택하기

시트를 선택할 때에는 Select 메서드를 이용합니다. Select 대신 Activate를 사용할 수도 있습니다. 어느 경우든 선택하려는 시트가 당연히 있어야 오류가 발생하지 않겠지요?

Sub SelectSheet()
    Worksheets("Sheet1").Select
End Sub

CODE

시트 선택하고 이름 바꾸기

시트를 선택할 때에는 Select 메서드를 이용합니다. Select 대신 Activate를 사용할 수도 있습니다. 어느 경우든 선택하려는 시트가 당연히 있어야 오류가 발생하지 않겠지요?

Sub RenSheetName()
    Worksheets("Sheet2").Activate
    ActiveSheet.Name = "MySheet"
End Sub

CODE

딱 한 줄이 추가 되었네요.

ActiveSheet.Name = "MySheet"
현재시트.이름 = "MySheet", 즉 현재 활성화된 시트 이름을 MySheet로 바꾸어라

수학에서는 A = B라고 하면 'A와 B는 같다'라는 뜻이지만 프로그래밍에서는 '우측의 값을 좌측(변수)에 대입하라'는 의미입니다. 다만 If 조건문에서 'If A = B'라고 하면 A와 B가 같은지 여부를 비교합니다.

시트 이동, 복사하기

만약 after 인수를 생략하여, Worksheets("Sheet1").Move라고만 하면 어떤 일이 생길까요? 직접 한번 해 보세요.(^^)

Sub SheetMove()
    Worksheets("Sheet1").Move after:=Worksheets("Sheet3")
    ' Sheet1을 Sheet3 뒤(오른쪽)로 이동'
End Sub

CODE

시트를 이동하는 것이 아니라 복사를 하려면? 짐작하시겠습니다만, Move 대신 Copy 메서드를 사용하면 됩니다.

시트 삭제하기

시트를 삭제할 때에는 Delete 속성을 사용합니다. 그런데 시트를 삭제하려고 하면 그림과 같은 메시지가 나타나므로 '삭제' 버튼을 매번 눌러주어야 하는 번거로움이 있습니다.

시트 삭제 시 나타나는 경고 메시지

이것을 해결하기 위해 DisplayAlerts 속성을 사용하여 코드를 작성합니다.

Sub DeleteSheet()
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
End Sub

CODE

강의를 보시는 분 중에는 '뭐 이런 걸 일일이 설명하나? 그리고 이런 토막 토막난 것을 배워서 뭐에 써 먹나?' 하는 분이 저어~기 일곱 분 계시는군요.(^^) 쉬운 것을 잘 알아야 어려운 것에 응용할 수 있습니다. 어설프게 10개를 아는 것보다 하나를 알더라도 확실하게 알고 있어야 응용력이 생깁니다.

워크시트는 얼마나 클까? (디지털북스, "엑셀 XP - 예제 활용" 50 Page에서 편집 인용)

산술적으로 계산해 보면 하나의 워크시트는 16,777,216개의 셀로 구성되어 있습니다. 만약 여러분이 VBA 표준 모드에서 행 높이와 열 너비를 변경하지 않았다면 18개의 행과 9개의 열, 따라서 162개의 셀을 한 화면에서 볼 수 있을 것입니다. 이것은 전체 워크시트의 0.001 퍼센트밖에 안 됩니다. 다시 말해서 현재 화면에 나타난 영역의 104,000 배나 되는 정보가 하나의 워크시트 안에 들어갈 수 있다는 의미입니다.

만약 여러분이 워크시트의 모든 셀에 1초에 한 글자씩 잠도 안자고, 밥도 안먹고, 쉬지도 않고 입력한다고 가정하면 194일 정도가 소요됩니다. 그리고 이렇게 입력한 것을 프린터로 출력하면 A4 용지로 36,000장 이상의 출력물이 나오는데, 이것을 쌓아놓으면 대략 2m 정도가 됩니다. 셀의 디폴트 크기 기준으로 출력해 보면 하나의 셀은 가로 20.4mm, 세로 4.8mm 정도 됩니다. 따라서 하나의 워크시트는 가로 522m, 세로 314.5m 정도의 크기가 됩니다. 이것을 100% 배율로 A4 용지에 출력해서 한데 모아보면 축구장 크기 정도 됩니다...(중략)...

모든 시트 이름 표시하기

이번에는 현재 워크북에 어떤 시트들이 있는지 알아내라고 엑셀에게 일을 시켜 볼까요?

Sub WhatsInThisbook()
    Dim strName() As String
    Dim strTemp As String
    Dim i As Integer
    Dim intCount As Integer
    intCount = Sheets.Count
    ReDim strName(1 To intCount) As String

    For i = 1 To intCount
        strName(i) = Sheets(i).Name
        strTemp = strTemp & strName(i) & vbLf
    Next i
    MsgBox strTemp
End Sub

CODE

수행하는 기능이 복잡하니 코드 또한 어지럽지요?(조금만 알고나면 아무 것도 별 것 아닙니다) 위 프로시저를 실행하면 워크북 내에 있는 모든 시트 이름이 메시지 박스에 표시됩니다.

로드 중...

위 코드에서는 배열 Array이라는 것을 사용하였습니다. 배열이란 쉽게 설명하자면 '같은 성격을 가진 변수의 집합'이라고 할 수 있습니다. 배열에 대해서는 나중에 변수에 대해 살펴볼 때 자세히 다룰 예정이므로 '이런 것도 있구나' 정도만 이해하고 넘어가도 전혀 지장이 없겠습니다.

이번 시간에는 여기까지...