"세 살 버릇 여든까지 간다"라는 속담처럼

초보시절 코딩 습관이 경력직이 될 때까지 이어질 수 있습니다.

사소한 습관 하나가 크나큰 버그를 초래할 수도 있고

작은 습관이 치명적 에러를 피할 수 있게 해줄 수도 있습니다.

 

Alt-F11 코드창에 VBA코드를 작성할 때

주의할 사항 혹은 지키면 좋은 습관 몇가지를

생각나는대로 모아봤습니다.

 

1. Option Explicit
항상 이거 맨 처음에 써주세요.

안써도 되지만 오타방지해줍니다.

 

Explicit는 '명시적인'이라는 뜻인데 미리 Dim i as Integer 라고 명시적으로 선언하고 쓰겠다는 뜻입니다.

미리 선언하지 않은 변수는 실행시 에러를 출력하기 때문에 오타를 찾아내주고

항상 미리 변수 선언하는 (초보자로서) 좋은 습관을 길러줍니다.

또한 미리 변수를 선언해야 개체 뒤에 점(,)을 찍었을 때 하위 개체나 속성을 자동으로 띄워줘서 코딩이 편리합니다.


2. Dim a, b as integer(X)
제발 이렇게 선언하지 마세요.

int a, b 로 하는 C언어와 다르게 VBA에서는 이렇게 선언하면 b는 정수지만 a는 정수로 선언되지 않습니다.

a는 변수종류가 정해지지 않은 Variant로 선언한 상태입니다.

물론 a = 1처럼 값을 입력하면 정수형으로 변경이 됩니다.

Dim a as Integer, b as Integer 이렇게 변수마다 변수형(type)을 지정해주세요.

이와 관련해서 링크된 카페글을 읽어보기 바랍니다.
변수형을 일일이 붙이는게 귀찮으면 짧게 줄인 약어를 이용하세요.

(Integer%, Long&, Single!, Double#, String$, Decimal@)


3. 들여쓰기

1부터 10까지 합 구하기

이것은 취향의 차이인데요.

위처럼 들여 쓰기(Indent)를 해주면

어디서 부터 어디까지 For 문인지, If 문인지 한 눈에 알기 쉽습니다.

4. '주석

C언어 등에서는 /* 주석 */ 혹은 //주석 이런식으로 주석을 남기는데요.
VBA에서는 엔터키 왼쪽의 ( ' )키를 주석문구 바로 앞에 찍어서 주석을 달 수 있습니다.

주석은 기본적으로 녹색으로 표기해줍니다.

함수 설명이나 주의할 점, 디버그용 표시 등 여러가지 용도가 있습니다.

주석을 잘 적어놓아야 시간이 흐르고 나서 나중에

코드를 열어보았을 때 다시 파악하기가 쉽습니다.

나중에 보면 자기자신이 적어놓은 코드도 이해하기 어려울 때가 있습니다.

다른 사람의 코드를 분석할 때도 주석을 추가하면서 하면 구조화가 되어 더 효율적입니다.


5. On Error Resume Next
오류가 생길 것을 대비해서 위 구문을 자주 쓰는데요.

초보자의 경우 최대한 자제하는 것이 좋습니다.

나중에 오류가 발생한 곳이 어디인지 알기 어려울 수 있습니다.

오류가 나야할 때는 나는 것이 좋습니다.

간혹 필요해서 사용할 때는 다시 에러를 출력하도록 On Error Goto 0 을 써주세요.

(프로그래밍에서 Goto는 좋지 않기 때문에 피하라는 얘기도 있는데 여기서는 논외로 합니다.)

6. With문 
코드 길이와 효율성을 위해서 상위개체부터 차례로 모두 계속 써주기 보다는 With를 잘 활용해서 묶어주세요.

With 는 중첩해서 그 안에 다시 With문을 쓸 수 있습니다.


7. For문

1부터 10까지 합 구하기

1부터 10까지 더한다면 10번을 쓰는 것보다는

For 반복문이 효율적입니다. 대신 대부분의 오류가 반복문 안에서 발생하기 때문에 유의해야 합니다.

반복처리는 For ~ Next문이나 While~ Wend, Do Until ~ Loop 를 이용하세요.

특히 자식개체를 포함하는 부모개체의 경우 자식개체들을 순환할 때

For Each (child) In (parent) 를 이용할 수 있습니다.

(예: For Each shp in Slide1.Shapes )

8.  Option Base 1
VBA에서 기본적으로 배열 인덱스의 시작은 0입니다.

인덱스가 0으로 시작하면 좋은 점이 많긴 합니다.

Dim Arr(3) as String으로 선언하면

Arr(0), Arr(1), Arr(2) 로 세가지 변수가 선언됩니다.

이 때 Arr(3)을 호출하면 오류가 납니다. UBound(Arr)의 결과값은 2입니다.

이때 코드 바깥에  Option Base 를 이용해서 인덱스 시작값을 변경해줄 수 있습니다.

한 가지 더, 문자열을 비교할 때 기본으로 Binary 비교를 하는데

대소문자를 무시하고 비교할 때는 Option Compare Text를 미리 적어주면 됩니다.


9. By Value
이건 조금 고급(?) 수준이긴 하지만 큰 차이가 날 수도 있습니다.

Function myFunc(a as Integer) 로 function을 정의했다면 기본적인 인수 a는 ByRef로 설정합니다.

즉, 인수로 들어온 값이 함수를 나가도 계속 유지가 됩니다.

아래 예시를 잘 비교해보세요.

더보기
Sub mySub()

    x = 1
    myFuncA x   '=Call myFuncA(x)
    Debug.Print x ' => 2
    x = 1
    myFuncB x   '=Call myFuncA(x)
    Debug.Print x ' => 2
    x = 1
    myFuncC x   '=Call myFuncB(x)
    Debug.Print x ' => 1

End Sub

Function myFuncA(a As Integer)
    a = 2
End Function

Function myFuncB(ByRef b As Integer)
    b = 2
End Function

Function myFuncC(ByVal c As Integer)
    c = 2
End Function



10. 폰트

VBE창의 코딩 폰트를 변경하여 가독성을 높히세요.

단 프로그래밍에는 가변폭보다는 고정폭이 좋습니다.

고정폭이어야 <Tab>키로 들여쓰기 할 때나 영어, 한글, 특수문자 상관없이 세로 열의 정렬이 딱 맞습니다.

저는 Monaco + 맑은 고딕 폰트를 사용합니다.

영어는 Consolas를 많이 쓰는데 한글까지 포함하는 것은 나눔고딕코딩, D2 Coding 등이 있습니다.

참고: https://ppss.kr/archives/66633

 

11. 디버깅

 

항상 실행전 Compile을 해서 오류가 없는 지 검사해보세요.