Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 데이터 유효성 검사(Data Validation) 관련 오류가 발생할 때 원인 진단부터 즉시 적용 가능한 해결책, 예방 방법까지 체계적으로 제시하여 사용자가 현장에서 곧바로 문제를 해결하도록 돕는 것이다.
데이터 유효성 검사 오류는 대개 참조 범위, 표시 형식, 보호 설정, 복사·붙여넣기 방식, 버전 차이 등 기초 설정 문제에서 발생한다. 아래 표의 항목을 위에서 아래 순서로 점검하면 대부분의 문제를 단시간에 해결할 수 있다.
| 증상 | 우선 점검 항목 | 즉시 조치 |
|---|---|---|
| 드롭다운 목록이 보이지 않음 | 유효성 유형이 목록인지, 셀 안의 드롭다운 옵션 체크, 참조 범위 숨김·필터 여부 | 데이터 > 데이터 유효성 검사 > 설정에서 목록 지정 및 셀 안의 드롭다운 체크 |
| 올바른 값을 입력했는데도 오류 메시지 | 앞뒤 공백, 데이터 형식(숫자 vs 텍스트), 유사 문자(0 vs O, 1 vs l), 지역 소수점·날짜 형식 | TRIM, VALUE, DATEVALUE 등으로 정규화, 표시 형식 일치 |
| 유효성 규칙이 사라짐 | 복사·붙여넣기 시 서식 덮어쓰기, 외부 시트에서 값 붙여넣기 | 붙여넣기 옵션에서 값만 붙여넣기, 유효성 규칙 다시 적용 |
| 의존 목록(종속 드롭다운)이 동작하지 않음 | INDIRECT 참조 오류, 이름 정의 범위·시트 범위, 특수문자 포함 여부 | 이름 정의로 범위 고정, 공백·특수문자 제거, INDIRECT 구문 재확인 |
| 원본 범위가 표/스필 범위인데 업데이트 반영 안 됨 | 구버전 호환, 구조적 참조 구문, 스필 연산자(#) 사용 여부 | =A2# 형태로 스필 전체 참조, 또는 이름 정의에 동적 참조 사용 |
| 유효성 경고가 떠야 하는데 허용됨 | 오류 메시지 탭에서 스타일이 중지인지, 사용자 지정 오류 알림 활성화 | 오류 메시지 스타일을 중지로 변경 |
| 보호된 시트에서 규칙 편집 불가 | 검토 > 시트 보호, 허용 옵션에서 개체 편집·피벗테이블 사용 등 제한 | 시트 보호 해제 후 편집, 다시 보호 설정 |
데이터 유효성 검사는 크게 유형과 원본으로 구성된다. 유형은 모든 값, 정수, 십진수, 목록, 날짜, 시간, 텍스트 길이, 사용자 지정이 있으며, 원본은 유형에 따라 상수, 범위, 수식으로 입력한다. 특히 목록 유형은 쉼표로 구분된 상수 목록이나 셀 범위 또는 스필 범위를 참조할 수 있다. 입력 메시지 및 오류 메시지 탭은 사용자 안내와 차단 강도를 제어한다.
증상 1 드롭다운 표시가 사라지거나 선택지가 없음이다.
증상 2 원본 범위를 표(Table) 또는 동적 목록으로 쓰는데 갱신이 반영되지 않음이다.
=A2#처럼 # 연산자로 전체 스필 범위를 참조한다.=테이블1[항목] 구조적 참조가 올바른지 확인한다.예: 이름 정의 "목록범위" =OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,1) 유효성 원본 =목록범위 표시 형식과 실제 데이터 형식의 불일치가 흔한 원인이다. 텍스트로 저장된 숫자는 숫자 비교에서 실패한다.
텍스트 숫자->숫자 변환: =VALUE(A2) 텍스트 날짜->날짜 변환: =DATEVALUE(A2) 텍스트 시간->시간 변환: =TIMEVALUE(A2) 날짜 범위를 제한하려면 허용: 날짜와 데이터: 사이로 설정하고 시작·종료일을 절대 참조한다. 지역 설정에 따라 소수점 기호와 날짜 구분자 차이가 있으므로 파일 공유 시 주의한다.
사용자 지정은 수식이 TRUE일 때만 입력 허용이다. 참조가 혼합되면 오른쪽·아래로 복사 시 엇나간다.
예: A열에 대문자 영문 3글자만 허용 허용: 사용자 지정 수식: =AND(LEN(A1)=3, EXACT(A1, UPPER(A1)), NOT(SUM(--ISNUMBER(MID(A1,ROW($1:$3),1)+0))) ) 수식의 기준셀은 현재 선택 영역의 좌상단 기준으로 해석한다. 따라서 절대/상대 참조를 의도대로 고정한다.
앞뒤 공백, 줄바꿈(CHAR(10)), 비표준 공백(CHAR(160))은 목록 일치 비교를 실패시킨다. 정규화 파이프라인을 권장한다.
=TRIM(SUBSTITUTE(SUBSTITUTE(A2,CHAR(160)," "),CHAR(10)," ")) 0과 O, 1과 l 같은 유사문자는 폰트에 따라 구분이 어렵다. 기준 목록을 대문자·숫자로 강제하고 EXACT로 비교한다.
병합 셀은 유효성 범위 복사·확장 시 예측 불가능한 결과를 낳는다. 병합 해제 후 규칙을 적용하고 필요한 경우 서식으로만 병합 효과를 표현한다. 필터로 숨겨진 행에 적용된 유효성은 사용자가 보지 못해 선택지를 못 찾는 경우가 있으므로 원본 범위는 별도 시트로 분리한다.
시트 보호가 활성화되면 유효성 수정이 차단된다. 다음 순서로 점검한다.
외부 시트에서 전체 셀을 복사해 오면 유효성 규칙이 덮어써진다. 다음 원칙을 지킨다.
이름 정의의 스코프(통합 문서/시트)가 다르면 다른 시트에서 인식되지 않는다. 동일 이름을 중복 정의하지 말고 통합 문서 스코프로 관리한다. 외부 통합 문서 참조는 링크 끊김 시 목록이 사라진다.
상위 선택에 따라 하위 목록이 달라지는 구조는 INDIRECT를 주로 사용한다. 공백·특수문자가 있으면 이름으로 사용할 수 없으므로 치환 규칙을 통일한다.
전처리 이름: =SUBSTITUTE(SUBSTITUTE(대분류," ","_"),"-","_") 하위범위 이름: 각 대분류명과 동일한 이름으로 목록 범위를 정의 하위 유효성 원본: =INDIRECT(SUBSTITUTE(SUBSTITUTE($A2," ","_"),"-","_")) 동적 배열을 사용할 수 있으면 FILTER로 안정화한다.
=UNIQUE(FILTER(목록!$B:$B, 목록!$A:$A=$A2)) // A열 기준 B열 항목 필터 원본 참조: =G2# // 스필 전체 참조 =WEEKDAY(A1,2)<=5=A1>=TODAY()=MOD(A1, TIME(0,15,0))=0다국어/다지역 환경에서는 시스템 로캘에 따라 날짜 구분자가 달라진다. 파일 공유 전 표시 형식과 데이터 형식을 명시적으로 설정한다.
고정 길이 또는 정규 패턴 검사는 사용자 지정으로 처리한다.
한글+숫자만 허용: =SUM(--ISNUMBER(FIND(MID(A1,ROW($1:INDEX($1:$1048576,LEN(A1))),1),"0123456789가-힣"))) = LEN(A1) 영문 대소문자·숫자·언더스코어만: =AND(LEN(A1)>0, A1=SUBSTITUTE(A1," ",""), A1=TEXTJOIN("",,IFERROR(MID(A1,ROW($1:INDEX($1:$1048576,LEN(A1))),1),""))) 복잡한 패턴은 입력 단계에서 제한하는 대신 사후 검증 열을 따로 두고 조건부 서식으로 표시하는 편이 유지보수에 유리하다.
유효성 위반 셀을 한 번에 표시하려면 다음 절차를 사용한다.
대량 점검은 VBA 스니펫으로 자동화할 수 있다.
Sub 유효성감사_요약() Dim ws As Worksheet, c As Range, r As Range, msg As String For Each ws In ThisWorkbook.Worksheets On Error Resume Next Set r = ws.UsedRange.SpecialCells(xlCellTypeAllValidation) On Error GoTo 0 If Not r Is Nothing Then For Each c In r If Not c.Validation Is Nothing Then If Not c.Validation.Value Then msg = msg & ws.Name & "!" & c.Address(0, 0) & " - " & c.Validation.ErrorMessage & vbCrLf End If End If Next c End If Set r = Nothing Next ws If msg = "" Then MsgBox "모든 시트 유효성 통과", vbInformation Else MsgBox "유효성 위반 목록:" & vbCrLf & msg, vbExclamation End If End Sub 문제: =A2:A100으로 고정 참조하여 신규 항목이 누락된다. 해결: =A2#로 스필 전체를 참조한다.
문제: 구조적 참조 =테이블1[[#전체],[항목]]로 머리글까지 포함하여 "항목"이 드롭다운에 나타난다. 해결: =테이블1[항목]로 수정한다.
문제: 선택 영역이 B2:D10인데 수식에서 A1을 기준으로 작성하여 행·열마다 다른 판정이 난다. 해결: 좌상단 기준으로 상대/절대 참조를 재설정한다.
문제: 00123과 123이 다른 값으로 인식된다. 해결: 비교 전 --A1 또는 VALUE(A1)로 정규화하고 표시 형식으로 자리수 유지한다.
| 목표 | 사용자 지정 수식 |
|---|---|
| 중복 입력 방지 | =COUNTIF($A:$A,A1)=1 |
| 공백 입력 금지 | =LEN(TRIM(A1))>0 |
| 숫자만 허용 | =ISNUMBER(--A1) |
| 목록과 대소문자 동일성 검사 | =SUMPRODUCT(--EXACT(TRIM(A1),TRIM(목록범위)))=1 |
| YYYY-MM 형식만 허용 | =AND(LEN(TEXT(A1,"yyyymm"))=6,DAY(EOMONTH(A1,0))>=28) |
대규모 시트에서 규칙이 자주 깨지는 경우 다음 매크로로 규칙을 백업·복원한다.
Type DVRule Address As String Type As Long AlertStyle As Long Operator As Long Formula1 As String Formula2 As String IgnoreBlank As Boolean InCellDropdown As Boolean ErrorTitle As String ErrorMessage As String End Type
Sub DV_Backup()
Dim ws As Worksheet, c As Range, r As Range, i As Long, f As Integer
f = FreeFile
Open ThisWorkbook.Path & "\DV_Backup.tsv" For Output As #f
For Each ws In Worksheets
On Error Resume Next
Set r = ws.UsedRange.SpecialCells(xlCellTypeAllValidation)
On Error GoTo 0
If Not r Is Nothing Then
For Each c In r
With c.Validation
Print #f, ws.Name & vbTab & c.Address(0, 0) & vbTab & .Type & vbTab & .AlertStyle & vbTab & .Operator & vbTab & .Formula1 & vbTab & .Formula2 & vbTab & .IgnoreBlank & vbTab & .InCellDropdown & vbTab & .ErrorTitle & vbTab & .ErrorMessage
End With
Next c
End If
Set r = Nothing
Next ws
Close #f
MsgBox "DV_Backup.tsv 저장 완료", vbInformation
End Sub
Sub DV_Restore()
Dim f As Integer, s As String, t()
Dim ws As Worksheet, c As Range
f = FreeFile
Open ThisWorkbook.Path & "\DV_Backup.tsv" For Input As #f
Do While Not EOF(f)
Line Input #f, s
t = Split(s, vbTab)
Set ws = Worksheets(CStr(t(0)))
Set c = ws.Range(CStr(t(1)))
With c.Validation
.Delete
.Add Type:=CLng(t(2)), AlertStyle:=CLng(t(3)), Operator:=CLng(t(4)), Formula1:=CStr(t(5)), Formula2:=CStr(t(6))
.IgnoreBlank = CBool(t(7))
.InCellDropdown = CBool(t(8))
.ErrorTitle = CStr(t(9))
.ErrorMessage = CStr(t(10))
End With
Loop
Close #f
MsgBox "유효성 복원 완료", vbInformation
End Sub
병합 셀 또는 데이터 유효성과 조건부 서식의 충돌 가능성이 높다. 병합을 해제하고 규칙을 다시 적용하고, 조건부 서식의 중복 규칙을 정리한다.
링크가 끊기면 목록이 비워진다. 원본을 같은 통합 문서의 숨김 시트로 이전하거나 이름 정의에 값 복제 스크립트를 사용한다.
CSV는 유효성 메타데이터를 저장하지 않는다. xlsx 포맷으로 저장하고 CSV는 내보내기 용도로만 사용한다.
원본 셀을 선택하고 복사 후 대상 범위에 선택하여 붙여넣기 > 유효성을 사용한다. 또는 위 VBA 백업·복원 스크립트를 활용한다.
필터 대신 피벗 테이블 또는 고급 필터로 하위 목록을 만들어 고정 범위를 참조한다. 변경 시 재생성이 필요하다.