Exceller Home > VBA 강좌 > VBA 입문강좌

Exceller's VBA 입문강좌

최초 작성일 : 2003-04-25
최종 수정일 : 2004-12-03
작성자 : Exceller(권현욱, exceller@amorepacific.com)

강좌 읽음 수 : 133,831

강좌 제목 : 워크시트 오브젝트

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


VBA 입문강좌 : 중요한 오브젝트 몇 가지


가. 워크북 오브젝트(Workbook Object)

나. 워크시트 오브젝트(Worksheet Object)

다. 레인지 오브젝트(Range Object)


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

  컬렉션에 대해 살펴보기

워크시트 오브젝트(Worksheet Object)

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

Sub FindActiveSheetName()

    MsgBox "지금 보시는 시트는 " & ActiveSheet.Name & "입니다"

End Sub

이 코드를 실행시키면 현재 시트ActiveSheet의 이름을 알려줍니다.

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

워크시트 삽입하기

Sub AddWorkSheet()

    Worksheets.Add

End Sub

워크시트를 삽입하려면 Add 메서드를 사용하여 위와 같이 하면 됩니다. '삽입-워크시트' 메뉴를 선택하거나 위의 프로시저를 실행하면 현재 시트의 왼쪽에 새로운 워크시트가 한 장 삽입됩니다.

워크시트 삽입하기2 : 삽입 위치와 매수 함께 지정하기

Sub AddWorkSheet2()

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

End Sub

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

시트 선택하기

Sub GoToSheet2()

    Worksheets("Sheet2").Activate

End Sub

이 때 Activate 대신 Select 메서드를 사용해도 결과는 동일합니다. 물론 Sheet2라는 시트가 당연히 있어야 오류가 발생하지 않겠지요?

시트 선택하고 이름 바꾸기

Sub RenSheetName()

    Worksheets("Sheet2").Activate

    ActiveSheet.Name = "MySheet"

End Sub

딱 한 줄이 추가 되었네요.
ActiveSheet.Name = "MySheet"
현재시트.이름 = "MySheet", 즉 현재 활성화된 시트 이름을 MySheet로 바꾸어라

보통 수학에서 A=B라고 하게 되면 'A와 B는 같다'라는 것으로 인식되나 프로그래밍에 있어서는 우측의 값을 좌측으로 대입하라'는 의미입니다. 다만 If 조건문에서는 If A=B 라고 하면 A와 B가 같은지 다른지를 비교합니다.

시트 이동 / 복사하기

Sub SheetMove()
    Worksheets("Sheet1").Move after:=Worksheets("Sheet3")
End Sub

만약 after 인수를 생략하여, Worksheets("Sheet1").Move 라고만 하면 어떤 일이 생길까요? 직접 한번 해 보세요. ^^ 시트를 이동하는 것이 아니라 복사를 하려면... 짐작하시겠습니다만, Move 대신 Copy 메서드를 사용하시면 되겠습니다.

시트 삭제하기

Sub DeleteSheet()

    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True

End Sub

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

이것을 해결하기 위해 DisplayAlerts 속성을 사용하여 위의 프로시저와 같이 해줍니다.

 

  워크시트는 얼마나 클까?(디지털북스, "엑셀 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 용지에 출력해서 한데 모아보면 아무 축구장 크기 만할 것입니다...(중략)...

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

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

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


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

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

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


Previous

Next

Creative Commons License