Excel 2010에서 VBA 사용 시작

요약: 아직 프로그래머는 아닌 Excel 고급 사용자를 위해 Excel 2010의 VBA(Visual Basic for Applications)에 대해 소개합니다. 이 문서에는 VBA 언어의 개요, Excel 2010에서 VBA에 액세스하는 방법에 대한 지침, 실제 Excel 프로그래밍 문제를 해결하는 방법에 대한 자세한 설명, 그리고 프로그래밍 및 디버깅 팁이 포함되어 있습니다(인쇄 페이지 14쪽).

마지막 수정 날짜: 2009년 12월 11일 금요일

커뮤니티 구성원 아이콘 Ben Chinowsky(SDK Bridge)

이 문서의 내용
Excel 2010에서 VBA를 사용하는 이유
VBA 프로그래밍 101
매크로 및 Visual Basic Editor
실제 예
기록된 코드 수정
VBA로 수행할 수 있는 추가 작업
다음 작업
추가 자료

2009년 11월

적용 대상: Excel 2010 | Office 2010 | SharePoint Server 2010 | VBA | Visual Basic for Applications (VBA)

목차

  • Excel 2010에서 VBA를 사용하는 이유

  • VBA 프로그래밍 101

  • 매크로 및 Visual Basic Editor

  • 실제 예

  • 기록된 코드 수정

  • VBA로 수행할 수 있는 추가 작업

  • 다음 작업

  • 추가 자료

Excel 2010에서 VBA를 사용하는 이유

Microsoft Excel 2010은 데이터를 조작, 분석 및 표시하는 데 사용할 수 있는 매우 효율적인 도구입니다. 표준 Excel UI(사용자 인터페이스)에서 다양한 기능 집합이 제공되기는 하지만, 반복적인 일상 작업 또는 UI를 통해서는 처리하지 못하는 작업을 좀 더 편리하게 수행할 수 있는 방법이 필요한 경우도 있습니다. Excel 등의 Office 응용 프로그램에서는 응용 프로그램을 확장할 수 있도록 하는 VBA(Visual Basic for Applications)라는 프로그래밍 언어가 제공됩니다.

VBA는 Visual Basic으로 작성된 단계별 프로시저인 매크로를 실행하는 방식으로 작동합니다. 프로그래밍 방법을 익히는 것은 어려워 보일 수도 있지만, 인내심을 가지고 이 문서에서 제공하는 것과 같은 예를 사용해 보면 대부분의 사용자가 아주 적은 양의 VBA 코드만으로도 작업을 더 쉽게 수행할 수 있으며 기존에는 불가능했던 작업을 Office에서 완료할 수 있게 될 것입니다. VBA를 어느 정도만 파악하고 나면 다양한 관련 작업 방법을 훨씬 쉽게 익힐 수 있으므로 무한한 가능성이 제공됩니다.

현재 Excel에서 VBA는 반복 작업을 자동화하는 데 가장 흔히 사용됩니다. 예를 들어 수십 개의 통합 문서에 각각 포함되어 있는 수십 개의 워크시트를 변경해야 한다고 가정해 보겠습니다. 고정 셀 범위에 새 서식을 적용하는 간단한 변경을 수행할 수도 있고, 각 시트에 있는 데이터의 통계적 특성을 찾아 해당 특성이 적용된 데이터를 표시하는 데 가장 적합한 차트 유형을 선택한 다음 그에 따라 차트를 만들고 서식을 지정하는 복잡한 변경을 수행할 수도 있습니다.

어떤 변경을 수행하든 여러 번 반복해야 한다면 수동 작업은 효율적이지 못할 것입니다. 그 대신 VBA를 통해 Excel에서 따를 명시적 지침을 작성하여 작업을 자동화할 수 있습니다.

또한 VBA는 반복 작업 자동화 이외의 용도로도 활용할 수 있습니다. VBA를 사용하여 Excel에 새 기능을 추가할 수도 있고(예: 새로운 데이터 분석 알고리즘을 개발한 다음 Excel의 차트 기능을 사용하여 결과 표시) Microsoft Access 2010 등의 다른 Office 응용 프로그램과 Excel을 통합하는 작업을 수행할 수도 있습니다. 실제로 모든 Office 응용 프로그램 중에 Excel은 일반 개발 플랫폼으로 가장 많이 사용됩니다. 목록과 통계를 사용하는 모든 작업 외에도 개발자는 데이터 시각화에서 소프트웨어 원형 생성에 이르기까지 광범위한 작업에서 Excel을 활용합니다.

이처럼 Excel 2010에서 VBA를 사용하면 매우 효율적이기는 하지만, VBA를 전혀 사용하지 않고도 효율적으로 해결할 수 있는 문제도 있습니다. Excel에는 VBA 외에도 유용한 기능이 다수 포함되어 있으므로 고급 사용자라도 모든 기능을 파악할 수는 없습니다. 따라서 VBA 솔루션 작성을 시작하기 전에 도움말과 온라인 리소스를 철저하게 검색하여 더 간단한 방법이 없는지를 확인하십시오.

VBA 프로그래밍 101

응용 프로그램에서 작업을 자동으로 수행하도록 하는 코드 작성

코드 작성 작업은 까다롭고 어렵다고 생각하는 사용자가 많지만, 기본적인 코드 작성 원칙은 일반적인 논리를 사용하며 쉽게 파악할 수 있습니다. Office 2010 응용 프로그램은 명령을 수신할 수 있는 개체라는 항목을 표시하는 방식으로 작성됩니다. 사용자는 응용 프로그램의 여러 개체로 명령을 보내는 방식으로 응용 프로그램과 상호 작용하게 됩니다. 응용 프로그램에는 이러한 개체가 다수 포함되어 있으며, 응용 프로그램마다 서로 다른 유형의 개체를 유동적으로 사용할 수 있지만 제한도 있습니다. 즉, 각 개체는 원래 지정된 작업만 수행할 수 있으며 사용자가 명령하는 작업만 수행합니다.

개체

프로그래밍 개체는 응용 프로그램의 개체 모델이라는 계층 구조 내에서 서로 체계적으로 관련됩니다. 개체 모델은 사용자 인터페이스에 표시되는 항목과 대략적으로 일치합니다. 예를 들어 Excel 개체 모델에는 Application, Workbook, Sheet, Chart 등의 개체가 포함됩니다. 개체 모델은 응용 프로그램 자체와 해당 기능의 개념적 '지도'라고 할 수 있습니다.

속성 및 메서드

개체의 속성을 설정하고 메서드를 호출하여 개체를 조작할 수 있습니다. 속성을 설정하면 개체의 일부 품질이 변경되고, 메서드를 호출하면 개체가 특정 작업을 수행합니다. 예를 들어 Workbook 개체에는 통합 문서를 닫는 Close 메서드와 통합 문서에서 현재 활성 상태인 시트를 나타내는 ActiveSheet 속성이 있습니다.

컬렉션

통합 문서, 워크시트 등 대부분의 개체에는 단일 버전과 다중 버전이 있는데, 다중 버전을 컬렉션이라고 합니다. 컬렉션 개체는 컬렉션에 포함된 여러 항목에 대해 작업을 수행하는 데 사용됩니다. 이 문서의 뒷부분에서는 Worksheets 컬렉션을 사용하여 통합 문서에서 각 워크시트의 이름을 변경하는 방법에 대해 설명합니다.

매크로 및 Visual Basic Editor

지금까지 Microsoft Excel 2010에서 개체 모델을 표시하는 방식에 대해 대략적으로 살펴보았습니다. 이러한 정보를 바탕으로 하여 실제로 개체 메서드를 호출하고 개체 속성을 설정할 수 있습니다. 이렇게 하려면 Office에서 이해할 수 있는 방식으로 적절한 위치에서 코드를 작성해야 합니다(일반적으로 Visual Basic Editor 사용). Visual Basic Editor는 기본적으로 설치되지만, 리본 메뉴에서 사용하도록 설정하기 전까지는 Visual Basic Editor가 제공된다는 사실조차 모르는 사용자도 많습니다.

개발 도구 탭

모든 Office 2010 응용 프로그램에서는 리본 메뉴가 사용됩니다. 리본 메뉴에는 개발 도구라는 탭이 있는데, 이 탭에서 Visual Basic Editor 및 기타 개발자 도구에 액세스할 수 있습니다. Office 2010에서 개발 도구 탭은 기본적으로 표시되지 않으므로, 다음 절차를 통해 사용하도록 설정해야 합니다.

개발 도구 탭을 사용하도록 설정하려면

  1. 파일 탭에서 옵션을 선택하여 Excel 옵션 대화 상자를 엽니다.

  2. 대화 상자 왼쪽에서 리본 사용자 지정을 클릭합니다.

  3. 대화 상자 왼쪽의 다음에서 명령 선택에서 많이 사용하는 명령을 선택합니다.

  4. 대화 상자 오른쪽의 리본 메뉴 사용자 지정에서 기본 탭을 선택하고 개발 도구 확인란을 선택합니다.

  5. 확인을 클릭합니다.

Excel에서 개발 도구 탭이 표시되면 이 탭에서 Visual Basic, 매크로매크로 보안 단추의 위치를 확인하십시오.

그림 1. Excel 2010의 개발 도구 탭

Excel 2010의 개발 도구 탭

보안 문제

실행 가능한 매크로 및 매크로 실행 조건을 지정하려면 매크로 보안 단추를 클릭합니다. 매크로 코드를 잘못 작성하면 컴퓨터가 심각하게 손상될 수 있지만, 유용한 매크로 실행을 방지하는 보안 조건이 있으면 생산성이 크게 떨어질 수 있습니다. 매크로 보안은 복잡하며 Excel 매크로를 사용하는 경우에는 매크로 보안 관련 항목을 파악하고 이해해야 합니다.

이 문서의 예제를 수행할 때는 매크로가 포함된 통합 문서를 열 때 워크시트와 리본 메뉴 사이에 보안 경고: 매크로를 사용할 수 없도록 설정했습니다. 표시줄이 나타나는 경우 콘텐츠 사용 단추를 클릭하여 매크로를 사용하도록 설정할 수 있다는 점을 염두에 두십시오.

또한 보안을 위해 매크로는 기본 Excel 파일 형식(.xlsx)으로 저장할 수 없으며 특수한 확장명(.xlsm)이 지정된 파일에 저장해야 합니다.

Visual Basic Editor

다음 절차에서는 매크로를 저장할 빈 통합 문서를 새로 만드는 방법에 대해 설명합니다. 통합 문서를 만들어 .xlsm 형식으로 저장할 수 있습니다.

빈 통합 문서를 새로 만들려면

  1. 개발 도구 탭의 매크로 단추를 클릭합니다.

  2. 매크로 대화 상자가 나타나면 매크로 이름에 Hello를 입력합니다.

  3. 만들기 단추를 클릭하여 Visual Basic Editor를 엽니다. 그러면 개요가 이미 입력된 상태로 새 매크로가 열립니다.

VBA는 완전한 기능을 갖춘 프로그래밍 언어로, 역시 완전한 기능을 갖춘 해당 프로그래밍 환경을 제공합니다. 이 문서에서는 프로그래밍을 시작하는 데 사용하는 도구만 살펴볼 것이며, Visual Basic Editor에서 제공되는 대부분의 도구는 여기에 포함되지 않습니다. 따라서 Visual Basic Editor 왼쪽의 속성 창은 닫고, 코드 위에 나타나는 드롭다운 목록 두 개는 무시하면 됩니다.

그림 2. Visual Basic Editor

Visual Basic Editor

그림에 나와 있는 것처럼 Visual Basic Editor에는 다음 코드가 포함되어 있습니다.

Sub Hello()

End Sub

Sub는 이제 "매크로"로 정의할 수 있는 서브루틴을 의미합니다. Hello 매크로를 실행하면 Sub Hello()와 End Sub 사이에 있는 모든 코드가 실행됩니다.

이제 매크로를 다음 코드와 같이 편집합니다.

Sub Hello()
   MsgBox ("Hello, world!")
End Sub

Excel의 개발 도구 탭으로 돌아와서 매크로 단추를 다시 클릭합니다.

그런 다음 목록이 나타나면 Hello 매크로를 선택하고 실행을 클릭하면 "Hello, world!"라는 텍스트가 포함된 작은 메시지 상자가 표시됩니다.

지금까지 Excel에서 사용자 지정 VBA 코드를 작성하고 구현해 보았습니다. 메시지 상자의 확인을 클릭하여 메시지 상자를 닫고 매크로 실행을 완료합니다.

메시지 상자가 나타나지 않으면 매크로 보안 설정을 확인하고 Excel을 다시 시작하십시오.

매크로에 쉽게 액세스할 수 있도록 설정

보기 탭에서 매크로 대화 상자에 액세스할 수도 있지만, 매크로를 자주 사용하는 경우에는 바로 가기 키 또는 빠른 실행 도구 모음 단추를 통해 매크로에 보다 편리하게 액세스할 수 있습니다.

Hello 매크로에 해당하는 단추를 빠른 실행 도구 모음에 만들려면 다음 절차를 수행합니다.

다음 절차에서는 빠른 실행 도구 모음에 매크로 단추를 만드는 방법을 설명합니다.

빠른 실행 도구 모음에 매크로 단추를 만들려면

  1. 파일 탭을 클릭합니다.

  2. 옵션을 클릭하여 Excel 옵션 대화 상자를 열고 빠른 실행 도구 모음을 클릭합니다.

  3. 다음에서 명령 선택: 아래의 목록에서 매크로를 선택하고, 목록이 나타나면 Book1!Hello와 비슷한 텍스트를 찾아 선택합니다.

  4. 추가 >> 단추를 클릭하여 매크로를 오른쪽 목록에 추가한 다음 수정... 단추를 클릭하여 매크로와 연결할 단추 이미지를 선택합니다.

  5. 확인을 클릭하면 새 단추가 파일 탭 위의 빠른 실행 도구 모음에 표시됩니다.

이제 개발 도구 탭을 사용하지 않아도 매크로를 언제든지 빠르게 실행할 수 있습니다. 직접 단추를 추가해 보시기 바랍니다.

실제 예

통합 문서의 여러 워크시트에 목록이 포함되어 있는데 각 워크시트의 이름을 해당 워크시트에 있는 목록 제목과 일치하도록 변경하려는 경우를 가정해 보겠습니다. 모든 워크시트에 목록이 있는 것은 아니지만 목록이 있는 워크시트의 경우 목록 제목은 B1 셀에 있으며, 목록이 없는 워크시트에서는 B1 셀이 비어 있습니다. 목록이 없는 워크시트 이름은 그대로 유지해야 합니다.

일반적으로 이러한 작업을 수행하려면 각 워크시트에서 목록이 있는지 확인하고 목록이 있는 경우 제목을 복사한 다음 워크시트 탭을 클릭하고 새 이름을 붙여 넣는 복잡한 과정을 수행해야 합니다. 이 모든 단계를 수동으로 수행하는 대신 Excel VBA를 사용하면 시트 이름을 자동으로 바꿀 수 있습니다.

개체 정보

VBA 프로그래밍 관련 문제를 해결하려면 먼저 코드에서 조작할 개체를 확인해야 합니다. 해당 정보를 찾으려면 MSDN(Microsoft Developer Network)에서 제공되는 Excel 2007 개발자 참조에 포함된 Excel 개체 모델 참조(영문일 수 있음)를 사용해야 합니다.

이러한 참조 자료는 Excel 2010이 공식 출시되면 업데이트될 예정이지만, 현재 제공되고 있는 Excel 2007 개발자 참조도 대부분의 Excel 2010 작업에 적합합니다.

그림 3. MSDN의 Excel 개체 모델 참조

MSDN의 Excel 개체 모델 참조

먼저 작업을 수행하기 위해 사용해야 하는 특정 개체(예: 워크시트, 워크시트 이름, 셀, 셀 내용 등)를 조작하는 방법을 파악합니다. Excel에서는 이를 위해 최소한 두 가지 방법이 제공됩니다.

  • 개체 모델 참조로 직접 이동합니다.

  • 자동화하려는 일부 작업을 기록하고 기록된 코드가 개체를 조작하는지 확인한 후에 개체 모델 참조에서 추가 정보를 확인합니다.

상황별로 적절한 방식에 따라 사용 가능한 옵션도 달라집니다. 여기서는 매크로 레코더를 먼저 사용해 보겠습니다.

매크로 레코더 사용

간단한 매크로를 기록하는 것만으로 작업을 수행할 수 있는 경우도 있으며, 이러한 경우에는 코드를 확인할 필요가 없습니다. 매크로 기록 자체만으로도 충분한 경우가 많으며, 그렇지 않은 경우에는 매크로를 기록한 후에 다음 프로세스를 수행하면 됩니다.

솔루션 작성 시 먼저 매크로 레코더를 사용하려면

  1. 코딩할 작업을 기록합니다.

  2. 코드를 검토하여 해당 작업을 수행하는 줄을 찾습니다.

  3. 나머지 코드를 삭제합니다.

  4. 기록된 코드를 수정합니다.

  5. 매크로 레코더가 기록할 수 없는 변수, 컨트롤 구문 및 기타 코드를 추가합니다.

워크시트 이름을 New Name으로 바꾸는 매크로를 기록하여 작업에 대한 조사를 시작합니다. 그런 후에 기록된 매크로를 사용하여 해당 내용에 따라 여러 워크시트의 이름을 바꾸는 매크로를 개발할 수 있습니다.

워크시트 이름을 바꾸는 매크로를 기록하려면

  1. 개발 도구 탭에서 매크로 기록을 클릭합니다.

  2. 매크로 이름을 RenameWorksheets로 지정하고 Sheet1의 이름을 New Name으로 바꾼 후에 기록 중지를 클릭합니다.

  3. 개발 도구 또는 보기 탭으로 이동하여 매크로 단추를 클릭하고 편집을 선택하여 Visual Basic Editor를 엽니다.

현재 Visual Basic Editor의 코드는 다음과 같습니다.

Sub RenameWorksheets()
'
' RenameWorksheets Macro
'
'
    Sheets("Sheet1").Select
    Sheets("Sheet1").Name = "New Name"
End Sub

여기서 Sub 줄 뒤의 첫 네 줄은 주석입니다. 아포스트로피로 시작하는 모든 줄은 주석이며 매크로의 동작에 영향을 주지 않습니다. 주석은 주로 다음과 같은 용도로 사용합니다.

  • 코드 작성자와 나중에 코드를 수정해야 할 수 있는 다른 사용자가 모두 코드를 보다 쉽게 이해할 수 있도록 합니다.

  • 코드 줄을 일시적으로 사용하지 않도록 설정(주석 처리)합니다.

이 기록된 매크로에서 주석 네 줄은 둘 중 어느 용도로도 사용되지 않으므로 삭제합니다.

그 다음 줄은 Select 메서드를 사용하여 Sheets 컬렉션 개체의 Sheet1 구성원을 선택합니다. VBA 코드에서는 보통 개체를 조작하기 전에는 선택할 필요가 없으며, 이 작업은 매크로 레코더가 수행합니다. 즉, 이 코드 줄은 중복되므로 역시 삭제해도 됩니다.

기록된 매크로의 마지막 줄은 Sheets 컬렉션에 있는 Sheet1 구성원의 Name 속성을 수정합니다. 이 줄은 유지해야 합니다.

이와 같이 변경하여 기록된 코드는 다음과 같습니다.

Sub RenameWorksheets()
    Sheets("Sheet1").Name = "New Name"
End Sub

New Name 시트를 수동으로 다시 Sheet1로 변경하고 매크로를 실행해 보십시오. 그러면 이름이 New Name으로 다시 바뀝니다.

기록된 코드 수정

이제 매크로 레코더에서 사용된 Sheets 컬렉션을 조사해 보겠습니다. 개체 모델 참조의 시트 항목에는 다음과 같은 텍스트가 포함되어 있습니다.

"Sheets 컬렉션은 Chart 또는 Worksheet 개체를 포함할 수 있습니다. 한 가지 유형의 시트만 사용해야 하는 경우에는 해당 시트 유형의 개체 항목을 참조하십시오."

여기서는 Worksheets만 사용할 것이므로 코드를 다음과 같이 변경합니다.

Sub RenameWorksheets()
    Worksheets("Sheet1").Name = "New Name"
End Sub

반복

현재까지 작성한 코드에는 워크시트 하나만 변경한다는 제한이 있습니다. 이름을 바꿀 각 워크시트에 대해 다른 줄을 추가할 수 있지만, 워크시트 수나 워크시트의 현재 이름을 모르는 경우에는 다른 코드 줄을 추가하기가 어렵습니다. 따라서 통합 문서의 각 시트에 대해 특정 규칙을 적용하는 방법을 파악해야 합니다.

VBA에는 이러한 용도로 사용하기에 적합한 For Each 루프라는 구문이 있습니다. For Each 루프는 Worksheets와 같은 컬렉션 개체의 각 항목을 검사하며, 이러한 항목 중 일부 또는 모든 항목에 대해 이름 변경 등의 작업을 수행하는 데 사용할 수 있습니다.

For Each 루프에 대한 자세한 내용은 VBA 언어 참조(영문일 수 있음)를 참조하십시오. "Visual Basic 개념 항목"을 클릭한 후에 "For Each...Next 문 사용"을 클릭하면 됩니다. VBA 언어 참조는 개체 모델 참조와 마찬가지로 유용한 정보를 다수 포함하며 코드 작업 시 문제가 발생하는 경우 효율적인 해결 방법을 제공합니다.

"For Each...Next 문 사용" 항목의 세 번째 예제를 참조하여 매크로를 다음 코드와 같이 편집합니다.

Sub RenameWorksheets()
For Each myWorksheet In Worksheets
    myWorksheet.Name = "New Name"
Next
End Sub

myWorksheet는 변수이므로 나타내는 값이 상황에 따라 바뀝니다. 이 예제에서 myWorksheet 변수는 Worksheets 컬렉션의 각 워크시트를 연속해서 나타냅니다. myWorksheet를 사용할 필요는 없으며 "x", "ws", "WorksheetToRenameAfterTheContentsOfCellB1" 또는 원하는 거의 모든 이름(몇 가지 제한은 있음)을 사용할 수 있습니다. 변수의 의미를 쉽게 파악할 수 있는 긴 변수 이름을 사용하는 것이 좋기는 하지만 이름이 너무 길면 코드가 복잡해지므로 주의해야 합니다.

현재 상태에서 매크로를 실행하면 오류가 발생합니다. 통합 문서에서 각 워크시트의 이름은 고유해야 하는데 다음 줄은 모든 워크시트에 같은 이름을 적용하도록 Excel에 명령하기 때문입니다.

    myWorksheet.Name = "New Name"

For Each 루프가 작동하는지 확인할 수 있도록 이 줄을 수정하려면 다음과 같이 변경합니다.

    myWorksheet.Name = myWorksheet.Name & "-changed"

이 줄은 각 워크시트에 같은 이름을 지정하는 대신 각 워크시트의 현재 이름(myWorksheet.Name)을 현재 이름에 "-changed"가 붙은 형태로 변경합니다.

유용한 이름 바꾸기 방법

이제 매크로가 원하는 작업을 수행할 수 있는 형태에 가까워졌습니다. 다음으로는 워크시트 자체의 정보(각 워크시트의 B1 셀에 있는 정보)를 가져와서 워크시트 이름으로 적용하는 방법을 파악해야 합니다.

이번에는 매크로 레코더를 사용하여 셀 참조 방법을 확인하는 대신 Cell이라는 개체를 사용할 수 있는지 살펴보겠습니다. 그런데 개체 모델 참조를 열어 Cell 개체를 검색해 보면 그런 개체는 없음을 확인할 수 있습니다. 대신 CellFormat 개체(영문일 수 있음)는 있습니다.

CellFormat 개체 항목의 첫 번째 코드 예제에는 다음과 같은 코드가 있습니다.

    ' Set the interior of cell A1 to yellow.
    Range("A1").Select

이 코드에서 확인할 수 있는 것처럼, Range를 사용하여 셀 범위나 셀 하나를 지정합니다. 여기서도 .Select 부분은 필요하지 않지만 Range 개체 자체가 아닌 Range 개체의 내용을 참조하는 방법을 찾아야 합니다. Range 개체 항목으로 이동해 보면 Range에는 Methods와 Properties가 모두 있다는 내용이 있습니다. Range의 내용은 동작이 아닌 항목이므로 Property일 것입니다. 목록 아래쪽을 보면 Value 속성이 있으므로, 코드를 다음과 같이 변경해 보겠습니다.

Sub RenameWorksheets()
For Each myWorksheet In Worksheets
    myWorksheet.Name = myWorksheet.Range("B1").Value
Next
End Sub

포함된 워크시트의 B1 셀이 비어 있는 통합 문서에서 이 코드를 실행하면 오류가 발생합니다. 빈 Range의 Value는 ""(빈 텍스트 문자열)이므로 적절한 워크시트 이름이 아니기 때문입니다. 따라서 여기에 사용할 예제 데이터를 만들어 보겠습니다. 아래 그림과 같이 통합 문서에 시트 세 개를 만들고 매크로를 실행해 봅니다.

그림 4. RenameWorksheets 매크로용 예제 데이터

RenameWorksheets 매크로의 예제 데이터

 

RenameWorksheets 매크로용 예제 데이터

 

RenameWorksheets 매크로용 예제 데이터

 

그러면 워크시트 이름이 B1의 셀의 내용으로 변경됩니다.

빈 셀 확인

앞서 설명한 것처럼 통합 문서의 B1 셀이 비어 있으면 매크로 실행이 실패합니다. 이 경우 모든 워크시트를 수동으로 확인하는 대신 자동 확인을 수행하는 매크로를 코딩할 수 있습니다. 이렇게 하려면 myWorksheet.Name 줄 앞에 다음 코드 줄을 추가합니다.

If myWorksheet.Range("B1").Value <> "" Then

그리고 myWorksheet.Name 줄 뒤에는 다음 텍스트를 추가합니다.

End If

이 코드를 If…Then 문이라고 합니다. If…Then 문은 If 줄의 조건이 충족되면 If 줄과 End If 줄 사이에 있는 줄에 해당하는 모든 작업을 수행하도록 Excel에 명령합니다. 예제에서 충족할 조건을 지정하는 줄은 다음과 같습니다.

myWorksheet.Range("B1").Value <> ""

<>는 "같지 않음"을 의미하며 빈 따옴표는 텍스트가 포함되어 있지 않은 빈 텍스트 문자열을 나타냅니다. 따라서 If와 End If 사이의 코드 줄은 B1의 값이 빈 따옴표와 같지 않은 경우, 즉 B1 셀에 텍스트가 있는 경우에만 실행됩니다.

If…Then 문에 대한 자세한 내용은 VBA 언어 참조를 참조하십시오. 이 문의 전체 이름은 "If…Then…Else 문"이며 Else는 선택적 구성 요소입니다.

변수 선언

다음으로는 매크로 시작 부분에 myWorksheet 변수 선언을 추가하여 매크로를 개선해야 합니다.

Dim myWorksheet As Worksheet

Dim은 "Dimension"의 약어이며 Worksheet는 이 특정 변수의 유형입니다. 이 문은 myWorksheet가 나타내는 엔터티의 종류를 VBA에 알려 줍니다. As를 입력하고 나면 Visual Basic Editor에는 사용 가능한 모든 데이터 형식 목록이 포함된 팝업이 표시됩니다. 이것이 IntelliSense 기술의 예입니다. 즉, Visual Basic Editor는 사용자가 수행하려는 작업으로 판단되는 사항에 응답하여 적절한 옵션 목록을 제공합니다. 목록에서 옵션을 선택할 수도 있고 계속 입력할 수도 있습니다.

VBA에서 변수 선언을 반드시 사용해야 하는 것은 아니지만 사용하는 것이 좋습니다. 변수 선언이 있으면 변수와 코드의 버그를 훨씬 쉽게 추적할 수 있습니다. 또한 Worksheet와 같은 개체 유형으로 변수를 선언하는 경우 나중에 매크로에서 개체 변수를 사용하면 IntelliSense가 해당 개체와 연결된 적절한 속성 및 메서드 목록을 표시해 줍니다.

주석

지금까지 작성한 매크로는 꽤 복잡해졌으므로 코드의 작업을 설명하는 주석을 포함하면 효율적일 것입니다. 개인적인 코딩 스타일에 따라 적당한 수의 주석을 포함하면 되지만 주석을 너무 적게 포함하는 것보다는 많이 포함하는 것이 좋습니다. 코드는 대개 시간이 지남에 따라 수정하고 업데이트해야 하는데, 주석이 없으면 코드가 수행하는 작업을 파악하기가 어려워집니다(특히 코드를 처음 작성하지 않은 사람이 코드를 수정하는 경우). 예제에서 If 조건과 워크시트 이름을 바꾸는 줄에 대해 주석을 추가하면 코드가 다음과 같아집니다.

Sub RenameWorksheets()
Dim myWorksheet As Worksheet
For Each myWorksheet In Worksheets
    'make sure that cell B1 is not empty
    If myWorksheet.Range("B1").Value <> "" Then
        'rename the worksheet to the contents of cell B1
        myWorksheet.Name = myWorksheet.Range("B1").Value
    End If
Next
End Sub

매크로를 테스트하려면 워크시트 이름을 Sheet1, Sheet2, Sheet3으로 다시 바꾸고 하나 이상의 워크시트에서 B1 셀의 내용을 삭제합니다. 그런 다음 매크로를 실행하여 B1 셀에 텍스트가 있는 워크시트는 이름이 바뀌고 나머지 워크시트는 그대로 유지되는지 확인합니다. 이 매크로는 워크시트의 수 및 조합(B1 셀에 내용이 있는 워크시트와 해당 셀이 비어 있는 워크시트)에 관계없이 작동합니다.

VBA로 수행할 수 있는 추가 작업

이 섹션에서는 Excel 2010의 VBA를 사용하여 수행할 수 있는 몇 가지 작업을 추가로 살펴봅니다. 이 섹션의 예제는 VBA 기능을 파악하기 위한 것이며, 특정 실제 시나리오를 중점적으로 살펴보지는 않습니다. 예제를 진행하면서 각 단계에 포함된 개체에 대한 정보를 개체 모델 참조에서 검토하면 도움이 됩니다.

시행 착오의 중요성

일반적인 프로그래밍(특히 Excel VBA)에 대해 배우려면 다양한 작업 방식을 시도해 보고 작동 여부를 파악한 후에 다음과 같은 사항을 고려해야 합니다.

  • 다음으로 시도할 수 있는 작업

  • VBA를 사용하려는 경우 먼저 파악해야 하는 사항

  • 알아 두면 유용하거나 흥미로운 정보

  • 개인적으로 관심이 있는 사항

필요한 정보를 파악하는 데 도움이 되는 모든 방법을 활용하는 것이 좋습니다.

차트

Excel에서는 셀 범위를 기반으로 차트를 만드는 작업을 많이 수행합니다. AssortedTasks라는 새 매크로를 만든 후 Visual Basic Editor에 다음 텍스트를 입력합니다.

Dim myChart As ChartObject

그런 다음 차트 개체를 만드는 줄을 추가하고 myChart 변수를 해당 줄에 지정합니다.

Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200)

괄호 안의 숫자로 차트의 위치와 크기가 결정됩니다. 처음 두 숫자는 왼쪽 위 모서리의 좌표이고 그 다음 두 숫자는 너비와 높이입니다.

빈 워크시트를 새로 만들어서 매크로를 실행합니다. 이 매크로가 만드는 차트는 데이터를 포함하고 있지 않으므로 쓸모가 없습니다. 따라서 방금 만든 차트를 삭제하고 다음 줄을 매크로 끝에 추가합니다.

With myChart
    .Chart.SetSourceData Source:=Selection
End With

VBA 프로그래밍에서는 이러한 패턴을 흔히 사용합니다. 먼저 개체를 만들어 변수에 지정한 다음 With...End With 구문을 사용하여 개체에 대해 작업을 수행합니다. 예제 코드는 해당 데이터로 현재 선택 항목을 사용하도록 차트에 명령합니다. Selection은 개체 속성의 값이 아닌 SetSourceData 메서드의 Source 매개 변수 값이므로 VBA 구문에서는 등호(=)만 사용해서는 안 되며 콜론과 등호(:=)를 사용하여 값을 지정해야 합니다.

A1:A5 셀에 숫자를 입력하고 해당 셀을 선택한 후에 매크로를 실행합니다. 그러면 차트가 기본 유형인 가로 막대형 차트로 표시됩니다.

그림 5. VBA를 사용하여 만든 가로 막대형 차트

VBA를 사용하여 만든 가로 막대형 차트

가로 막대형 차트를 사용하지 않으려면 다음과 같은 코드를 사용하여 다른 종류의 차트로 변경하면 됩니다.

With myChart
    .Chart.SetSourceData Source:=Selection
    .Chart.ChartType = xlPie
End With

xlPie는 기본 제공 상수의 한 예로, 열거형 상수라고도 합니다. Excel에는 이러한 상수가 다수 포함되어 있으며 그에 대한 설명도 자세하게 제공됩니다. 기본 제공 상수에 대한 자세한 내용은 개체 모델 참조의 열거형 섹션을 참조하십시오. 예를 들어 차트 유형에 대한 상수는 "XlChartType 열거형"에 나와 있습니다.

데이터를 수정할 수도 있습니다. 예를 확인하려면 변수 선언 바로 뒤에 다음 줄을 추가해 보십시오.

Application.ActiveSheet.Range("a4").Value = 8

사용자가 입력을 하도록 한 후 입력 내용을 사용하여 데이터를 수정할 수도 있습니다.

myInput = InputBox("Please type a number:")
Application.ActiveSheet.Range("a5").Value = myInput

마지막으로 매크로 끝에 다음 줄을 추가합니다.

ActiveWorkbook.Save
ActiveWorkbook.Close

완성된 매크로는 다음과 같습니다.

Sub AssortedTasks()
Dim myChart As ChartObject
Application.ActiveSheet.Range("a4").Value = 8
myInput = InputBox("Please type a number:")
Application.ActiveSheet.Range("a5").Value = myInput
Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200)
With myChart
    .Chart.SetSourceData Source:=Selection
    .Chart.ChartType = xlPie
End With
ActiveWorkbook.Save
ActiveWorkbook.Close
End Sub

A1:A5 셀이 계속 선택되어 있는지 확인하고 매크로를 실행한 다음 입력 상자에 숫자를 입력하고 확인을 클릭합니다. 그러면 코드가 통합 문서를 저장한 다음 닫습니다. 통합 문서를 다시 열고 원형 차트가 어떻게 변경되었는지 확인해 보십시오.

사용자 정의 폼

위 섹션에서는 간단한 입력 상자를 통해 사용자가 입력을 하도록 하는 방법을 살펴보았습니다. 정보를 표시하는 해당 메시지 상자 외에 VBA는 사용자 지정 대화 상자를 작성하거나, 워크시트에 직접 삽입할 수 있는 컨트롤을 코딩하거나, Excel에서 기본 제공되는 대화 상자를 조작하는 데 사용할 수 있는 다양한 기능을 제공합니다. 이러한 기능에 대한 자세한 내용은 Excel 2007 개발자 참조에서 컨트롤, 대화 상자 및 폼(영문일 수 있음)을 참조하십시오.

이 섹션에서는 사용자 정의 폼에 대해 간략히 살펴보는 것으로 Excel VBA에 대한 소개를 마치겠습니다.

개발 도구 탭에서 Visual Basic 단추를 클릭하여 Visual Basic Editor를 연 다음 삽입 메뉴로 이동해 사용자 정의 폼을 선택하여 사용자 정의 폼 디자인 보기를 엽니다.

그러면 두 개의 창이 표시되는데 그 중 하나는 작성할 사용자 정의 폼을 나타내고 다른 하나(도구 상자)는 사용자 정의 폼에 추가할 수 있는 다양한 컨트롤(예: 명령 단추, 옵션 단추, 확인란 등)을 표시합니다. 마우스를 도구 상자 컨트롤 위로 이동하면 작성되는 컨트롤 유형을 확인할 수 있습니다.

이 문서 앞부분에서 만든 Hello 매크로를 실행하는 단추 하나가 포함된 매우 간단한 사용자 정의 폼을 만들어 보겠습니다. 도구 상자에서 CommandButton 컨트롤을 누르고 사용자 정의 폼으로 끌어 명령 단추를 만든 다음 해당 명령 단추를 마우스 오른쪽 단추로 클릭하고 코드 보기를 선택합니다.

그러면 표시되는 Sub는 특정 이벤트 발생 시 실행되는 이벤트 프로시저의 기본 형태입니다. 이 경우 Sub라는 이름에서 확인할 수 있듯이 코드를 실행하는 이벤트는 CommandButton1에 대한 Click입니다. 이벤트 프로시저에 다음 줄을 추가합니다.

Run("Hello")

그러면 Visual Basic Editor가 다음과 같이 표시됩니다.

그림 6. CommandButton1_Click 이벤트 프로시저

CommandButton1_Click 이벤트 프로시저

통합 문서를 저장하고 메뉴로 이동한 다음 **UserForm1 (UserForm)**을 선택하여 사용자 정의 폼을 다시 표시합니다. 그런 후에 도구 모음의 녹색 화살표를 클릭하여 사용자 정의 폼을 실행합니다. 대화 상자가 나타나면 명령 단추를 클릭하여 Hello 매크로를 실행합니다. 그러면 "Hello, world!" 메시지 상자가 표시됩니다. 메시지 상자를 닫고 실행 중인 사용자 정의 폼으로 돌아온 후에 해당 폼을 닫고 디자인 보기로 돌아옵니다.

다음 작업

이 문서에서 제공되는 예제를 테스트해 보고, 시간을 할애하여 개체 모델 참조 및 VBA 언어 참조의 내용을 확인한다면 VBA 학습의 계기가 된 작업을 완료하기에 충분한 정보를 습득할 수 있을 것입니다. 충분한 정보를 확보했다면 VBA를 실제 작업에 활용해 보십시오. 그렇지 못한 경우에는 정보의 범위를 넓혀 보다 일반적인 VBA 관련 사항을 파악할 수 있습니다.

VBA에 대해 자세히 알아보는 방법 중 하나는 실제로 작동하는 코드를 살펴보는 것입니다. 개체 모델 참조 및 VBA 언어 참조의 예제 외에도 MSDN 문서, Excel 전문 Microsoft MVP(Most Valuable Professionals)가 운영하는 웹 사이트, 기타 간단한 웹 검색을 통해 찾을 수 있는 자료 등 다양한 온라인 출처에서 수많은 Excel VBA 코드를 확인할 수 있습니다.

이러한 리소스의 코드를 활용하면 코딩 문제를 즉시 해결하고 새로운 프로젝트 아이디어를 얻을 수 있습니다.

VBA에 대해 보다 체계적으로 파악하려는 경우 다양한 VBA 관련 서적을 참고할 수도 있습니다. 웹에서 제공되는 이러한 서적에 대한 유용한 비평을 참고하여 학습 스타일에 가장 적합한 서적을 선택하면 됩니다.

추가 자료