엑셀 매크로를 활용하기 위해서는 기본적인 프로그래밍 문법을 이해하고 있어야 합니다. 이번 편에서는 프로그래밍 문법 중에서도 변수, 연산자 우선순위, 그리고 함수에 대한 개념을 쉽게 이해할 수 있도록 자세히 설명하겠습니다.
단순 반복작업 자동화: 엑셀 매크로 활용 방법과 팁 #2/8 (기초 프로그래밍 문법 - 변수, 연산순위, 함수)
여기서는 프로그래밍 문법중꼭 알아야 하는 기본적인 것은 상세히 설명 드리고 그렇지 않은 것은 개념만 간단히 설명하고 넘어가도록 하겠습니다.
목차
1. 변수
2. 연산순위 그리고 함수
변수
사람의 몸을 예로 생각해 보겠습니다. 사람의 몸에는 눈도 있고 손도 있고 발도 있습니다. 이처럼 각각의 기관에는 분별할 수 있는 고유명사가 있습니다. 그런데 만약 겨울에 손이 시려서 장갑을 끼었는데 장갑을
장갑이라고 하지 않고 기존에 있던 손이라는 단어를 그대로 쓴다면 이해하기도 어렵고 의사를 정확히 전달하기도 쉽지 않을 것입니다. 손이 시려서 손을 끼었다고 하면 이해할 수 있을까요? 물론 눈에 눈을 맞았다
등과 같이 일상 생활에서는 안 될 것도 없지만 프로그래밍에 이렇게 쓰면 컴퓨터가 어떻게 동작해야 하는지 몰라 원하던 결과가 나오지 않습니다. 너무 복잡하게 느껴진다면 이렇게 생각하시면 됩니다. 내 몸에 이미
있었던 것은 컴퓨터 내장변수(또는 함수) 및 상수라 내가 다른 이름을 붙일 수 없고, 덧붙여지는 장갑이나 가방 같은 것은 내가 마음대로 이름을 붙일 수 있으니 변수라고 생각하면 됩니다. 그리고 가방을 예로
들면 가방에 돈을 넣으면 돈가방, 옷을 넣으면 옷가방 등으로 용도가 변경될 수 있듯이 엑셀 매크로에서 사용하는 변수도 int, float, string 등 용도에 맞게 선언하고 사용하면 됩니다.
앞 편에서 예를 들었던 소스에 irow = 2 라는 변수가 있었습니다. 직관적으로 변수명을 row로 쓰면 더 좋을 텐데 왜 굳이 irow로 썼는지 이제는 이해할 수 있을 것입니다. 엑셀 매크로에서
row라는 단어를 내장함수로 쓰고 있어서 그것과 구분하기 위해 irow로 변수를 만든 것입니다.
그럼 irow = 2는 무슨 뜻일까요? 정확하게 쓰면 아래와 같지만 이를 단순하게 irow=2로 써도 VBA에서 irow의 뒤를 보고 자동으로 integer로 인식하기 때문에 문제없이
실행됩니다.
irow As Integer
irow = 2
이 코드는 irow 라는 변수를 선언하고 그 방에 2를 넣어라 라는 의미입니다. 즉 이 구문이 실행되면 irow 에는 2가 들어가 있게 됩니다.
그렇다면 조금 더 나아가서 irow = irow + 1 은 무슨 뜻일까요? 사람의 언어로는 말이 안 되지만 컴퓨터의 처리 로직을 이해하면 쉽게 이해할 수 있습니다.
쉽게 얘기하면 1번을 먼저 계산하고 2번을 수행하는 것으로 생각하면 됩니다. 즉, irow에 이미 2가 들어가 있었기
때문에 2+1를 먼저 계산하고 그 결과를 다시 irow에 넣어라 라고 생각하면 됩니다.
하나 더 해 보겠습니다.
위의 코드에서 i3과 str3에 들어가는 값은 무엇일까요? 맞습니다. i3에는 3 (i1과 i2의 합) 이 str3 에는 Korea is the best country on the planet!!
입니다. 참고로 엑셀에서 문자열 간의 더하기는 + 가 아니라 & 입니다.
실행결과는 다음과 같이 Msgbox가 연속으로 나타나게 됩니다.
(Msgbox는 VBA의 내장함수로 사용자가 원하는 내용을 화면에 메시지 창으로 띄웁니다.)
연산순위 그리고 함수
우리가 학교에서 배우는 사칙연산이 VBA에도 그대로 적용됩니다. 기본적으로 *, / 가 +, - 보다 연산순위가 높고 *, / 와 +, - 간에는 연산순위가 같습니다. ( ) 괄호가 있을 경우
연산순위가 가장 높습니다.
예를 들어 아래 ians의 값과 Msgbox의 값은 어떻게 될까요?
연산 순서는 ① 2*90, ② (10+10), ③ ①/②, ④ ③*irow 이며, 연산결과인 18이 ians에 들어가게 됩니다.
그리고 위에서 볼 수 있듯이 VBA에서는 숫자와 문자를 더할 수도 있기 때문에 Msgbox가 실행되면 아래와 같이 메시지창이 나옵니다.
한가지만 더 짚고 넘어가겠습니다.
위의 소스에 ians = 2 * 90 / (10+10) * irow 가 있습니다. 여기서 irow 값은 그 앞줄에서 irow = 2로 선언되어 있기 때문에 바로 쉽게 결과를 알 수
있습니다.
그런데 만약 irow를 변수가 아니라 함수로 바꾸면 어떻게 될까요? 이것을 이해하려면 함수의 개념부터 이해해야 합니다.
함수는 인수를 받아서 함수내에서 필요한 처리를 한 후 결과값을 되돌려주는 기능을 합니다.
아래를 보겠습니다.
①~③까지는 위에서 설명한 데로 연산순위에 의해서 계산이 될 것이지만 ④번 irow(5)는 사용자가 정의한 함수이기 때문에
프로그램 어딘가에 해당 함수가 있어야 합니다. irow함수에 5를 전달하고 irow 함수에서 정의된 내용을 처리한 후 결과값을 돌려주면 비로소 irow(5)의 값이 결정됩니다. (irow 함수를
보기전에는 irow(5)의 반환 값이 뭔지 알 수 없습니다) 그 이후 ③번과 ④이 곱해진 결과가 ⑤가 되고, ⑤번이 ⑥번 ians에 들어가게 됩니다.
아래 소스를 보겠습니다.
연산2() 는 Sub로 시작하는 프로시저라서 반환 값이 없습니다. 그런데 irow(i)는 sub가 아니라 Function로
시작하고 Function 과 End Function 사이에 irow = i * i 가 있습니다. 뭔가 헷갈릴 수도 있습니다. 위에서 분명 irow()는 함수라고 했고, irow는 뒤에 가로가 없으니
변수인데 이렇게 써도 돼? 라는 의문이 생기면 상당한 수준의 이해력입니다.
차근차근 하나씩 짚어보도록 하겠습니다.
Function irow(i) 는 정확히 쓰면 Function irow(i) as Integer 입니다. 즉 함수 irow는
Integer 반환 값을 갖는 함수입니다. (as Integer는 생략 가능합니다)
즉, irow 함수는 i를 받아서 i * i를 한 후 그 결과값을 반환하는 함수인 것입니다. C나 Java에서는 함수의 결과값을
반환하기 위해서 return이라는 내장어를 쓰지만 엑셀 매크로에서 사용자가 만든 함수가 결과값을 반환하기 위해서는 특별한 내장어를 쓰는 것이 아니라 함수명 자체에 값을 대입하면 반환이 가능합니다.
지금까지 함수에 대해서 가능한 쉽게 설명하려고 노력했으니 대부분 이해하셨을 것으로 믿습니다.
그런데 앞에서 나왔던 소스는 모두 프로시저였고 사용하는데 불편함이 없었는데 왜 복잡하게Function을 만들고 써야 하는지 의문이
생긴다면 나 프로그래머의 길로 가야 되나? 라는 생각을 해봐도 됩니다.
지금까지 변수와 연산순위, 함수에 대해서 최대한 상세하게 설명하였습니다. 이해가 안 되신다면 되도록 몇번이고 읽어서 이해할 수
있도록 노력하셔야 합니다.