엑셀 VBA 기본연산 코딩하기: Visual Basic으로 더하기·빼기·곱하기·나누기
엑셀 VBA의 기본연산은 셀 값을 읽고, 변수에 담아 계산한 뒤, 결과를 다시 시트에 쓰는 흐름부터 이해하면 어렵지 않습니다. 이 글은 Visual Basic 문법의 핵심과 안전한 예외 처리를 함께 설명합니다.

VBA 기본연산을 시작하기 전: 매크로와 모듈 준비
엑셀에서 VBA 코딩을 처음 시작할 때는 개발 도구 탭에서 Visual Basic 편집기를 열고, 삽입 메뉴의 모듈을 하나 추가하는 순서가 가장 단순합니다. 모듈은 여러 매크로를 보관하는 작업 노트와 비슷합니다. 표의 A열과 B열에 숫자를 입력하고 C열부터 결과를 표시할 자리도 미리 만들어 두면, 코드가 어느 값을 읽고 어느 곳에 결과를 쓰는지 화면에서 바로 확인할 수 있습니다. 처음에는 복잡한 사용자 정의 함수보다 Sub 프로시저 하나에서 연산 과정을 끝까지 경험하는 편이 이해에 도움이 됩니다.
보안 설정 때문에 매크로가 실행되지 않는 경우도 있으므로, 파일은 매크로 사용 통합 문서 형식인 xlsm으로 저장하는 습관을 들이는 것이 좋습니다. 회사나 학교에서 받은 파일은 신뢰할 수 있는 출처인지 먼저 확인해야 합니다. 연산 예제를 시험할 때는 원본 표를 복사한 시트에서 실행하면 실수로 수식을 덮어쓰거나 값이 바뀌는 위험을 줄일 수 있습니다. 실행 전에는 대상 시트 이름, 입력 범위, 결과 범위를 종이에 짧게 적어 두면 코드의 목적이 훨씬 선명해집니다.
변수 선언이 필요한 이유와 숫자 자료형 고르기
VBA에서 변수는 계산에 사용할 값을 이름으로 보관하는 상자입니다. Option Explicit를 모듈 맨 위에 쓰고 Dim sumValue As Double처럼 선언하면 철자가 비슷한 이름을 잘못 입력했을 때 바로 발견할 수 있습니다. 정수만 다룰 것 같아도 나누기 결과에는 소수점이 생기기 쉬우므로, 기본연산 학습 단계에서는 Double 자료형이 안전합니다. 금액처럼 소수점 자릿수를 엄격하게 다뤄야 하는 업무라면 Currency를 검토하고, 개수나 행 번호처럼 정수만 필요한 값에는 Long을 선택하는 식으로 용도를 구분합니다.
변수 이름은 a, b처럼 너무 짧게만 두기보다 salesAmount, discountRate, totalPrice처럼 역할이 드러나게 정하면 나중에 코드를 읽기 좋습니다. 한글 변수명도 기술적으로 가능하지만, 외부 예제와 협업 환경을 고려하면 영문과 일관된 표기 규칙을 쓰는 경우가 많습니다. 입력값을 변수에 담은 뒤 결과를 다른 변수에 저장하는 구조는 셀 주소가 바뀌어도 계산 논리를 추적하기 쉽습니다. 선언과 대입을 분리하는 습관은 오류 메시지를 이해하고 디버그 창에서 중간값을 점검할 때도 큰 도움이 됩니다.
셀의 값을 읽고 결과 셀에 쓰는 기본 구조
가장 기본적인 흐름은 먼저 Range("A2").Value와 Range("B2").Value를 읽어 변수에 넣고, 계산한 값을 Range("C2").Value에 쓰는 방식입니다. Value는 셀에 보이는 값이나 저장된 숫자를 다루는 속성입니다. 이 예제는 같은 시트에서 실행한다는 가정으로 짧게 적었지만, 실제 업무 파일에서는 Worksheets("매출").Range("A2").Value처럼 시트 이름까지 명시하는 편이 의도하지 않은 활성 시트에 값을 쓰는 사고를 막아 줍니다.
숫자로 보이는 셀에도 공백, 문자, 오류값이 섞일 수 있다는 점을 기억해야 합니다. IsNumeric으로 입력값이 숫자인지 먼저 검사하고, 빈 셀을 어떤 값으로 볼지 규칙을 정하면 결과가 예측 가능해집니다. 테스트 단계에서는 A2에 10, B2에 5를 넣고 더하기 결과가 15로 나오는지 확인해 보세요. 한 번의 정상 실행만으로 끝내지 말고 음수, 소수, 빈 셀을 각각 넣어 보면 코드가 처리해야 할 조건이 자연스럽게 드러납니다.
더하기와 빼기: 합계와 차이를 만드는 방법
더하기는 VBA에서 plus 기호를 사용해 sumValue = leftValue + rightValue처럼 작성합니다. 빼기는 differenceValue = leftValue - rightValue처럼 같은 구조로 쓸 수 있습니다. 이 두 연산은 견적서의 합계, 재고 증감, 목표와 실적의 차이처럼 많은 표 작업의 출발점입니다. 계산식을 한 줄에 길게 넣기보다 의미 있는 결과를 변수에 담으면, 어느 결과가 어느 열로 가야 하는지 분명해지고 다음 단계의 조건문에서도 재사용하기 편해집니다.
결과 셀의 표시 형식은 연산과 별개의 문제입니다. 예를 들어 금액을 더한 결과가 1500이라도 셀 서식이 날짜나 백분율이면 엉뚱하게 보일 수 있습니다. 코드가 맞는데 화면이 이상하면 먼저 결과 셀의 NumberFormat을 확인하세요. 또한 누적 합계를 계산할 때는 기존 셀 값을 더하는지, 매번 새 입력값 두 개만 더하는지 요구사항을 구별해야 합니다. 의도와 다른 누적은 연산자 오류가 아니라 데이터 흐름을 잘못 정한 문제인 경우가 많습니다.
곱하기와 나누기: 수량·단가 계산에서 주의할 점
곱하기는 별표를 사용하며 productValue = quantity * unitPrice처럼 작성합니다. 엑셀 수식의 곱하기와 같은 기호이므로 낯설지 않지만, VBA에서는 두 값이 실제 숫자인지 먼저 살피는 편이 안전합니다. 수량과 단가의 곱, 시간과 시급의 곱, 가로와 세로의 곱처럼 단위가 다른 값을 곱할 때는 변수명에 단위를 담거나 주석을 남겨 두면 결과를 해석하기 쉬워집니다. 특히 백분율은 10%를 10으로 넣는지 0.1로 넣는지에 따라 결과가 백 배 차이 날 수 있습니다.
나누기는 slash 기호를 사용하며 quotientValue = totalAmount / countValue처럼 씁니다. VBA의 일반 나누기는 소수점을 포함한 결과를 반환할 수 있으므로 Double과 잘 맞습니다. 몫만 필요하다면 역슬래시 연산자나 Int 같은 별도 방법을 검토해야 하지만, 처음에는 일반 나누기와 소수 결과를 정확하게 이해하는 것이 우선입니다. 평균을 구할 때 분모가 인원 수인지 유효 데이터 수인지 확인하지 않으면 계산은 실행되어도 의미가 틀어질 수 있으므로, 계산식 앞에 데이터 기준을 명확히 적어 두세요.

0으로 나누기 오류를 막는 If 조건문
나누기에서 가장 중요한 예외는 분모가 0인 경우입니다. If rightValue <> 0 Then으로 값을 확인한 뒤에만 나누기를 실행하면 실행 중 오류를 예방할 수 있습니다. 조건이 거짓일 때는 결과 셀을 비우거나 "계산 불가" 같은 안내를 표시하도록 Else 구문을 둡니다. 오류를 숨기는 On Error Resume Next보다 원인을 명시적으로 검사하는 방식이 초보자에게도 안전하고, 나중에 다른 사람이 코드를 고칠 때도 규칙을 이해하기 쉽습니다.
0과 빈 셀은 같은 의미가 아닐 수 있습니다. 빈 셀은 아직 입력되지 않았다는 뜻이고, 0은 실제 값일 수 있으므로 업무 기준에 맞게 분리해서 처리해야 합니다. 예를 들어 판매 수량이 비어 있으면 입력 요청을 보여 주고, 판매 수량이 0이면 평균 단가를 계산하지 않는 식입니다. 조건문을 한 번 넣어 두면 데이터가 늘어나도 오류 팝업 때문에 작업이 중단되는 일을 줄일 수 있습니다. 이 방어 로직은 나누기뿐 아니라 범위 확인, 시트 존재 확인, 파일 저장 전 검토에도 응용할 수 있습니다.

한 번에 실행하는 기본연산 예제 코드
아래 예제는 A2와 B2의 숫자를 읽어서 C2부터 F2까지 더하기, 빼기, 곱하기, 나누기 결과를 기록하는 가장 작은 실습용 구조입니다. 코드 창에 붙여 넣은 뒤 F5로 실행하거나 엑셀 화면에서 매크로 목록을 열어 실행할 수 있습니다. 처음 실행할 때는 입력 셀과 결과 셀이 다른 데이터와 겹치지 않는지 확인하고, 결과가 맞는지 계산기를 이용해 한 번 대조하세요. 코드 한 줄의 의미를 직접 바꾸어 보는 경험이 문법을 외우는 것보다 오래 남습니다.
실무에서는 결과 열에 제목을 쓰거나 마지막 행까지 반복하는 기능을 붙이게 됩니다. 그러나 반복문을 추가하기 전에 단일 행에서 값이 정확하게 계산되는지 먼저 확인해야 합니다. 한 행의 규칙이 불명확한 상태에서 여러 행을 처리하면 잘못된 결과가 빠르게 퍼질 수 있습니다. 예제의 Range 주소를 바꾸면서 각 결과가 어디에 표시되는지 관찰하고, Debug.Print로 변수 값을 즉시 창에 출력해 보면 데이터가 이동하는 흐름을 이해하는 데 도움이 됩니다.
Option Explicit
Sub BasicArithmetic()
Dim leftValue As Double
Dim rightValue As Double
Dim sumValue As Double
Dim differenceValue As Double
Dim productValue As Double
Dim quotientValue As Double
If Not IsNumeric(Range("A2").Value) Or Not IsNumeric(Range("B2").Value) Then
MsgBox "A2와 B2에 숫자를 입력하세요."
Exit Sub
End If
leftValue = CDbl(Range("A2").Value)
rightValue = CDbl(Range("B2").Value)
sumValue = leftValue + rightValue
differenceValue = leftValue - rightValue
productValue = leftValue * rightValue
Range("C2").Value = sumValue
Range("D2").Value = differenceValue
Range("E2").Value = productValue
If rightValue <> 0 Then
quotientValue = leftValue / rightValue
Range("F2").Value = quotientValue
Else
Range("F2").Value = "계산 불가"
End If
End Sub여러 행으로 확장할 때는 마지막 행을 먼저 찾기
표의 각 행마다 같은 연산을 해야 한다면 Rows.Count와 End(xlUp)를 이용해 마지막 입력 행을 찾고 For 반복문으로 처리합니다. 기준 열은 모든 행에 값이 들어 있는 열을 골라야 합니다. 중간에 빈 행이 있을 수 있는 표라면 단순히 한 열만 보고 종료하는 방식이 적절한지 다시 검토하세요. 반복문 안에서는 Cells(rowIndex, 1).Value처럼 행 번호를 변수로 써서 A열과 B열을 읽고, 같은 행의 C열 이후에 결과를 기록하면 표 구조가 안정적입니다.
여러 행을 처리할수록 예외 행의 규칙이 중요해집니다. 숫자가 아닌 값, 공백, 0으로 나누는 행을 발견했을 때 전체 실행을 멈출지 해당 행만 건너뛸지 결정해야 합니다. 결과 옆에 상태 메시지를 남기면 나중에 어느 행을 확인해야 하는지 알기 쉽습니다. 테스트는 세 줄 정도의 작은 표로 시작하고, 정상 숫자·빈 값·0을 섞어 실행해 본 뒤 실제 파일에 적용하세요. 대량 데이터를 다룰 때는 계산 전 백업을 만들고, 결과 범위를 지우는 코드가 입력 범위를 침범하지 않는지도 꼭 확인해야 합니다.
숫자 서식과 반올림을 코드에서 다루는 방법
계산 결과의 실제 값과 화면에 보이는 모양은 다릅니다. quotientValue가 0.333333처럼 길게 나올 때 표시만 두 자리로 제한하려면 결과 셀의 NumberFormat을 "0.00"으로 설정할 수 있습니다. 저장되는 값 자체를 두 자리로 반올림하려면 Round 함수를 사용합니다. 둘 중 무엇이 필요한지는 뒤에서 다시 계산할 때 정확한 원값이 필요한지, 보고서에서 보기 좋은 숫자만 필요한지에 따라 달라집니다. 표시용 서식과 계산용 반올림을 혼동하면 합계가 화면의 합과 조금 다르게 보일 수 있습니다.
금액, 비율, 날짜가 섞인 표에서는 각 열마다 적절한 형식을 지정하는 편이 좋습니다. 금액에는 천 단위 구분기호, 비율에는 퍼센트, 수량에는 불필요한 소수점이 없는 형식을 적용할 수 있습니다. 다만 코드가 모든 서식을 강제로 바꾸면 사용자가 이미 만든 보고서 스타일을 해칠 수 있으므로, 필요한 결과 열에만 제한적으로 적용하세요. 반올림 규칙은 세무·정산·평가 기준에 따라 다를 수 있으므로, 업무용 매크로에서는 기준 문서를 확인하고 주석으로 이유를 남기는 습관이 안전합니다.
디버그와 오류 확인: 결과가 다를 때 살필 순서
결과가 예상과 다르면 먼저 입력 셀 주소, 변수에 들어간 값, 사용한 연산자, 결과 셀 주소를 순서대로 확인합니다. VBA 편집기의 중단점과 F8 한 단계 실행을 사용하면 어떤 줄에서 값이 달라지는지 볼 수 있습니다. Immediate 창의 Debug.Print leftValue, rightValue는 화면을 복잡하게 만들지 않고 중간값을 확인하는 간단한 방법입니다. 오류 메시지를 닫고 다시 실행하기보다, 메시지가 가리키는 줄과 현재 변수 값을 확인하는 과정이 재발 방지에 더 효과적입니다.
특히 문자열로 저장된 숫자, 쉼표가 포함된 금액, 빈 문자열은 계산 결과를 흔들 수 있습니다. IsNumeric 검사와 CDbl 변환을 적절히 사용하되, 변환할 수 없는 값을 억지로 0으로 바꾸지는 마세요. 데이터가 잘못 들어온 사실을 숨기면 합계는 나오지만 신뢰할 수 없게 됩니다. 코드를 수정한 뒤에는 처음에 사용한 예제 값만 다시 넣지 말고 경계값과 예외값도 함께 시험해야 합니다. 검증 기록을 간단히 남겨 두면 다음에 같은 매크로를 고칠 때 훨씬 빠르게 원인을 좁힐 수 있습니다.
기본연산 매크로를 안전하게 사용하는 체크리스트
실행 전에는 파일을 xlsm 형식으로 저장했는지, 원본 시트를 백업했는지, 입력 열과 결과 열이 맞는지 확인합니다. 코드에는 Option Explicit와 명확한 변수명을 사용하고, 나누기 전에는 분모가 0인지 검사하세요. 숫자가 아닌 입력을 어떻게 처리할지도 정해야 합니다. 결과가 표시되는 셀의 서식이 값의 의미와 맞는지까지 확인하면, 계산 자체는 맞지만 보고서에서 오해되는 문제를 줄일 수 있습니다.
마지막으로 작은 예제에서 손계산한 값과 VBA 결과를 비교하고, 여러 행으로 확장하기 전에는 한 행의 동작을 충분히 검토하세요. 매크로는 같은 작업을 빠르게 반복하게 해 주지만, 잘못된 규칙도 빠르게 반복합니다. 그래서 입력 검증, 예외 처리, 백업, 결과 점검은 코딩 실력과 별개로 반드시 필요한 단계입니다. 이 기본 구조를 익힌 뒤에는 조건에 따라 할인율을 적용하거나, 사용자에게 값을 받거나, 보고서용 표를 자동 작성하는 기능으로 천천히 확장할 수 있습니다.
자주 묻는 질문
VBA에서 나누기 결과에 소수점이 나오게 하려면 어떤 자료형을 쓰나요?
기본연산 예제에서는 Double을 사용하면 소수점을 포함한 결과를 다루기 편합니다. 결과 셀의 표시 자릿수는 NumberFormat으로 별도로 정할 수 있습니다.
0으로 나누기 오류는 왜 조건문으로 처리해야 하나요?
분모가 0이면 VBA가 실행 중 오류를 내므로, If 조건으로 먼저 검사한 뒤 계산하거나 안내 문구를 표시해야 매크로가 안전하게 끝납니다.
여러 행을 계산할 때도 같은 코드를 사용할 수 있나요?
가능합니다. 단일 행에서 검증한 연산 규칙을 For 반복문으로 확장하고, 숫자가 아닌 값과 빈 셀을 어떻게 처리할지 함께 정해야 합니다.