엑셀 VBA 강좌(7): 엑셀 VBA 언어 기본-문법(Syntax)
이번 글은 엑셀 VBA언어 기본 중 문법(Syntax)에 대해 살펴본다.
이전 글에서 이어지는 내용이다.
3.2. 언어 문법(Syntax)
VBA 언어 문법은 Visual Basic 문법과 동일하다. 처음에는 모든 문법을 다 알 필요가 없고, 여기에 요약한 문법만 알아도 충분하다. 전체 문법은 하단에 첨부한 Visual Basic CHM 도움말 파일을 참고한다.
VBA 언어에 대한 온라인 도움말(영어로만 제공됨)은 아래 URL에서 확인할 수 있다.
https://docs.microsoft.com/en-us/office/vba/api/overview/language-reference
3.2.1. 조건문(IF)
식의 값에 따라 문 그룹을 조건부로 실행한다.
Single line IF 문법
If condition Then [statements] [Else elsestatements]
Single line IF sample code
If Digits = 1 Then MyString = "One" Else MyString = "More than one"
Multiple line IF 문법
If condition Then [statements] [ElseIf condition -n Then [elseif statements]...] [Else [else statements]] End If
Visual Basic 도움말
- condition
- 필수적인 요소. 다음과 같은 두 가지 형식 중 하나 이상의 식입니다.
- True나 False로 평가되는 수식이나 문자식으로 condition이 Null이면 False로 처리됩니다.
- TypeOf objectname Is objecttype 형태로 된 식입니다. Objectname은 개체 참조이며, objecttype은 유효한 개체 형식입니다. Objectname이 objecttype에 의해 지정된 개체 형식이면 식은 True이며, 그렇지 않으면 False입니다.
- statements
- 블록 형태에서는 선택적인 요소이고, Else절이 없는 단일 행 형태에서는 필수적인 요소입니다. 둘 이상의 문은 콜론으로 구분하며 condition이 True일 경우 실행됩니다.
- condition -n
- 선택적인 요소. condition과동일합니다.
- elseif statements
- 선택적인 요소. 연관된 condition-n이 True일 경우 실행되는 하나 이상의 문입니다.
- else statements
- 선택적인 요소. 이전의 condition이나 condition-n식이 True가 아닐 경우 실행되는 하나 이상의 문입니다.
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
Multiple line IF sample code
Dim Number, Digits, MyString Number = 53 ' 변수를 초기화합니다. If Number < 10 Then Digits = 1 ElseIf Number < 100 Then '조건이 True로 평가되면 다음 문이 실행됩니다. Digits = 2 Else ' 조건이 False로 평가되면 다음 문이 실행됩니다. Digits = 3 End If
3.2.2. 조건함수(IIF)
식을 평가한 결과에 따라 두 개의 값 중에서 하나를 반환한다.
IIF는 함수(function)이고, If ~ Else ~ End If 구문을 간략하게 표현할 때 사용한다.
IIF 문법
IIf(expr, true part, false part)
Visual Basic 도움말
구성요소 | 설명 |
expr | 필수적인 요소. 평가하고자 하는 식 |
true part | 필수적인 요소. expr이 True인 경우 반환하는 값이나 식입니다. |
false part | 필수적인 요소. expr이 False인 경우 반환하는 값이나 식입니다. |
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/iif-function
IIF sample code
Function CheckIt (TestMe As Integer) CheckIt = IIf(TestMe > 1000, "Large", "Small") End Function
3.2.3. 조건문(Select Case)
식의 값에 따라 몇 개 그룹의 문 중의 하나를 실행한다.
Select Case 조건문 문법
Select Case test expression [Case expressionlist-n [statements-n]] ... [Case Else [else statements]] End Select
Visual Basic 도움말
구성요소 | 설명 |
test expression | 필수적인 요소. 모든 수식이나 문자식입니다. |
expression list-n | Case 문을 사용하는 경우에는 필수적인 요소입니다. expression, expression To expression, Is comparisonoperator expression과 같은 형식들 중 하나 이상의 구분된 목록으로 구성됩니다. To 키워드는 값의 범위를 지정합니다. To 키워드를 사용하는 경우에는 더 작은 값이 To문 앞에 와야 합니다. 값의 범위를 지정하려면 비교 연산자(Is 문과 Like문은 제외)와 함께 Is 키워드를 사용합니다. Is 키워드를 입력하지 않으면 자동으로 삽입됩니다. |
statements-n | 선택적인 요소. testexpression에 대응하는 expressionlist가 있는 경우 해당되는 하나 이상의 문이 실행됩니다. |
else statements | 선택적인 요소. testexpression에 대응하는 Case절이 없는 경우 해당되는 하나 이상의 문이 실행됩니다. |
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
Select Case 조건문 sample code
Function Bonus(performance, salary) Select Case performance Case 1 Bonus = salary * 0.1 Case 2, 3 Bonus = salary * 0.09 Case 4 To 6 Bonus = salary * 0.07 Case Is > 8 Bonus = 100 Case Else Bonus = 0 End Select End Function
3.2.4. 반복문(For)
문의 그룹을 지정한 횟수만큼 반복한다.
For Next 반복문 문법
For counter= start To end [Step step] [statements] [Exit For] [statements] Next [counter]
구성 요소 | 설명 |
counter | 필수적인 요소. 루프 카운터로서 사용되는 숫자 변수. 이 변수는 Boolean 또는 배열 요소가 될 수 없습니다. |
start | 필수적인 요소. Counter의 시작값 |
end | 필수적인 요소. Counter의 최종값 |
step | 선택적인 요소. 루프를 한번 수행할 때마다 변화하는 counter의 양입니다. 지정하지 않으면 step의 기본값은 1입니다. |
statements | 선택적인 요소. For와 Next 사이의 있는 하나 이상의 문이며 지정한 횟수만큼 실행됩니다. |
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/fornext-statement
For Next 반복문 sample code
Dim Words, Chars, MyString For Words = 10 To 1 Step -1 ' 10번 반복을 설정합니다. For Chars = 0 To 9 ' 10번 반복을 설정합니다. MyString = MyString & Chars ' 숫자를 문자열에 추가합니다. Next Chars ' 카운터 증가 MyString = MyString & " " ' 빈 칸을 추가합니다. Next Words
3.2.5. 반복문(For Each)
배열이나 컬렉션의 각 요소들에 대한 문의 그룹을 반복한다.
For Each 반복문 문법
For Each element In group [statements] [Exit For] [statements] Next [element]
구성 요소 | 설명 |
element | 필수적인 요소. 컬렉션이나 배열의 요소들을 반복 실행하는 데 사용하는 변수입니다. 컬렉션에서 element는 오직 Variant 변수나 일반 개체 변수 또는 특정한 개체 변수가 될 수 있습니다. 배열에서 element는 오직 Variant 변수만 될 수 있습니다. |
group | 필수적인 요소. 각 개체 컬렉션이나 배열의 이름(사용자 정의 형식 배열은 제외)입니다. |
statements | 선택적인 요소. group의 각 항목에서 실행되는 하나 이상의 문입니다. |
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
For Each 반복문 sample code
Dim Found, MyObject, MyCollection Found = False ' 변수를 초기화합니다. For Each MyObject In MyCollection ' 각각의 요소에 대해 반복합니다. If MyObject.Text = "Hello" Then ' Text가 "Hello"라면. Found = True ' Found변수를 True로 설정합니다. Exit For ' 루프를 종료합니다. End If Next
3.2.6. 반복문(While)
주어진 조건이 True인 동안은 일련의 문을 계속 실행한다.
While 반복문 문법
While condition [statements] Wend
구성 요소 | 설명 |
condition | 필수적인 요소. True나 False로 평가되는 수식 또는 문자식. 만약 condition이 Null인 경우 condition은 False로 처리됩니다. |
statements | 선택적인 요소. 주어진 조건이 True인 동안 하나 이상의 문을 실행합니다. |
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
While 반복문 sample code
Dim Counter Counter = 0 ' 변수를 초기화합니다. While Counter < 20 ' 변수 Counter 값을 검사합니다. Counter = Counter + 1 ' 변수 Counter 값을 1씩 증가시킵니다. Wend ' 변수 Counter의 값이 19보다 크면 While 루프를 종료합니다. Debug.Print Counter ' 직접 실행
3.2.7. 반복문 제어(Exit, Continue)
반복문 수행 중 특정 조건일 때 반복을 중단하는 구문은 Exit For를 사용하면 된다. 하지만, 반복을 skip하는 continue 구문은 VBA에서 지원하지 않는다. IF block 또는 Goto 구문으로 제어한다.
If block 사용 방법
- 특정 조건을 만족하는 경우에만 구문이 실행되도록 If block으로 감싸는 방법
- 코드의 초기에 확정된 변수값을 기준으로 continue 처리를 하는 경우 사용할 수 있음
- 조건이 복잡하거나 초기에 변수값이 확정되지 않는다면 사용하기 어려움
For iSht = 1 To aBook.Worksheets.Count Set oSht = aBook.Sheets(iSht) If (IsColumnMappingSheet(oSht)) and (lRowOffset >= 0) ... ... End If Next iSht
Goto 사용 방법
- 코드의 중간 중간에 계산 또는 특정 조건에 의해 continue 처리를 하는 경우에 사용함
- Loop의 가장 아래쪽(Next 바로 위)에 이동할 위치를 label로 지정하고 If 조건문에서 Goto 구문 사용
- 시작, 중간 어느 부분에서나 사용가능함
For iSht = 1 To aBook.Worksheets.Count Set oSht = aBook.Sheets(iSht) If Not IsColumnMappingSheet(oSht) Then GoTo Continue_To_Next_Sheet ... If lRowOffset < 0 Then GoTo Continue_To_Next_Sheet ... Continue_To_Next_Sheet: Next iSht
3.2.8. 프로시져(Procedure)
프로시져는 대표적으로 Sub, Function이 있다.
Sub 프로시져 문법
[Private | Public] [Static] Sub name [(arglist)] [statements] [Exit Sub] [statements] End Sub
구성 요소 | 설명 |
Public | 선택적인 요소. 모듈내의 모든 프로시저에서 해당 Sub 프로시저를 호출할 수 있음을 나타냅니다. 만약 Option Private 문이 있는 모듈에서 사용한다면 그 프로시저를 프로젝트 외부에서 호출할 수 없습니다. |
Private | 선택적인 요소. Sub 프로시저는 선언된 모듈 내의 다른 프로시저에서만 호출할 수 있음을 나타냅니다. |
Friend | 선택적인 요소. 클래스 모듈에서만 사용됩니다. Sub 프로시저가 프로젝트 전체에서 인식되지만 개체의 인스턴스 컨트롤러에서는 인식될 수 없음을 나타냅니다. |
Static | 선택적인 요소. Sub 프로시저의 지역 변수가 함수 호출마다 유지됨을 나타냅니다. 프로시저에서 사용되어도 Sub 밖에서 선언된 변수는 Static 속성을 갖지 못합니다. |
name | 필수적인 요소. Sub 이름이며, 표준 변수 명명 규칙을 따릅니다. |
arglist | 선택적인 요소. 호출될 때 Sub 프로시저에게 전달되는 인수를 나타내는 변수 목록입니다. 다수의 변수일 경우콤마(,) 기호로 분리합니다. |
statements | 선택적인 요소. Sub 프로시저에서 실행되는 문의 집합입니다. |
arglist 인수는 다음과 같은 구성 요소로 되어 있습니다.
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
구성 요소 | 설명 |
Optional | 선택적인 요소. 인수가 필수가 아님을 나타내는 키워드입니다. Optional을 사용하면 arglist에 사용된 인수는 모두 선택 사항이며 Optional 키워드를 사용하여 선언해야 합니다. 모든 Optional 인수는 Variant이어야 하며 Optional은 ParamArray와 함께 사용할 수 없습니다. |
ByVal | 선택적인 요소. 인수가 값에 의한 전달임을 나타냅니다. |
ByRef | 선택적인 요소. 인수가 참조에 의한 전달임을 나타냅니다. Visual Basic에서는 ByRef가 기본값입니다. |
ParamArray | 선택적인 요소. arglist에서 마지막 인수로 사용되며 마지막 인수가 Variant 요소의 Optional 배열임을 나타냅니다. ParamArray 키워드를 사용하면 임의 개수의 인수들을 사용할 수 있으며, ByVal, ByRef 또는 Optional과 함께 사용할 수 없습니다. |
varname | 필수적인 요소. 인수를 나타내는 변수의 이름을 말하며 표준 변수 명명 규칙을 따릅니다. |
type | 선택적인 요소. 프로시저에 전달되는 인수의 데이터 형식을 말하며 다음과 같습니다. Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal(현재는 지원 안함), Date, String(가변 길이 문자열만 가능), Object, Variant매개 변수가 Optional이 아니면, 사용자 정의 형식과 개체 형식을 지정할 수도 있습니다. |
defaultvalue | 선택적인 요소. 상수 혹은 상수 식이며, Optional 매개 변수일 경우만 유효합니다. Object 형식일 경우 명시적인 기본값으로는 Nothing만 가능합니다. |
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/sub-statement
Sub 프로시져 sample code
' 하위 프로시저 정의입니다. ' 두개의 인수를 가진 하위 프로시저입니다. Sub SubComputeArea(Length, TheWidth) Dim Area As Double ' 지역 변수를 선언합니다. If Length = 0 Or TheWidth = 0 Then ' 만약 두 인수가 모두 0이면, Exit Sub ' Sub를 즉시 종료합니다. End If Area = Length * TheWidth ' 사각형의 면적을 계산합니다. Debug.Print Area ' 지역을 디버그 창에 인쇄합니다. End Sub
Function 프로시져 문법
[Public | Private | Friend] [Static] Function name [(arglist)] [As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function
구성 요소 | 설명 |
Public | 선택적인 요소. Function 프로시저는 모든 모듈의 모든 프로시저에 액세스할 수 있음을 나타냅니다. 프로시저가 Option Private을 갖고 있는 모듈에서 사용되면 프로젝트 밖에서는 사용할 수 없습니다. |
Private | 선택적인 요소. Function 프로시저는 이 프로시저가 선언된 모듈에서만 다른 프로시저에 액세스할 수 있음을 나타냅니다. |
Friend | 선택적인 요소. 클래스 모듈에서만 사용됩니다. Function 프로시저가 프로젝트 전체에서 인식되지만 개체의 인스턴스 컨트롤러에서는 인식될 수 없음을 나타냅니다. |
Static | 선택적인 요소. Function 프로시저의 지역 변수가 호출 내에서 보존됨을 나타냅니다. Static 속성은 Function 밖에서 선언된 변수가 프로시저에서 사용된다 하더라도 이 변수에 영향을 미치지 않습니다. |
name | 필수적인 요소. Function의 이름이며 표준 변수 명명 규칙에 따릅니다. |
arglist | 선택적인 요소. 호출하면 Function 프로시저에 전달되는 인수를 나타내는 변수의 목록입니다. 변수가 여러 개인 경우에는 쉼표로 구분됩니다. |
type | 선택적인 요소. Function 프로시저에 의해 반환되는 값의 데이터 형식은 다음과 같습니다. Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal(현재 지원 안됨), Date, String,(가변 길이 제외),Object, Variant, 사용자 정의 형식 |
statements | 선택적인 요소. Function 프로시저 내부에서 실행될 명령문의 그룹입니다. |
expression | 선택적인 요소. Function 값을 반환합니다. |
arglist 인수는 다음과 같은 구문과 구성 요소를 가집니다.
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
구성 요소 | 설명 |
Optional | 선택적인 요소. 인수가 필요하지 않음을 나타냅니다. 인수가 사용되려면 arglist에 있는 모든 다음 인수들을 선택적으로 사용되며 Optional 키워드를 사용하여 선언해야 합니다. 만약 ParamArray가 사용되면 Optional은 어떤 인수에 대해서도 사용될 수 없습니다. |
ByVal | 선택적인 요소. 인수가 값에 의한 전달임을 나타냅니다. |
ByRef | 선택적인 요소. 인수가 참조에 의한 전달임을 나타냅니다. Visual Basic에서는 ByRef가 기본값입니다. |
ParamArray | 선택적인 요소. 마지막 인수가 Variant 요소의 Optional 배열임을 나타내도록 arglist에 있는 마지막 인수로서만 사용됩니다. ParamArray 키워드를 사용하면 임의 개수의 인수를 사용할 수 있으며, 이 키워드는 ByVal, ByRef, Optional과 함께 사용될 수 없습니다. |
varname | 필수적인 요소. 인수를 나타내는 변수의 이름이며 표준 변수 명명 규칙에 따릅니다. |
type | 선택적인 요소. 프로시저에 전달되는 인수의 데이터 형식은 Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal(현재 지원 안됨) Date, String (가변 길이의 경우), Object, Variant, 특정한 개체 형식 등이 됩니다. 매개 변수가 Optional이 아니라면 사용자 정의 형식도 지정할 수 있습니다. |
defaultvalue | 선택적인 요소. 상수나 상수식이며 Optional 매개 변수에 대해서만 유효합니다. 형식이 Object면 명시적 기본값은 Nothing으로만 됩니다. |
* 참고: 위 내용은 한글로 번역된 chm 도움말에서 발췌하였다. 온라인 도움말은 아래 URL을 참고한다.
Function 프로시져 sample code
' 다음의 사용자 정의 함수는 ' 전달된 인수의 제곱근을 반환합니다. Function CalculateSquareRoot(NumberArg As Double) As Double If NumberArg < 0 Then ' 인수를 계산합니다. Exit Function ' 프로시저 호출을 종료합니다. Else CalculateSquareRoot = Sqr(NumberArg) ' 제곱근을 반환합니다. End If End Function
3.2.9. 오류 처리
Java, C#에서의 try, catch, finally 구문은 지원되지 않는다. On Error Goto 구문으로 오류를 처리한다.
구문 | 설명 |
On Error GoTo label | 오류가 발생하면 지정한 label로 실행 위치 이동 |
On Error Resume Next | 발생한 오류를 무시하고 다음 명령으로 계속 실행 |
On Error GoTo 0 | 설정된 오류 처리 방식(Goto, Resume)을 초기화 |
오류 처리 기본 코드는 다음과 같다.
Sub ErrorTest() On Error GoTo ErrHandler 'Error 처리 시작 (=try) Dim i As Integer i = 1 / 0 On Error GoTo 0 'Error 처리 종료 (=finally) Exit Sub ErrHandler: 'Error 처리 (=catch) MsgBox Err.Description End Sub
위 코드는 일부러 0으로 나누기 오류를 발생시켜서 ErrHandler 영역의 구문이 실행된다.
3.2.10. VB(Visual Basic) 설명서 도움말(CHM)
CHM(Compiled HTML Help) 파일로 작성된 한글 Visual Basic 설명서를 예전에 받아 두었는데, 출처는 알 수 없다. Visual Studio 6.0에 포함된 도움말 파일인 것으로 보인다.
바이러스등이 걱정된다면 이 파일은 다운로드 받지 않고 온라인 도움말을 이용하기 바란다.
이 파일은 열기 전에 차단을 해제해 줘야 정상적으로 사용할 수 있다. 파일을 선택하고 마우스 오른쪽 버튼 클릭, 속성에서 우측 하단 “차단 해제”를 체크하고 확인을 누른 다음 파일을 열면 된다. (아래 이미지 참조)
3.2.11. Office 2013 VBA 설명서(CHM, 영어)
Office 2013 제품(Excel, Access, OneNote, Outlook, PowerPoint, Publisher, Visio, Word)을 VBA로 다루는 방법에 대한 설명서이다.
https://www.microsoft.com/en-us/download/details.aspx?id=40326
위 URL의 하단 Install Instructions를 펼쳐보면 CHM 파일의 내용이 보이지 않을 때 조치하는 방법이 설명되어 있다. 이전에 설명한 “차단 해제”에 대한 내용이다.
Office 2013 이후 버전에 대한 오프라인 도움말(CHM)은 찾지 못했는데, 혹시 가지고 있거나 URL을 알고 있다면 댓글로 남겨주기 바란다.
이 글에서는 VBA 문법에 대해 살펴보았다. 가장 기본적인 내용으로만 추렸고, 이 문법만 확실하게 이해하면 대부분 VBA 코드는 읽고 쓸수 있다. 다음에는 자료형(Data type)에 대해 살펴보겠다.
<< 관련 글 목록 >>
- 엑셀 VBA 강좌를 시작합니다. (강좌예고, feat.엑셀 VBA를 권장하는 이유)
- 엑셀 VBA 강좌(1): 엑셀 VBA 개요
- 엑셀 VBA 강좌(2): 엑셀 VBA 기초
- 엑셀 VBA 강좌(3): 엑셀 Object Model
- 엑셀 VBA 강좌(4): 엑셀 Object Model 다루기
- 엑셀 VBA 강좌(5): 엑셀 파일 확장자, VBE, 글꼴 설정
- 엑셀 VBA 강좌(6): 엑셀 VBA 언어 기본-변수
- 엑셀 VBA 강좌(7): 엑셀 VBA 언어 기본-문법(Syntax)
- 엑셀 VBA 강좌(8): 엑셀 VBA 언어 기본-자료형(Data type), 자료구조(Data structure)
- 엑셀 VBA 강좌(9): 엑셀 VBA How-To
- 엑셀 VBA 강좌(10): 엑셀 VBA로 개발하여 사용중인 도구
- 엑셀 VBA 강좌 전체 목차