안녕하세요 모닝수잔입니다 :)
Uipath RPA에서 변수를 선언하고 값을 할당해줄 때는 Assign이라는 액티비티를 사용했었는데요, 엑셀 VBA에서는 변수를 선언할 때 Dim을, 변수에 값을 할당해줄 때는 Set을 사용한다고 합니다. 그래서 오늘은 엑셀 VBA 기초라고 할 수 있는 Dim과 Set을 통해서 "수량"과 "단가"라는 변수를 선언하고 값을 할당해준 뒤, 두 변수를 곱해서 수량 * 단가 = 총액을 구하는 프로세스에 대해 포스팅해보겠습니다.
먼저 물품별 수량 * 단가에 대한 간단한 예제 표를 만들어봤습니다. 우리는 2번째 열(Column)과 3번째 열에 있는 수량, 단가를 각각 변수로 선언하고 값을 할당한 뒤, 두 변수 값을 곱해서 4번째 열에 있는 총액을 구해보겠습니다.
수량 * 단가 = 총액
1) 엑셀(Excel)의 새로운 Worksheet를 열고 VBA 편집기의 Module창을 엽니다.
Developer - Visual Basic을 클릭하면 VBA 편집기가 열리겠죠? VBA로 코딩을 하기 위해서 Insert - Module을 클릭해서 Module창도 하나 열어주겠습니다.
2) Module창에서 Sub() 프로시저(Procedure)를 열어줍니다.
VBA의 기본은 "열고 닫기"이기 때문에 기본적으로 코딩을 하려면 프로시저(Procedure)를 먼저 열어줘야 합니다. 그냥 VBA로 매크로를 만들어주려면 무조건 Sub() 프로시저로 시작해야한다고 생각하셔도 큰 무리는 없을 것 같아요. 약간 "나 이제 매크로 만들기 시작할게" 정도의 느낌이라고 보시면 됩니다. Sub() 프로시저는 VBA 편집기에서 Insert - Procedure를 클릭하셔도 되고, 타이핑으로 Sub 매크로이름()을 치고 Enter를 누르셔도 됩니다. 예를 들면, 저는 매크로의 이름을 "변수선언할당"이라고 지어볼게요? 그럼 Module 창에 Sub 변수선언할당()이라고 쓰고 Enter를 누르시면 아래와 같이 확인되실겁니다. 자동으로 Sub이 열리면서 End Sub으로 닫히는 구문까지도 만들어졌네요.
3) Dim을 사용해서 "수량"과 "단가"를 변수로 선언해줍니다.
드디어 Dim을 사용해서 변수를 선언해보겠습니다. 변수는 쉽게 생각하면 "변하는 수"라고 볼 수 있습니다. 우리는 수량 * 단가 = 총액, 즉 수량과 단가를 곱해서 총액을 구하고 싶은건데, 수량과 단가는 딱 정해진 고정된 값이 아니라 변하는 값이잖아요? 그래서 수량과 단가를 각각 변수로 선언해주겠습니다.
※ "변수 = 변하는 수"는 100% 맞는 표현은 아니지만 이해를 돕기 위한 설명이랍니다 :)
아래 화면을 보시면, Dim 수량 as Range는 수량을 범위(Range) 형태의 변수로 선언한다는 뜻이 됩니다. 마찬가지로 Dim 단가 as Range는 단가를 범위(Range) 형태의 변수로 선언한다는 뜻이 되겠죠? 이제 내가 "수량"과 "단가"라는 변수를 만들었기 때문에 여기에 어떤 범위(Range) 값을 할당해주느냐에 따라 "수량"과 "단가"는 매번 다른 변하는 값을 갖게 됩니다. 다만, 아직은 변수에 값을 할당해주지 않았기 때문에 아무런 변화도 일어나지 않습니다. 수량 * 단가 = 를 하더라도 어떤 값도 나오지 않는거죠.
※ Dim을 사용해서 변수를 선언할 때 as ~ 형태로 변수의 유형을 같이 지정해주기도 하지만, 위에서 as Range를 기재하지 않더라도 오류가 발생하진 않습니다.
※ 작은 따옴표 '를 사용할 경우, 아래 화면의 초록색 글씨처럼 각주의 형식으로 설명 글을 적어넣을 수 있고, 실제 코딩식에는 영향을 미치지 않는 답니다.
4) Set을 사용해서 "수량"과 "단가" 변수에 값을 할당해줍니다.
앞서 우리가 Dim을 사용해서 변수를 만들어줬지만, 아직 값을 할당해주지는 않았기 때문에 어떠한 변화도 생기지 않았는데요? Set을 사용하면 변수에 값을 할당해줄 수 있습니다. 아래 화면을 보시면 "수량"은 C3의 값이고 "단가"는 D3의 값이죠? 즉, "수량"은 Range("C3"), "단가"는 Range("D3")이 됩니다.
※ Range()에서 괄호() 안에 셀을 넣을 때는 Range("C3")이나 Range("D3")처럼 꼭 큰따옴표 "" 안에 넣어줘야 한다는 사실을 기억해주세요 :)
Set은 변수에 값을 할당해주는데, 우리가 만든 "수량"과 "단가" 변수는 범위의 유형(as Range)으로 만들어졌으므로 값도 범위의 유형으로 할당해주겠습니다. Set 수량 = Range("C3"), Set 단가 = Range("D3")을 해주면 이제부터 "수량"이라는 변수는 C3의 값 1을, "단가"라는 변수는 D3의 값 300,000을 갖게 됩니다.
5) 값이 할당된 변수 "수량"과 "단가"를 곱해서 총액을 구해줍니다.
이제 "수량"과 "단가" 변수는 각각 C3, D3의 값을 가지고 있기 때문에 수량 * 단가를 하면 총액이 계산되겠죠? 그 값을 우리는 E3에 넣어주겠습니다. Range("E3") = 수량 * 단가는 E3의 범위에 "수량"과 "단가"를 곱한 값을 준다는 뜻이 됩니다. 여기까지 작성하시고 F5를 누르시거나, VBA 편집기에 있는 ▶ (Run Sub/UserForm)을 클릭하시면 아래 화면 왼쪽 빨간칸처럼 E3에 300,000이라는 값이 들어가 있음을 확인하실 수 있습니다.
사실 위에 있는 화면 오른쪽 빨간칸에도 초록색 글씨의 주석으로 기재했지만, 굳이 Dim과 Set을 사용해서 "수량"과 "단가"를 변수로 선언하고 값을 할당하지 않더라도 Range("C3").Value와 Range("D3").Value로 표현해줄 수 있습니다. 즉, Range("E3").Value = 수량 * 단가의 결과와 Range("E3").Value = Range("C3").Value * Range("D3").Value의 결과는 같습니다.
※ Range("E3")은 E3 셀의 범위라는 뜻으로, 여기에 .Value를 추가하게 되면 E3 셀 범위의 값이라는 뜻이 됩니다. 다만, Range("E3") = Range("E3").Value와 동일하므로 .Value는 꼭 추가하지 않으셔도 됩니다. 즉, 아래 4개의 표현은 모두 같은 결과를 가져옵니다.
1) Range("E3").Value = 수량 * 단가
2) Range("E3").Value = Range("C3").Value * Range("D3").Value
3) Range("E3") = 수량 * 단가
4) Range("E3") = Range("C3") * Range("D3")
하/지/만,
아래의 예제는 간단하지만 복잡한 코딩에서 계속해서 "수량"과 "단가"를 Range("C3").Value, Range("D3").Value로 표현해야 한다면 번거롭지 않을까요? 차라리 "수량", "단가"라고 표현하는게 편리하겠죠? 이렇게 Dim과 Set을 사용한 변수의 선언과 값의 할당은 복잡한 코딩식에서 유용하게 사용될 수 있답니다. 다만, 오늘 만든 매크로에서 아쉬운 점이 있다면 예제 표에 여러 개의 물품이 있음에도 불구하고 첫번째에 있는 A1 프린터의 총액 밖에 구하지 못했다는 점인데요, 다음 포스팅에서는 For를 이용해서 A1 프린터뿐만 아니라 B1, C1 프린터의 총액까지 한번에 구할 수 있는 매크로를 만들어보도록 하겠습니다. 그럼 오늘도 코로나 조심하는 하루 되세요 :)