AI 해결 노트 · 2026-09-18 · 실측 2026-09-18
견적서 세액이 0과 32억이 된 이유 — $ 하나로 기준 칸을 붙들어 두기
한 줄로
부가세율을 D1 한 칸에 적어 두고 =D4*D1로 세액을 구한 뒤 아래로 복사하면, 둘째 줄부터 세율 자리에 D2·D3·D4가 들어옵니다. 더미 견적서 5줄에서 세액이 2400 → 0 → #VALUE! → 32억 6400만 → 26억 2500만으로 나왔고 합계는 #VALUE!였습니다. =D4*$D$1로 고친 열은 합계 28,400원이 나왔습니다.
증상
- 첫 줄은 맞는데 둘째 줄부터 숫자가 0이 되거나 터무니없이 커진다
- 수식을 복사했더니
#VALUE!가 뜬다 - 세액 합계가
#VALUE!로 나온다 - 수식 줄을 보면 내가 지정한 칸이 아닌 다른 칸이 들어와 있다
실측 환경
| 항목 | 값 |
|---|---|
| OS | Windows 11 Home (10.0.26200) |
| Excel | 16.0 (빌드 20326.0) |
| 조작 방법 | Excel COM (Excel.Application, Visible=false). 셀에 수식 문자열을 넣고, 복사는 Range.Copy + Range.PasteSpecial(xlPasteAll) 로 했습니다. 키보드 F4를 실제로 눌러 본 시험이 아닙니다 |
| 시험 파일 | 직접 만든 더미 X1_42_견적서.xlsx |
| 로그 | 원자료\excel-absolute-reference\01_absolute_실행로그.txt, 02_png_렌더로그.txt (스크립트 X1_42_absolute.py, X1_42_png.py 도 같은 폴더) |
더미 견적서
부가세율을 D1 한 칸에 10%로 적고, 아래에 품목 5줄을 뒀습니다. 공급가(D열)는 D4에 =B4*C4를 넣고 D5:D8로 복사해 채웠습니다. 복사된 칸에는 =B5*C5부터 =B8*C8까지가 들어갔고 값은 모두 그 줄의 수량 × 단가와 맞았습니다. 참조하는 칸이 줄마다 같이 내려가야 맞는 자리이기 때문입니다.
세액을 두 가지로 계산했습니다. E열에는 =D4*D1을 넣고 아래로 복사했고, F열에는 =D4*$D$1을 넣고 같은 방식으로 복사했습니다.

| 품목 | 수량 | 단가 | 공급가 | 세액 E (=D4*D1 복사) | E칸에 남은 수식 | 세율 자리에 들어온 값 | 세액 F ($D$1) |
|---|---|---|---|---|---|---|---|
| 볼펜 | 20 | 1200 | 24000 | 2400 | =D4*D1 | D1 = 10% | 2400 |
| 노트 | 10 | 3500 | 35000 | 0 | =D5*D2 | D2 = (빈칸) | 3500 |
| 파일 | 5 | 2800 | 14000 | #VALUE! | =D6*D3 | D3 = 「공급가」 | 1400 |
| 토너 | 2 | 68000 | 136000 | 3264000000 | =D7*D4 | D4 = 24000 | 13600 |
| 용지 | 3 | 25000 | 75000 | 2625000000 | =D8*D5 | D5 = 35000 | 7500 |
| 합계 | 수식 | 값 |
|---|---|---|
| 공급가 | =SUM(D4:D8) | 284,000 |
| 세액 (상대참조 E열) | =SUM(E4:E8) | #VALUE! |
세액 ($D$1 F열) | =SUM(F4:F8) | 28,400 |
첫 줄만 맞았습니다. 둘째 줄의 세율 자리에는 빈칸인 D2가 들어와 0이 곱해졌고, 셋째 줄은 머리글 「공급가」라는 글자가 들어와 #VALUE!가 됐습니다. 넷째·다섯째 줄은 자기 위쪽 줄의 공급가가 세율 자리에 들어앉아 억 단위가 됐습니다.
여기서 눈여겨볼 곳은 둘째 줄입니다. 0은 오류 표시가 없습니다. 밀려난 자리에 빈칸 대신 다른 비율이 들어 있으면 어떻게 되는지 따로 만들어 봤습니다. D1에 부가세율 0.1, 바로 아래 D2에 지난달 할인율 0.05를 남겨 둔 표입니다.
| 품목 | 공급가 | 세액(상대참조) | 그 칸 수식 | 세액($D$1) |
|---|---|---|---|---|
| 볼펜 | 24000 | 2400 | =D4*D1 | 2400 |
| 노트 | 35000 | 1750 | =D5*D2 | 3500 |
둘째 줄은 35,000 × 0.05 = 1,750입니다. 오류 표시도 없고 금액도 그럴듯합니다. 맞는 값 3,500과 절반 차이인데 검산하지 않으면 그대로 나갑니다. #VALUE!와 32억은 차라리 눈에 띄는 축입니다.
왜 그렇게 되나
$가 없는 주소는 「몇 칸 떨어진 자리」로 기억됩니다. 복사하면 그 거리가 유지되도록 주소가 다시 쓰입니다. E4에 있던 =D4*D1은 「내 왼쪽 한 칸 × 내 위쪽 세 칸의 왼쪽 한 칸」이고, 이 수식이 E5로 가면 각각 한 줄씩 내려가 =D5*D2가 됩니다.
공급가 =B4*C4가 복사되어도 문제가 없던 것은, 그 수식이 가리키는 칸들이 줄마다 같이 내려가야 맞기 때문입니다. 세율처럼 표 어디에서 봐도 한 칸만 봐야 하는 값이 문제입니다. 열 문자나 행 번호 앞에 $를 붙이면 그 부분은 복사해도 따라 움직이지 않습니다.
$D$1 · $D1 · D$1 을 결과 값으로 비교
C1:E3 아홉 칸에 서로 다른 값을 넣고, 그중 D1을 기준 칸으로 삼았습니다. C1=100, D1=10, E1=1000 / C2=200, D2=20, E2=2000 / C3=300, D3=30, E3=3000. 값을 다 다르게 해 두면 복사된 수식이 어느 칸을 집었는지 숫자만 봐도 알 수 있습니다.
네 가지 수식을 각각 한 칸에 넣고, 그 칸을 포함해 가로 3칸 × 세로 3칸 범위로 복사했습니다.

`=D1` 상대참조 — 가로로도 세로로도 다 움직입니다. 오른쪽 끝 열은 값을 넣어 두지 않은 F1·F2·F3을 집어 0이 됐습니다.
| 1열 | 2열 | 3열 | |
|---|---|---|---|
| 1행 | 10 (=D1) | 1000 (=E1) | 0 (=F1) |
| 2행 | 20 (=D2) | 2000 (=E2) | 0 (=F2) |
| 3행 | 30 (=D3) | 3000 (=E3) | 0 (=F3) |
`=$D$1` 절대참조 — 아홉 칸 전부 10입니다. 수식도 아홉 칸 모두 =$D$1 그대로입니다.
| 1열 | 2열 | 3열 | |
|---|---|---|---|
| 1행 | 10 | 10 | 10 |
| 2행 | 10 | 10 | 10 |
| 3행 | 10 | 10 | 10 |
`=$D1` 혼합참조, 열만 고정 — 가로로 복사해도 D열에 붙어 있고, 세로로는 따라 내려갑니다.
| 1열 | 2열 | 3열 | |
|---|---|---|---|
| 1행 | 10 (=$D1) | 10 (=$D1) | 10 (=$D1) |
| 2행 | 20 (=$D2) | 20 (=$D2) | 20 (=$D2) |
| 3행 | 30 (=$D3) | 30 (=$D3) | 30 (=$D3) |
`=D$1` 혼합참조, 행만 고정 — 세로로 복사해도 1행에 붙어 있고, 가로로는 따라 이동합니다.
| 1열 | 2열 | 3열 | |
|---|---|---|---|
| 1행 | 10 (=D$1) | 1000 (=E$1) | 0 (=F$1) |
| 2행 | 10 (=D$1) | 1000 (=E$1) | 0 (=F$1) |
| 3행 | 10 (=D$1) | 1000 (=E$1) | 0 (=F$1) |
$는 자기 바로 뒤에 붙은 것만 붙듭니다. $D면 열, D$1의 $1이면 행입니다. 견적서처럼 위아래로만 복사하는 자리에서는 D$1도 $D$1과 같은 값을 냅니다. 행이 붙들려 있으니 아래로 내려가도 1행을 봅니다. 다만 나중에 그 열을 옆으로 한 칸 복사하면 E$1로 바뀌어 갈라집니다. 한 칸만 봐야 하는 값이면 $D$1으로 둘 다 붙드는 편이 뒤탈이 없습니다.
혼합참조가 절대참조보다 나은 자리
두 방향으로 동시에 채우는 표에서는 $D$1이 오히려 틀립니다. 수량을 세로 머리(A열), 단가를 가로 머리(1행)에 두고 가운데를 채우는 표를 만들어 봤습니다. 왼쪽 위 한 칸에 =$A2*B$1을 넣고 3칸 × 3칸으로 복사했습니다.

| 수량↓ / 단가→ | 1000 | 2000 | 5000 |
|---|---|---|---|
| 1 | 1000 (=$A2*B$1) | 2000 (=$A2*C$1) | 5000 (=$A2*D$1) |
| 5 | 5000 (=$A3*B$1) | 10000 (=$A3*C$1) | 25000 (=$A3*D$1) |
| 10 | 10000 (=$A4*B$1) | 20000 (=$A4*C$1) | 50000 (=$A4*D$1) |
아홉 칸 모두 그 줄의 수량과 그 열의 단가를 곱한 값이 나왔습니다. $A2는 수량이 늘 A열에 있으니 열을 붙들고 행은 풀어 놓은 것이고, B$1은 단가가 늘 1행에 있으니 행을 붙들고 열은 풀어 놓은 것입니다.
같은 자리에 =A2*B1을 넣고 똑같이 복사하면 이렇게 됩니다.
| 2열 | 3열 | 4열 | |
|---|---|---|---|
| 1행 | 1000 (=A2*B1) | 2000000 (=B2*C1) | 10000000 (=C2*D1) |
| 2행 | 5000 (=A3*B2) | 10000000 (=B3*C2) | 50000000 (=C3*D2) |
| 3행 | 50000 (=A4*B3) | 100000000 (=B4*C3) | 500000000 (=C4*D3) |
맞는 값이 나온 칸은 1000과 5000 두 개뿐입니다. =A3*B2가 5000이 된 것은 B2에 들어 있던 값(1×1000)이 마침 1000이어서 생긴 우연입니다. 나머지 일곱 칸은 두 참조 가운데 하나 이상이 머리글에서 표 안쪽 계산 결과로 옮겨 가 엉뚱한 값이 됐습니다.
$ 대신 이름을 붙이는 방법
기준 칸에 이름을 붙이는 방법도 있습니다. 이번 시험에서는 COM으로 이름 「부가세율」을 견적서!$D$1, 즉 절대참조로 등록했습니다.
=D4*부가세율이 수식을 H4에 넣고 H5:H8로 복사한 결과입니다.
| 칸 | 수식 | 값 |
|---|---|---|
| H4 | =D4*부가세율 | 2400 |
| H5 | =D5*부가세율 | 3500 |
| H6 | =D6*부가세율 | 1400 |
| H7 | =D7*부가세율 | 13600 |
| H8 | =D8*부가세율 | 7500 |
F열($D$1)과 같은 값입니다. 수식만 봐도 무엇을 곱하는지 읽히는 점이 낫습니다.
기준 칸을 옮기면 어떻게 되는지도 확인했습니다. 시트를 하나 더 만들어 B1에 0.1을 넣고 이름 「세율2」를 이름이동!$B$1로 등록한 뒤 =1000*세율2를 넣어 100을 받았습니다. 그다음 B1을 잘라내어 B10에 붙여넣었습니다.
| 이름이 가리키는 곳 | =1000*세율2 | |
|---|---|---|
| 옮기기 전 | =이름이동!$B$1 | 100 |
| B1을 B10으로 옮긴 뒤 | =이름이동!$B$10 | 100 |
이름이 따라 움직여 수식은 그대로 두고도 값이 유지됐습니다. 견적서를 계속 쓸 양식으로 만들 생각이면 이쪽을 권합니다.
복사한 뒤 확인하는 법
먼저 세 칸을 눌러 봅니다. 첫 줄, 가운데 한 줄, 마지막 줄을 눌러 수식 입력줄을 봅니다. 기준 칸 주소와 $ 표시가 세 군데 모두 같은지 확인합니다. 한 군데라도 다르면 그 사이에서 참조가 밀린 것입니다. 세 칸이 같다고 전체가 맞다는 보장은 없으니, 줄이 많으면 아래 FORMULATEXT 쪽으로 전부 펼쳐 보십시오.
한 화면에서 보려면 옆 칸에 FORMULATEXT를 넣습니다. 이 글의 그림에서 「수식」이라고 붙은 칸은 모두 이 함수로 뽑은 것입니다.
=FORMULATEXT(E4)숫자로도 검산하십시오. 이번 견적서에서는 공급가 합계 284,000의 10%인 28,400이 세액 합계와 맞는지 보면 됩니다.
=SUM(D4:D8)*D1 → 28400
=SUM(F4:F8) → 28400두 값이 다르면 어딘가 어긋난 것입니다. 참조가 밀린 줄이 흔한 원인이고, 합계 범위가 잘못 잡혔을 수도 있습니다.
실패한 것
- 3×3 복사 결과를 찍으면서
cell.Address(False, False)를 호출했다가TypeError: 'str' object is not callable로 스크립트가 중간에 멈췄습니다. 이 pywin32 연결에서는Address가 함수가 아니라 값으로 잡힙니다. 로그 파일은 스크립트 끝에서 한 번에 쓰이므로 이 중단 회차는 파일로 남지 않았고, 화면에 뜬 예외를 보고 주소를 직접 만들어 넣어 다시 돌렸습니다. 고친 코드는X1_42_absolute.py에 그대로 있습니다. - F4 키로
$를 돌려 가며 붙이는 조작은 시험하지 못했습니다. 이 글의 모든 결과는 수식 문자열을 셀에 직접 넣어 얻은 것입니다. F4를 눌렀을 때$가 어떤 순서로 붙는지는 확인하지 않았으므로 적지 않았습니다. - 초안을 쓴 뒤 GPT에 사실 대조를 돌렸더니(대조 결과 =
대조결과\excel-absolute-reference_1차.md) 「위아래로만 복사하면$D1도$D$1과 값이 같다」가 로그와 다르다고 잡혔습니다. 로그를 보니$D1은 아래로 복사되며$D2·$D3으로 바뀌어 10·20·30이 나왔습니다. 위아래 복사에서$D$1과 같은 값을 내는 것은D$1쪽입니다. 본문을 고쳤습니다. - 같은 대조에서 「상대참조 표는 첫 칸 하나만 맞는다」도 로그와 다르다고 잡혔습니다. 로그를 다시 세어 보니 기대값과 맞은 칸은 B2·B3 두 개였고 둘째 칸은 우연이었습니다. 본문 숫자를 고쳤습니다.
- 「이름을 붙이면 기준 칸을 옮겨도 따라간다」와 「밀린 자리에 작은 숫자가 있으면 오류 없이 그럴듯한 금액이 나온다」 두 문장이 돌려 보지 않은 추측으로 잡혔습니다. 두 가지를 실제로 돌려 실행 로그의 (타)·(카) 항목으로 남기고 위 표에 넣었습니다.
확인하지 않은 것
- Excel 16.0 빌드 20326.0 한 가지에서만 돌렸습니다. 2016·2019나 웹용 엑셀, 구글 시트에서는 확인하지 않았습니다.
- 수식이 든 칸을 잘라내기(Ctrl+X)로 옮겼을 때 참조가 어떻게 되는지는 시험하지 않았습니다. 잘라내기는 이름이 붙은 기준 칸을 옮기는 경우에만 써 봤습니다.
- 채우기 핸들을 마우스로 끄는 방식은 COM으로 재현하지 않았습니다. 이번 결과는
Range.Copy+PasteSpecial기준입니다. - 표 서식(엑셀 표로 지정)에서 쓰는 구조적 참조(
[@수량]같은 것)는 넣어 보지 않았습니다. - 다른 시트·다른 파일을 가리키는 참조를 복사했을 때의 동작은 시험하지 않았습니다.
- R1C1 참조 방식으로 바꿔 놓았을 때의 표시는 확인하지 않았습니다.
- 이름 상자나 [수식] 탭에서 화면으로 이름을 등록하는 경로는 이 버전에서 직접 눌러 보지 않았습니다. 이번 등록은 모두 COM으로 했습니다.