본문 바로가기

진리는어디에/VBA

[VBA] Workbook 완벽 가이드

처음엔 굼뜨고 보잘것 없는 프로그래밍 언어라고 생각했는데 적당한 중소형 규모 데이터를 처리하는데 이 보다 좋은 툴이 없습니다. 데이터 시트와 그걸 다루기 위한 유용한 함수들을 제공해주고, 함수를 지원하지 못한다면 직접 만들어 사용 할 수 있도록 스크립트도 지원합니다. 유저 컨트롤을 마음대로 붙여 넣을 수 있으며, 데이터 프로세싱 로직도 마음대로 추가 할 수 있습니다. 세상에 적당한(?) 규모의 데이터를 처리하기에는 이보다 더 좋은 도구를 찾지 못하겠습니다. 역시 오랜 기간 사람들에게 사랑 받아 온 제품은 다 이유가 있구나라는 생각이 드네요.

그래서 조금 더 알아 보고 싶어 지네요..❤

아래 내용들은 Excel Macro MasteryThe Complete Guide To The VBA Workbook by Paul Kelly의 내용을 공부하면서 기록한 내용입니다. 제가 잘 못 이해한 부분이 있다면 코멘트 주시면 감사하겠습니다.

VBA Workbook 사용법 요약

Task How To
열려 있는 워크북 개체에 이름을 이용해 접근하기 Workbooks("Example.xlsx")
열려 있는 워크북 개체에 인덱스를 이용해 접근하기 Workbooks(<index>)
열려 있는 가장 처음 워크북 개체에 인덱스 이용해   접근하기 Workbooks(1)
열려 있는 가장 마지막 워크북 개체에 인덱스 이용해   접근하기 Workbooks(Workbooks.Count)
현재 활성화 되어 있는(보고 있는) 워크북 개체에   접근하기 ActiveWorkbook
실행 되고 있는 VBA 코드를 소유하고 있는 워크북   개체에 접근하기 ThisWorkbook
워크북 변수 선언하기 Dim wk As Workbook
워크북 변수 할당하기 Set wk = Workbooks("Example.xlsx")
Set wk = ThisWorkbook
Set wk = Workbooks(1)
워크북 활 성화 시키기 Workbooks(1).Activate
wk.Activate
워크북 저장하기 wk.Save
워크북 복사본을 다른 이름으로 저장하기 wk.SaveCopyAs   "C:\Copy.xlsm"
워크북 다른 이름으로 저장하기 wk.SaveAs   "Backup.xlsx"
워크북이 닫혀 있다면 복사하기 FileCopy   "C:\File1.xlsx", "C:\Copy.xlsx"
저장하지 않고 워크 북 닫기 wk.Close SaveChanges:=False
저장하고 워크북 닫기 wk.Close SaveChanges:=True
새로운 워크북 생성하기 Set wk = Workbooks.Add
워크북 열기 Set wk = Workbooks.Open("C:\Somewhere\SomeFile.xlsx")
읽기 전용으로 워크북 열기 Set wk = Workbooks.Open("C:\Somewhere\SomeFile.xlsx",   ReadOnly:=True)
워크북이 존재하는지 체크하기
(파일 존재 여부 체크하기)
If Dir("C:\Somewhere\SomeFile.xlsx") = "" Then
    MsgBox "File does not exist"
End if
워크북이 열려있는지 체크하기 아래 '워크북이 열려 있는지 체크하기' 섹션 참고
모든 워크북 순회하기 For Each wk In Application.Workbooks
    Debug.Print wk.FulllName
Next wk
파일 다이얼로그로 워크북 열기 아래 '파일 다이얼로그로 워크북 열기' 섹션 참고

NOTE - '워크북이 열려 있다'라는 뜻은 엑셀 어플리케이션이 실행 되고 있다는 뜻입니다.

시작하기

워크북을 다루려면 먼저 워크북이 뭔지 알아야 합니다. 워크북은 여러장의 워크시트가 묶여진 책(또는 서류철)이라고 생각하면 됩니다. 엑셀을 실행하면 화면에 가장 먼저 보이는 통합문서가 바로 워크북입니다. 이 워크북은 엑셀 VBA의 '개체'라고 불리는 것중의 한 종류 입니다. '개체'에는 워크시트, 셀등이 있지만 이번 포스트에서는 워크북에 대해서 집중 하도록하겠습니다.

워크북은 Workbooks("Example.xlsm")이라는 코드로 접근 가능합니다. 간단히 "Example.xlsm"을 내가 원하는 엑셀 파일 이름으로 변경하면 됩니다. 

아래 예제는 어떻게 엑셀 워크 시트의 셀에 값을 쓰는지 보여 줍니다. 어떻게 워크북과 워크시트, 셀을 지정하는지 주목해주세요.

Public Sub WriteToA1()
    'MyVBA.xlsm의 Sheet1워크시트 A1 셀에 100을 입력
    Workbooks("MyVBA.xlsm").Worksheets("Sheet1").Range("A1") = 100
End Sub

첫번째 점(.)까지가 워크북을 지정하는 부분입니다. 그리고 두번째는 워크시트, 마지막 Range가 셀을 지정하는 부분입니다.

Public Sub WriteToMulti()

    ' MyVBA.xlsm의 Sheet1워크시트 A1 셀에 100을 입력
    Workbooks("MyVBA.xlsm").Worksheets("Sheet1").Range("A1") = 100

    ' MyVBA.xlsm의 Sheet1워크시트 B1 셀에 John을 입력
    Workbooks("MyVBA.xlsm").Worksheets("Sheet1").Range("B1") = "John"

    ' MyVBA.xlsm의 Accounts워크시트 A1 셀에 100을 입력
    Workbooks("MyVBA.xlsm").Worksheets("Accounts").Range("A1") = 100

    ' Book.xlsx의 Sheet2워크시트 D3 셀에 날짜를 입력
    Workbooks("Book.xlsx").Worksheets("Sheet2").Range("D3") = "1\1\2016"

End Sub

이쯤 되면 여러분은 아마 위 예제들로 부터 간단한 규칙을 찾으셨을 겁니다. 간단하게 워크북이나 워크시트의 이름을 변경하거나, 셀의 범위를 변경하는 것만으로 여러분은 어떠한 워크북, 워크시트, 셀이든 값을 변경 할 수 있습니다.

Troubleshooting

컴파일 오류입니다: 속성의 사용이 잘못되었습니다.

  • 워크북 개체에 대한 아무런 참조 없이 Workbooks("Example.xlsx")만 사용하였을 때 발생하는 컴파일 오류 입니다. Set wk = Workbooks("Example.xlsx") 또는 Workbooks("Example.xlsx").Worksheet...와 같이 개체에 접근하는 코드의 추가가 필요합니다.

'9' 런타임 오류가 발생하였습니다: 아래 첨자 사용이 잘못 되었습니다.

  • 대상 엑셀 파일이 닫혀 있을 수 있습니다. 대상 엑셀을 실행 시켜주세요
  • 대상 엑셀 파일의 경로가 잘못 되었을 수 있습니다. 경로가 올바른지, 스펠링이 틀리지 않았나 확인 해주세요.
  • 만일 여러분이 새로운 워크북을 생성 하였다면 최초 저장전 까지는 Workbooks("...")와 같은 방법으로 접근이 불가능 합니다. 저장을 해주십시오.
  • 엑셀 2007/2010의 경우, 엑셀 어플리케이션 인스턴스를 동시에 여러개 실행 시켰을 때, 현재 활성화 되어 있는 워크북만 접근 가능합니다.
  • 예를 들어 현재 두개의 엑셀 인스턴스가 실행 되고 있는 Workbooks(3)과 같이 현재 열려있는 워크북 카운트 보다 큰 인덱스를 이용해 접근하려 하고 있을 수 있습니다.

VBA 워크북 사용 예제

아래의 예제는 워크북을 어떻게 사용 할 수 있는지에 대한 예를 보여 줍니다. 
NOTE - 아래 예제를 이해하기 위해 Test1.xlsx, Test2.xlsx 두 엑셀 워크북을 실행 시키고 있다고 가정하겠습니다.

Public Sub WorkbookProperties()

    ' 열려있는 워크북 개수 출력
    Debug.Print Workbooks.Count

    ' 워크북 Test1.xlsx의 전체 경로 출력
    Debug.Print Workbooks("Test1.xlsx").FullName

    ' 워크북의 전체 경로를 메시지박스에 출력
    MsgBox Workbooks("Test1.xlsx").FullName

    ' Test2.xlsx의 워크시트 개수 출력
    Debug.Print Workbooks("Test2.xlsx").Worksheets.Count

    ' Test2.xlsx의 현재 활성화된 워크시트 이름을 출력
    Debug.Print Workbooks("Test2.xlsx").ActiveSheet.Name

    ' Test1.xlsx 워크북 닫기
    Workbooks("Test1.xlsx").Close

    ' Test2.xlsx 워크북 저장 및 닫기
    Workbooks("Test2.xlsx").Close SaveChanges:=True

End Sub

NOTE - 위 예제에서 사용하는 Debug.Print의 내용을 확인하기 위해서는 '직접 실행 창'을 띄워야 한다. 직접 실행창은 단축키 Ctrl + G를 이용하거나 메뉴 '보기 -> 직접 실행 창'을 선택하면 된다.

인덱스를 이용해 워크북에 접근하기

이름 뿐만 아니라 인덱스를 이용해서도 워크북에 접근할 수 있습니다. 인덱스는 워크북이 실행 되거나 생성된 순서입니다. 예를 들어 Workbooks(1)은 가장 처음 먼저 열린 워크북을 참조 합니다. Workbooks(2)는 두번째고..세번째, 네번째 역시 같은 형식입니다.

' 첫번재 열린 워크북
Debug.Print Workbooks(1).Name

' 세번째 열린 워크북
Debug.Print Workbooks(3).Name

' 가장 마지막 열린 워크북
Debug.Print Workbooks(Workbooks.Count).Name

위 예제에서 Workbooks.Count는 현재 열려 있는 워크북의 개수를 리턴합니다. 그래서 가장 마지막에 열린 워크북을 접근하느데 사용 할 수 있었습니다. 사실 워크북을 인덱스로 접근한다는 것은 썩 좋은 생각은 아닙니다. 인덱스를 사용 할 때 마다 매번 어떤 순서로 워크시트가 열렸었는지 체크 해봐야 하기 때문이죠. 이런 이유로 인덱스를 이용한 워크북에 대한 접근 보다는 이름을 이용하시는 것을 강력하게 권합니다.

모든 워크북 찾기

가끔 전체 워크북들에 접근하여 무엇인가를 해야 할 필요가 있을 때가 있습니다. 간단합니다. Workbooks를 순회하면 됩니다.

    ' For Each를 이용해 순회
    Dim wrk As Workbook
    For Each wrk In Workbooks
        Debug.Print wrk.FullName
    Next wrk


    ' For를 이용해 순회
    Dim i As Long
    For i = 1 To Workbooks.Count
        Debug.Print Workbooks(i).FullName
    Next i

위 두 예제는 모두 처음 열린 순서 부터 마지막 열린 순서로 워크북 인덱스 순서에 따라 순회 합니다. 만일 반대 방향으로 순회를 원한다면 아래와 같이 할 수 있습니다.

    Dim i As Long
    For i = Workbooks.Count To 1 Step -1
        Debug.Print Workbooks(i).FullName
    Next i

워크북 열기

지금까지는 열려 있는 워크북을 다루는 방법만을 살펴 보았습니다. 물론 자동화 이슈로 매크로에서 닫혀 있는 워크북을 자동으로 열여야 하는 이슈도 있습니다. 아래 부터는 워크북을 여는 방법에 대해서 살펴 보겠습니다.

    ' C:\Docs\Book1.xlsm 워크북 열기
    Workbooks.Open ("C:\Docs\Book1.xlsm")

    ' 워크북 내 워크시트 카운트 출력하기
    Debug.Print Workbooks("Book1.xlsm").Worksheets.Count

    ' 저장하지 않고 워크북 종료하기
    Workbooks("Book1.xlsm").Close saveChanges:=False

만일 워크북을 열기 전에 해당 파일이 존재하는지 체크하고 싶다면 아래 예제 처럼 Dir을 이용하시면 됩니다.

    If Dir("C:\Docs\Book1.xlsm") = "" Then
        ' 파일이 존재 하지 않음. 유저에게 알림
        MsgBox "Could not open the workbook. Please check it exists"
    Else
        ' 파일이 존재 하는 경우 워크북을 염
        Workbooks.Open("C:\Docs\Book1.xlsm")
    End If​

NOTE - 절대 경로가 아닌 상대 경로를 사용하고 싶다면 ThisWorkbook 또는 ActiveWorkbook의 Path 프로퍼티를 이용하면 됩니다(ThisWorkbook과 ActiveWorkbook에 대한 설명은 아래 섹션에서 나옵니다).

Workbooks.Open(ThisWorkbook.Path & "\" & "Example.xlsx")

워크북이 열려 있는지 체크하기

만일 당신이 워크북을 Read-Only 목적으로 연다면 이미 다른 곳에서 워크북이 열려 있다고 하더라도 아무런 문제가 되지 않습니다. 당신은 워크북에 아무런 변경도 하지 않을 것이니까요. 하지만 업데이트를 위해 워크북을 연다면 다른 곳에서 해당 워크북을 열고 있는지 체크하는것이 좋습니다. 만일 양쪽에서 데이터를 동시에 수정하게 된다면 데이터가 깨져버리니까요.

아래의 함수는 워크북이 현재 열려있는지 여부를 체크하는데 사용 될 수 있습니다. 만일 해당 워크북이 열려 있지 않았다면 정상적으로 열것이고, 열려 있었다면 열려 있는 워크북을 리턴하고 종료 합니다.

Function GetWorkbook(ByVal sFullFilename As String) As Workbook
    
    Dim sFilename As String
    sFilename = Dir(sFullFilename)
    
    On Error Resume Next
    Dim wk As Workbook
    Set wk = Workbooks(sFilename)
    
    If wk Is Nothing Then
        Set wk = Workbooks.Open(sFullFilename)
    End If
    
    On Error Goto 0
    Set GetWorkbook = wk
    
End Function

위 함수는 아래 처럼 사용 될 수 있습니다

Sub ExampleOpenWorkbook()

    Dim sFilename As String
    sFilename = "C:\Docs\Book2.xlsx"

    Dim wk As Workbook
    Set wk = GetWorkbook(sFilename)
    
End Sub

이 코드는 대부분의 경우에서는 정상적으로 동작합니다. 하지만 워크북이 Read-only 모드로 열려있거나 여러 분과는 다른 목적을 가진 다른 유저에 의해 여러분 보다 먼저 열렸 있을 수도 있습니다. 이런 상황에서 가장 손쉬은 해결 방법은 기존 열려 있는 워크시트를 돌려 주는 것이 아니라 기존 어플리케이션을 닫으라고 에러 메시지를 보여주고 실행을 중단 시키는 것입니다.

Function IsWorkBookOpen(strBookName As String) As Boolean
    
    Dim oBk As Workbook
    
    On Error Resume Next
    Set oBk = Workbooks(strBookName)
    On Error GoTo 0
    
    If Not oBk Is Nothing Then
        IsWorkBookOpen = True
    End If
    
End Function

위 함수는 아래 예제 처럼 사용 될 수 있습니다. 이미 워크북이 열려 있다면 열려 있는 워크북 개체를 돌려 주는 것이 아니라 에러 메시지를 출력하고 프로시져를 종료 합니다.

Sub ExampleUse()

    Dim sFilename As String
    sFilename = "C:\temp\writedata.xlsx"

    If IsWorkBookOpen(Dir(sFilename)) = True Then
        MsgBox "File is already open. Please close file and run macro again."
        Exit Sub
    End If
    
    ' Write to workbook here
    
End Sub

워크북 닫기

워크북을 닫기 위해서는 Close 메소드를 사용하면 됩니다.

wk.Close

일반적으로 VBA 코드에서 워크북을 닫으려할 때, 엑셀이 파일을 저장하시겠습니까 라고 물어 오는 것이 상당히 귀찮을 수 있습니다. 그것을 방지하기 위해서는 워크북을 저장 할지 말지 명시적으로 지정함으로써 엑셀이 메시지를 띄우는 것을 방지 할 수 있습니다.

' Don't save changes
wk.Close SaveChanges:= False

' Do save changes
wk.Close SaveChanges:= True

워크북 저장하기

워크북을 저장하고자 한다면 간단하게 Save 메소드를 호출합니다.

wk.Save

다른 이름으로 저장하기 위해 SaveAs를 사용 할 수도 있습니다.

wk.SaveAs "C:\Backups\accounts.xlsx"

워크북 복사하기

만일 워크북이 열려 있는 상태라면 SaveAs, SaveCopyAs 메소드를 이용해서 워크북의 복사본을 만들 수 있습니다. 하지만 워크북을 열지 않고 복사하려면 FileCopy를 사용하면 됩니다.

FileCopy "C:\Docs\Docs.xlsm", "C:\Docs\Example_Copy.xlsm"

파일 다이얼로그로 워크북 열기

이전 섹션에서는 파일 이름으로 워크북을 여는 것에 대해 알아 보았습니다. 하지만 때때로 유저가 원하는 워크북을 선택해야 할 경우도 있습니다. 이럴 때 윈도우 파일 다이얼로그를 이용 할 수 있습니다.

만일 단순히 유저가 파일 선택하기만 하면 되는 경우는 GetOpenFilename을 사용하면 됩니다.

' Print the name of the selected file
sfile = Application.GetOpenFilename("Excel Files (*.xlsx),*.xlsx,Excel Macro (*.xlsm),*.xlsm")
Debug.Print sfile

아래 함수는 파일 다이얼로그를 이용해 워크북을 엽니다. 파일이 선택 되었을 경우 해당 파일의 전체 경로를 리턴하며, 만일 유저가 파인 선택을 취소하였을 경우 메시지를 보여주고 빈 문자열을 리턴합니다.

Public Function UserSelectWorkbook() As String

    On Error Goto ErrorHandler

    Dim sWorkbookName As String

    Dim FD As FileDialog
    Set FD = Application.FileDialog(msoFileDialogFilePicker)

    ' Open the file dialog
    With FD
        ' Set Dialog Title
        .Title = "Please Select File"

        ' Add filter
        .Filters.Add "Excel Files", "*.xls;*.xlsx;*.xlsm"

        ' Allow selection of one file only
        .AllowMultiSelect = False

        ' Display dialog
        .Show

        If .SelectedItems.Count > 0 Then
            UserSelectWorkbook = .SelectedItems(1)
        Else
            MsgBox "Selecting a file has been cancelled. "
            UserSelectWorkbook = ""
        End If
    End With

    ' Clean up
    Set FD = Nothing
Done:
    Exit Function
ErrorHandler:
    MsgBox "Error: " + Err.Description
End Function

만일 여러분이 이 함수를 사용한다면 필수적으로 유저가 선택을 취소하는 케이스에 대해서도 처리를 해야 합니다. 아래 예제는 UserSelectWorkbook 함수를 호출하는 방법과 유저의 취소에 대응하는 방법을 담고 있습니다.

Public Sub TestUserSelect()

    Dim userBook As Workbook, sFilename As String

    ' Call the UserSelectworkbook function
    sFilename = UserSelectWorkbook()

    ' If the filename returns is blank the user cancelled
    If sFilename <> "" Then
        ' Open workbook and do something with it
        Set userBook = Workbooks.Open(sFilename)
    End If

End Sub

ThisWorkbook 사용하기

ThisWorkbook은 Workbooks() 대신 현재 워크북에 접근할 수 있는 단축 방법입니다. 만일 여러분이 MyVBA.xlsm 에서 ThisWorkbook 또는 Workbooks("MyVBA.xlsm")을 호출한다면 똑같은 워크북 개체가 리턴 됩니다. ThisWorkbook을 이용하여 현재 워크북 개체에 접근하면 :

  • 파일 이름을 변경한다고 하더라도 코드에 영향을 미치지 않습니다.
  • 다른 워크북으로 코드를 복사한다고 하더라도 코드에 영향을 미치지 않습니다.

이게 사소한 장점 같지만 실제 작업을 하다보면 파일 이름이 변경 되는 경우가 종종 있는데 그 때마다 코드를 추적하여 모든 파일 이름을 사용하는 부분을 수정한다는 것은 여간 고된 일이 아닙니다. ThisWorkbook 사용합시다. 두번 사용합시다.

ActiveWorkbook 사용하기

ActiveWorkbook은 현재 활성화 되어 있는 워크북을 참조합니다. 여기서 '현재 활성화 된' 워크북이란 유저가 가장 마지막 클릭한 워크북을 의미합니다.

ThisWorkbook과 비슷해서 헷깔리실수 있는데 ThisWorkbook은 VBA 스크립트가 속한 프로젝트의 워크북을 리턴하고 ActiveWorkbook은 마지막으로 선택된(클릭된) 워크북을 리턴합니다. 예를 들어 아래와 같이 '통합 문서 1.xltm'과 '통합 문서 2.xlsx', 두 개의 프로젝트가 동시에 열려 있다고 가정하고 아래의

Public Sub PrintCurrentWorkbook()
    Debug.Print ThisWorkbook.Name
    Debug.Print ActiveWorkbook.Name
End Sub

PrintCurrentWorkbook이 '통합 문서 1.xltm'에 정의 되어 있다고 가정하겠습니다.

'통합 문서 1.xltm'에서 PrintCurrentWorkbook() 프로시져를 호출하면 ThisWorbook은 '통합 문서 1.xltm'에 속해 있으므로 '통합 문서 1.xltm'을 출력하고, ActiveWorkbook 또한 '통합 문서 1.xltm'을 출력합니다. 하지만 '통합 문서 2.xlsx'에서 PrintCurrentWorkbook() 프로시져를 호출하면 ThisWorbook은 '통합 문서 1.xltm'에 속해 있으므로 '통합 문서 1.xltm'을 출력하고, ActiveWorkbook 또한 '통합 문서 2.xlsx'를 출력하게 됩니다.

NOTE - 언뜻 보면 ActiveWorkbook이 상당히 유용 할 것 같지만 마지막 선택 했던 워크북이 무엇이냐에 따라 ActiveWorkbook이 가리키는 워크북이 달라지게 되므로 원하지 않는 워크북에 실수로 엉뚱한 작업을 진행 할 수 있습니다. 따라서 ActiveWorkbook을 사용하여 코드를 작성하게 된다면 여러모로 주의가 필요 합니다.

워크북에 접근 하는 예제

    ' 열려있는 "MyVBA.xlsm" 워크북에 접근합니다.
    Debug.Print Workbooks("MyVBA.xlsm").FullName

    ' 현재 VBA 스크립트가 속해 힜는 워크북에 접근합니다.
    Debug.Print ThisWorkbook.FullName

    ' 가장 처음 열린 워크북에 접근합니다.
    Debug.Print Workbooks(1).FullName

    ' 가장 마지막에 열린 워크북에 접근합니다.
    Debug.Print Workbooks(Workbooks.Count).FullName

    ' 가장 마지막에 클릭 된 워크북에 접근합니다.
    Debug.Print ActiveWorkbook.FullName

    ' 워크북이 명시되지 않은 경우 현재 활성화 된(마지막 클릭된) 워크북에 접근합니다.
    Debug.Print Worksheets("Sheet1").Name

    ' 열려 있지 않은 C:\Docs\Book1.xlsm 워크북에 접근 합니다.
    Workbooks.Open ("C:\Docs\Book1.xlsm")
    Debug.Print Workbooks("Book1.xlsm").FullName
    Workbooks("Book1.xlsm").Close

워크북 변수 선언하기

    Dim wrk As Workbook
    Set wrk = Workbooks.Open("C:\Docs\Book1.xlsm")

    ' Print number of sheets in each book
    Debug.Print wrk.Worksheets.Count
    Debug.Print wrk.Name

    wrk.Close

새로운 워크북 생성하기

새로운 워크북을 생성하기 위해서는 Add 메소드를 사용해야 합니다. 이 메소드는 새로운 빈 워크북을 생성합니다. 이것은 엑셀 메뉴에서 새로운 엑셀 파일을 만드는 것과 동일한 역할을 합니다.

    Dim wrk As Workbook
    Set wrk = Workbooks.Add

    ' Save as xlsx. This is the default.
    wrk.SaveAs "C:\Temp\Example.xlsx"

    ' Save as a Macro enabled workbook
    wrk.SaveAs "C:\Temp\Example.xlsm", xlOpenXMLWorkbookMacroEnabled

만일 엑셀에서 새로운 파일을 생성하는 것 처럼 Sheet1, Sheet2, Sheet3...와 같은 기본 워크시트를 포함하여 생성하고 싶다면 Application.SheetsInNewWorkbook 프로퍼티에 기본 생성 할 워크시트의 개수를 입력하면 됩니다. 단, Add 메소드 호출 이전에 지정해야 합니다.

Public Sub AddNewWorkbookWithSheets()
    Dim sheetCnt As Long
    sheetCnt = Application.SheetsInNewWorkbook

    Dim wk As Workbook
    
    Application.SheetsInNewWorkbook = 5
    
    Set wk = Workbooks.Add
    wk.SaveAs ThisWorkbook.Path & "\" & "Example.xlsx"
    Application.SheetsInNewWorkbook = sheetCnt
End Sub

워크북에 With 키워드 적용하기

With 키워드는 VBA 개체의 프로퍼티들을 보다 간단한 코드를 이용해 사용 할 수 있도록 해주는 키워드 입니다. 아래의 예제는 동일 기능을 워크북의 프로퍼티에 개별 코드로 접근하는 방법과 With 키워드를 이용해 접근하는 방법을 보여 주고 있습니다.

' Not using the With keyword
Public Sub NoUsingWith()

   Debug.Print Workbooks("Book2.xlsm").Worksheets.Count
   Debug.Print Workbooks("Book2.xlsm").Name
   Debug.Print Workbooks("Book2.xlsm").Worksheets(1).Range("A1")
   Workbooks("Book2.xlsm").Close

End Sub

' Using With makes the code easier to read
Public Sub UsingWith()

    With Workbooks("Book2.xlsm")
        Debug.Print .Worksheets.Count
        Debug.Print .Name
        Debug.Print .Worksheets(1).Range("A1")
        .Close
    End With

End Sub

요약

  • 현재 코드를 소유하고 있는 워크북 개체에 접근 하기 위해 ThisWorkbook을 사용하세요.
  • 열려 있는 워크북에 접근하기 위해선 Workbooks("Example.xlsx")를 사용하세요.
  • 워크북을 열기 위해선 Set wk = Workbooks.Open("C:\Foler\Example.xlsx")를 사용하세요.
  • 열려 있는 워크북을 복사하기 위해서는 SaveAs 메소드를 이용하세요.
  • 열려 있지 않은 워크북을 복사하기 위해서는 FileCopy함수를 이용하세요.
  • 코드를 간단하게 하고 싶다면 With 키워드를 적극 활용하세요.

부록 1. 같이 보면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!