2026-09-08
어제 체크해 둔 줄의 날짜가 오늘 파일을 열자 전부 오늘 날짜로 바뀌어 있다면, 수식이 잘못된 것이 아니라 TODAY() 함수의 성질 때문입니다. 먼저 안 되는 것부터 말씀드립니다. =IF(B3=TRUE, TODAY(), "") 같은 단순 수식으로는 체크한 날짜를 기록할 수 없습니다. TODAY()는 휘발성 함수라 파일을 열 때, 시트를 다시 계산할 때마다 그 시점의 날짜를 새로 냅니다. 값을 저장하는 것이 아니라 매번 다시 물어보는 구조입니다. 정산 시트에서 "입금 확인일"로 쓰셨다면 지난달 기록이 통째로 오늘 날짜로 덮여 보이게 됩니다.
날짜를 남기려면 "이미 값이 있으면 손대지 않는다"는 조건이 필요합니다. 그 조건을 수식으로 쓰면 자기 자신을 참조하게 되고, 이것이 순환 참조입니다. 엑셀은 기본적으로 순환 참조를 오류로 막기 때문에 설정을 하나 풀어야 합니다.
파일 - 옵션 - 수식 - 반복 계산 사용 체크, 최대 반복 횟수 100.
C3에 넣을 수식입니다.
=IF(B3=TRUE, IF(C3="", TODAY(), C3), "")
C3 셀 서식을 날짜로 지정하십시오. 안 하면 46000 같은 일련번호로 보입니다.
함정이 둘입니다. 첫째, 반복 계산은 시트가 아니라 엑셀 계산 옵션 전체에 걸립니다. 켜 둔 동안에는 다른 파일에서 실수로 만든 순환 참조도 경고 없이 조용히 잘못된 값을 냅니다. 정산처럼 합계가 맞아야 하는 파일에서는 이 부작용을 감수할지 먼저 판단하십시오. 둘째, 그래도 완전한 고정은 아닙니다. 체크를 실수로 풀었다 다시 걸면 기존 날짜는 사라지고 오늘 날짜가 새로 들어갑니다.
시트 탭 우클릭 - 코드 보기에 붙여넣고, 파일을 .xlsm(매크로 사용 통합 문서)으로 저장하십시오. .xlsx로 저장하면 코드가 경고 후 사라집니다.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, c As Range
Set rng = Intersect(Target, Me.Range("B3:B1000"))
If rng Is Nothing Then Exit Sub
On Error GoTo 마무리
Application.EnableEvents = False
For Each c In rng
If c.Value = True Then
c.Offset(0, 1).NumberFormat = "yyyy-mm-dd"
c.Offset(0, 1).Value = Date
Else
c.Offset(0, 1).ClearContents
End If
Next c
마무리:
Application.EnableEvents = True
End Sub
On Error GoTo 마무리를 빼지 마십시오. 중간에 오류가 나면 EnableEvents가 False로 남고, 그 뒤부터는 이벤트 코드가 아무 반응도 하지 않습니다. 코드는 멀쩡한데 안 먹는다며 몇 시간을 보내게 되는 자리가 여기입니다. 이미 그 상태라면 VBA 창에서 Application.EnableEvents = True를 한 번 실행하거나 엑셀을 껐다 켜면 풀립니다.
여기서 갈리는 지점이 하나 더 있습니다. 확인란이 두 종류입니다. 마이크로소프트 365의 삽입 - 확인란은 셀 안에 들어가고 셀 값이 TRUE/FALSE라 위 코드가 동작합니다. 반면 개발 도구의 양식 컨트롤 체크박스는 셀 위에 떠 있는 도형이라 클릭해도 Worksheet_Change가 발생하지 않습니다. 이 경우 컨트롤 서식 - 셀 연결을 B3으로 잡고 반복 계산 방식을 쓰시거나, 체크박스에 매크로를 따로 지정해야 합니다. 양식 컨트롤은 행을 정렬·필터하면 도형만 제자리에 남는 문제도 있어, 365를 쓰신다면 셀 안 확인란을 권합니다.
또 하나, VBA로 넣은 값은 실행 취소가 되지 않습니다. Ctrl+Z를 눌러도 되돌아가지 않으니, 여러 행을 한꺼번에 체크 해제하기 전에 파일을 복사해 두시는 편이 안전합니다.
C3:E3 선택 - 홈 - 조건부 서식 - 새 규칙 - 수식을 사용하여 서식을 지정할 셀 결정.
=$B3=TRUE
B 앞에만 $를 붙이는 것이 핵심입니다. 열은 고정하고 행은 풀어야 아래로 복사했을 때 각 행이 자기 행의 B열을 봅니다.
함정 셋입니다. 규칙을 만들 때 선택 영역의 활성 셀(혼자 흰 셀)이 C3이 아니면 참조가 그만큼 밀려 엉뚱한 행이 칠해집니다. 만든 뒤 조건부 서식 - 규칙 관리에서 적용 대상이 =$C$3:$E$3인지 확인하십시오. 반대 조건을 =$B3=FALSE로 만들면 아직 손대지 않은 빈 셀까지 FALSE로 잡혀 표 전체가 칠해집니다. 빈 칸을 빼려면 이렇게 쓰십시오.
=AND($B3<>"", $B3=FALSE)
마지막으로, 행을 복사해 붙여넣기를 반복하면 하나였던 규칙이 수십 개로 쪼개져 파일이 무거워지고 일부 행만 색이 안 들어옵니다. 규칙 관리 창에 같은 규칙이 여러 줄 보이면 전부 삭제하고 전체 범위에 한 번만 다시 만드십시오.
정리하면, 날짜를 기억시키려면 수식이 자기 값을 지키게 하거나(반복 계산) 값을 아예 써 넣어야 합니다(VBA). 쓰시는 엑셀 버전과 확인란 종류를 먼저 확인하시면 어느 쪽으로 갈지가 바로 정해집니다.
지금 그 파일, 어디가 문제인지 먼저 보시겠습니까
CSV 를 넣으면 계산이 틀어지는 자리를 찾아 드립니다. 무료이고 파일은 서버로 올라가지 않습니다 — 브라우저 안에서만 처리되고 저희도 내용을 볼 수 없습니다.
매달 같은 순서로 고치고 계신다면 그 순서를 프로그램으로 옮겨둔 것이 있습니다 — 쇼핑몰 월 정산 자동화. 되는지부터 보시려면 무료 진단.