ChatGPT VBA 요청문부터 입력 검사까지: 숫자 세 개의 합계 계약
VBA 코드가 300000을 출력하는 것과 잘못된 입력을 거부하는 것은 서로 다른 요구입니다. B2:B4에 숫자가 아닌 값이 섞였는데 그 셀을 조용히 제외하면 계산이 끝나도 입력 계약은 지켜지지 않습니다. 이 글은 요청문에 거부 조건까지 넣고, 세 셀을 모두 검사한 뒤에만 결과 한 칸을 쓰는 기준 코드를 만듭니다.
요청문은 사람이 검토할 설계 예시이며 ChatGPT에 실제 전송한 결과가 아닙니다. VBA도 macOS에서 실행하지 않았습니다. 아래 가상 입력은 Python 독립 계산과 코드 정적 검사로 확인했고, Windows Excel에서 수행할 컴파일·입력 거부·셀 출력 확인을 별도로 표시합니다.
숫자 세 개와 이전 출력 보존 계약
복사본 통합문서에 매출현황, 결과 시트를 만들고 다음 값을 입력합니다. 초기 결과 A1에는 777을 넣어 오류 때 이전 값이 유지되는지 구분합니다.
| 셀 | 가상 입력 | 의미 |
|---|---|---|
| 매출현황!B2 | 120000 | 첫 금액 |
| 매출현황!B3 | 80000 | 둘째 금액 |
| 매출현황!B4 | 100000 | 셋째 금액 |
| 결과!A1 | 777 | 실행 전 구분값 |
정상 기대값은 120000+80000+100000=300000입니다. 허용 범위는 숫자로 저장된 0 이상 1000000000 이하 정수입니다. 0은 허용하지만 빈 셀, 숫자처럼 생긴 문자열, TRUE/FALSE, 오류값, 음수, 소수는 거부합니다. 이는 이 예제의 금액 계약이며 모든 업무의 금액 처리 규칙이라고 일반화하지 않습니다.

요청문에 거부 조건까지 넣기
[ROLE]
명시적인 통합문서와 입력 검사를 사용하는 Excel VBA 작성자.
[CONTEXT]
ThisWorkbook의 매출현황!B2:B4 = 120000, 80000, 100000.
쓰기 위치는 결과!A1 하나이며 원본 셀은 바꾸지 않는다.
[TASK]
세 셀을 검사한 후 합산한다. 텍스트 숫자도 거부한다.
허용 값은 숫자 형식의 0..1000000000 정수이며 Boolean은 제외한다.
[FORMAT]
Option Explicit, ThisWorkbook, 오류 처리, Debug.Print를 포함한 완전한 모듈.
출력 쓰기는 모든 입력 검사 뒤에 한 번만 수행한다.
[CHECK]
정상 합계 300000. B3을 문자열 80000으로 바꾸면 오류이고 기존 결과는 유지한다.
빈칸, 오류, 음수, 소수, 범위 초과도 검사한다. 실제 실행 여부를 구분해서 설명한다.
범위·출력 위치·숫자 계약·실패 시 보존값을 같은 요청에 고정했습니다. 실제 답변을 받더라도 아래 코드와 같다고 가정하지 말고 각 입력을 어떤 순서로 검사하는지 읽어야 합니다. 내부 파일 경로·계정·개인정보를 넣는 대신 가상 시트명과 숫자로 문제를 재현하세요.

숫자처럼 보이는 문자열을 구분하는 전체 코드
VarType은 변수의 하위 형식을 나타내는 값을 반환합니다. IsNumeric은 표현식을 숫자로 평가할 수 있는지 판단합니다. 숫자 문자열을 허용하지 않는 이번 계약에는 IsNumeric만으로 충분하지 않으므로 형식 목록을 먼저 확인하고, 범위와 정수 여부를 검사합니다. ThisWorkbook은 현재 매크로 코드가 실행되는 통합문서를 가리킵니다.
Option Explicit
Public Sub SumSales()
Dim sourceSheet As Worksheet, resultSheet As Worksheet, cell As Range
Dim v As Variant, total As Double, savedEvents As Boolean, errorText As String
savedEvents = Application.EnableEvents
On Error GoTo HandleError
Set sourceSheet = ThisWorkbook.Worksheets("매출현황")
Set resultSheet = ThisWorkbook.Worksheets("결과")
For Each cell In sourceSheet.Range("B2:B4").Cells
v = cell.Value2
total = total + WholeAmount(v, cell.Address(False, False))
Next cell
If resultSheet.ProtectContents Then Err.Raise vbObjectError + 501, , "Output sheet is protected"
If resultSheet.Range("A1").MergeCells Then Err.Raise vbObjectError + 502, , "Output A1 must not be merged"
Application.EnableEvents = False
resultSheet.Range("A1").Value2 = total
Application.EnableEvents = savedEvents
Debug.Print "sum=" & total
MsgBox "Compare result A1 with the independent total.", vbInformation
Exit Sub
HandleError:
errorText = Err.Number & " / " & Err.Description
Application.EnableEvents = savedEvents
MsgBox "Stopped: " & errorText & vbCrLf & "Invalid input is not ignored.", vbExclamation
End Sub
Private Function WholeAmount(ByVal v As Variant, ByVal address As String) As Double
Select Case VarType(v)
Case vbByte, vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal
Case Else
Err.Raise vbObjectError + 201, , address & ": enter a numeric cell value"
End Select
If v < 0 Or v > 1000000000# Then
Err.Raise vbObjectError + 202, , address & ": allowed range is 0..1000000000"
End If
If v <> Fix(v) Then Err.Raise vbObjectError + 203, , address & ": integer required"
WholeAmount = CDbl(v)
End Function
Value2에서 읽은 숫자 형식의 값만 허용합니다. 셀 수식이 숫자 결과를 내면 그 결과도 계약 범위 안에서 받지만, 수식의 업무상 정당성을 검증하는 것은 아닙니다. 날짜처럼 표시된 숫자도 화면 형식만으로 구분하지 않으므로 입력 영역에는 금액만 넣어야 합니다. 변환 함수를 먼저 적용해 텍스트를 숫자로 바꾸지 않습니다.

F8 확인과 반례 실행 순서
-
연습용 .xlsm 복사본을 열어 B2:B4와 결과 A1=777을 입력합니다.
-
ZIP의 UTF-8
SumSales.bas를 텍스트 편집기에서 열고 표준 모듈에 붙여 넣어 컴파일을 확인합니다. -
SumSales를 F8로 진행하며 세 번의 입력 검사가 끝난 뒤에만 A1 쓰기 줄로 이동하는지 확인합니다. -
정상 실행 후 A1과 Immediate 창의 sum=300000을 손계산과 대조합니다.
-
별도 복사본에서 A1=777로 되돌리고 B3을 텍스트 80000으로 바꿉니다. 중단 메시지의 B3 주소와 A1=777 유지 여부를 확인합니다.
-
빈칸·TRUE·오류값·음수·소수도 하나씩 바꿔 검사하고, 다음 시험 전 원래 세 숫자로 복구합니다.

실패별 예상 결과
| B3 시험값 | 예상 판정 | 정상 복구 |
|---|---|---|
| 숫자 80000 | 합계 300000 | 기본 입력 유지 |
| 텍스트 80000 | 중단, 기존 A1 유지 | 숫자 80000으로 다시 입력 |
| 빈칸 또는 TRUE | 중단, 기존 A1 유지 | 원래 금액을 숫자로 입력 |
| -1 또는 0.5 | 범위·정수 검사에서 중단 | 원래 80000 복구 |
| 1000000001 | 상한 초과로 중단 | 계약 안의 정수 입력 |
| 오류 셀 | 형식 검사에서 중단 | 오류 수식과 원래 금액 확인 |
오류 메시지가 뜬 뒤 이전 결과가 남아 있는 것은 새 계산 성공을 뜻하지 않습니다. 메시지·입력 상태·결과를 함께 기록해야 합니다. 첫 실행의 300000만 보고 다음 잘못된 입력까지 성공했다고 오해하지 마세요. 쓰기 단계에서 시트 보호나 다른 Excel 오류가 나면 별도 문제로 기록합니다.

실제 확인한 범위와 Windows Excel 확인사항
첨부의 python verify_contract.py는 5개 검사를 실행합니다. 독립 합계와 숫자 경계, 잘못된 값에서 이전 출력 777을 보존하는 계산 계약, VBA 코드의 검사 후 쓰기 순서와 명시적 통합문서 참조를 확인했습니다. 이 검사는 VBA를 실행하지 않으므로 Excel의 실제 오류 메시지·Debug.Print·셀 쓰기가 작동했다는 증거가 아닙니다.
Windows Excel에서는 컴파일, 정상 합계, 각 거부 입력, 보호된 결과 시트, 병합된 A1, 이벤트 설정 복원을 확인해야 합니다. 오류 시 EnableEvents는 실행 전 값으로 되돌리지만 사용자 강제 종료나 Excel 자체 종료까지 처리하는 복구 시스템은 아닙니다. 원본은 그대로 두고 복사본을 저장하지 않고 닫는 것이 실습을 되돌리는 기준입니다.
적용 한계
이 코드는 B2:B4와 결과 A1만 다룹니다. 부가세·소수 통화·환율·여러 파일·전표 승인 같은 계산은 포함하지 않습니다. 소수가 필요한 업무에 정수 검사를 삭제해 바로 적용하지 말고 단위·반올림·상한·기대값을 새로 정해야 합니다. 코드를 생성하는 도구를 바꿔도 입력과 출력의 검산 계약은 계속 유지하세요.
공식 자료
VarType function (Visual Basic for Applications)
IsNumeric function (Visual Basic for Applications)
Application.ThisWorkbook property (Excel)
출처 원문 수집일: S1 2026-09-24; S2 2026-09-24; S3 2026-09-24.