반환값 비교: 숫자가 필요한가, 글자가 필요한가
원문을 AB-AB-X로 고정해 보세요. 첫 하이픈의 위치를 묻는 InStr(1, "AB-AB-X", "-")의 답은 숫자 3입니다. 하이픈 문자나 앞의 AB를 반환하는 함수가 아닙니다.
같은 원문에서 Replace("AB-AB-X", "AB", "Q")의 답은 Q-Q-X입니다. AB를 Q로 바꾼 문자열이며 바꾼 횟수인 2가 아닙니다. 위치 찾기와 내용 치환의 출력 종류가 다릅니다.
문제에서 '몇 번째', '위치'라고 물으면 InStr을, '바꾼 결과', '구분자 치환'이라면 Replace를 검토하세요. 일부 글자를 잘라 가져오는 Left·Right·Mid와도 구분합니다.
InStr 인수: 시작 위치는 앞, 결과는 원문 기준
기본 형태는 InStr(시작위치, 원문, 찾을문자열, 비교방식)입니다. 시작 위치와 비교 방식은 선택 인수지만 compare를 지정할 때는 start도 필요합니다. InStr("AB-AB-X", "-")처럼 두 문자열만 주면 첫 글자부터 찾습니다.
InStr(4, "AB-AB-X", "-")은 6입니다. 네 번째 글자인 두 번째 A부터 검사해 여섯 번째 하이픈을 찾습니다. 검색 구간 안의 세 번째라는 이유로 3을 반환하지 않습니다.
start는 몇 번째 일치를 찾는지가 아니라 몇 번째 글자부터 검사하는지입니다. 다음 일치가 필요하면 앞서 찾은 위치 다음부터 다시 검사하되, 구분자가 더 있는지 확인하세요.
InStr의 0: 미검출과 Null·빈 검색어를 섞지 않습니다
InStr(1, "AB-AB-X", "Z")는 0입니다. 정상 문자열에서 일치가 없다는 뜻이지 마지막 글자나 첫 글자의 위치가 아닙니다. InStr(1, "", "A")처럼 원문이 빈 문자열인 경우도 0입니다.
반면 원문이나 찾을 문자열이 Null이면 결과는 Null입니다. 찾을 문자열만 빈 문자열인 InStr(2, "AB-AB-X", "")는 시작 위치 2를 반환합니다. 빈 문자열과 Null은 같은 값이 아닙니다.
start나 compare에 Null을 넣으면 오류 조건입니다. 문자열 인수의 Null 반환과 선택 인수의 오류를 따로 기억하세요. 못 찾았다는 이유로 0을 곧바로 추출 길이나 다음 시작점에 넣지 않습니다.
Replace 인수: 원문·찾을 값·새 값 뒤에 옵션을 둡니다
Replace의 순서는 Replace(원문, 찾을문자열, 새문자열, 시작위치, 치환횟수, 비교방식)입니다. InStr과 달리 start가 첫 칸이 아닙니다. 선택 인수 전에 필수 문자열 세 칸부터 구분하세요.
Replace("AB-AB-X", "AB", "Q")는 Q-Q-X입니다. start 생략은 1, count 생략은 -1로 가능한 일치를 모두 바꿉니다. Q-AB-X라고 생각하면 한 번만 치환한다고 잘못 해석한 것입니다.
Replace("AB-AB-X", "-", "")는 하이픈을 제거한 ABABX입니다. 새 문자열이 빈 문자열인 경우입니다. 이 글은 Access/VBA 함수이며 위치와 문자 수를 받는 Excel 워크시트 REPLACE와 인수 구조가 다릅니다.
핵심 start 함정: Replace는 앞부분을 돌려주지 않습니다
Replace("AB-AB-X", "AB", "Q", 4)는 Q-X입니다. 네 번째 글자부터의 AB-X를 치환하고 그 위치부터 끝까지 반환합니다. 앞의 AB-가 남은 AB-Q-X가 아닙니다.
InStr(4, "AB-AB-X", "-")은 원문 위치 6을 반환하지만 Replace의 start는 반환 문자열의 시작점에도 영향을 줍니다. 같은 이름의 인수라도 출력에 미치는 효과가 다릅니다.
start가 원문 길이보다 크면 Replace 결과는 빈 문자열입니다. Replace("ABC", "A", "Q", 4)가 그 예입니다. 앞부분도 필요하면 따로 보존하는 처리가 필요한지 확인하세요. start만 추가하면 원문 전체가 유지된다고 가정하지 않습니다.
count는 치환 횟수이지 글자 위치나 개수가 아닙니다
Replace("AB-AB-X", "AB", "Q", 1, 1)은 Q-AB-X입니다. 첫 글자부터 찾되 치환을 한 번만 합니다. 마지막 1은 첫 글자 하나를 바꾸라는 뜻이 아닙니다. 일치한 AB 두 글자가 Q로 바뀝니다.
Replace("AB-AB-X", "AB", "Q", 1, 0)은 AB-AB-X입니다. start 1에서 치환 횟수 0인 예제입니다. 이 원문 유지 결과를 start가 다른 모든 호출에 그대로 확대하지 마세요.
찾을 문자열 AB와 A는 서로 다른 조건입니다. 숫자 인수가 나오면 위치인지, 추출할 문자 수인지, 치환 횟수인지 이름을 먼저 붙인 뒤 결과를 계산하세요.
compare: 영문 대소문자와 실행 환경을 확인합니다
이 글의 영문 예제에서 compare 0은 이진 비교, 1은 텍스트 비교입니다. InStr(1, "Ax-aX", "ax", 0)은 0이고 InStr(1, "Ax-aX", "ax", 1)은 1입니다. 텍스트 비교에서는 영문 대소문자를 구별하지 않습니다.
Replace("Ax-aX", "ax", "Q", 1, -1, 1)은 Q-Q입니다. start 1, 모두 바꾸는 count -1, 텍스트 비교 1을 각각 읽으세요. compare를 0으로 명시한 같은 식은 Ax-aX를 반환합니다.
비교 옵션 생략을 언제나 대소문자 무시 또는 구별이라고 단정하지 않습니다. VBA 모듈의 Option Compare 설정을 확인하고 Access의 데이터베이스 비교도 구별하세요. 여기의 연습은 compare를 명시한 ASCII 영문 예제이며 모든 언어·정렬 규칙을 대신하지 않습니다.
Null 입력: InStr의 Null과 Replace 오류는 다릅니다
Microsoft 문서에서 InStr의 원문·검색 문자열이 Null이면 결과도 Null이지만, Replace의 원문 expression이 Null이면 오류입니다. 두 함수가 모두 문자열을 다룬다고 Null 처리까지 같지는 않습니다.
Access에서 Null을 빈 문자열로 처리하라는 조건이라면 Replace(Nz([제품코드], ""), "-", "/")처럼 먼저 대체값을 명시할 수 있습니다. 미입력과 실제 빈 값을 구분해야 한다면 무조건 빈 문자열로 합치지 마세요.
Nz는 Null 대체이지 모든 인수 오류를 막는 함수가 아닙니다. VBA IIf도 선택되지 않는 쪽 식을 평가할 수 있어 위험한 호출을 감쌌다고 실행이 생략된다고 믿지 않습니다. 전체 Null 함수 비교는 기존 Nz·IsNull·IIf 글에서 이어 보세요.
쿼리와 컨트롤: 식을 넣는 자리를 구분합니다
쿼리 디자인의 계산 열에는 구분위치: InStr(1, [제품코드], "-")처럼 별칭과 식을 작성할 수 있습니다. 계산 컨트롤의 컨트롤 원본에서는 =InStr(1, [제품코드], "-")처럼 식을 지정합니다. 제품코드는 설명용 필드 이름입니다.
[제품코드]는 필드 참조이고 "제품코드"는 그 글자 자체인 문자열 상수입니다. 필드에 든 값을 검색해야 하는데 따옴표를 씌우면 모든 행에서 같은 글자만 검색하게 됩니다.
VBA의 결과 변수 대입 문장과 Access 식 입력란도 구별하세요. 실제 환경의 구분 기호와 필드 이름을 확인합니다. 폼의 전체 원본 속성 비교는 관련 가이드가 별도로 설명합니다.
치환 결과 계산과 원본 저장은 별개입니다
Replace는 치환한 문자열을 돌려주는 함수입니다. 조회 쿼리에 계산 열을 만들거나 계산 컨트롤에 결과를 표시했다고 원본 필드가 자동 변경되는 것은 아닙니다. 원본 값, 표시 결과, 저장 동작을 나누세요.
변수 s가 AB-AB-X라면 Replace(s, "AB", "Q")의 계산 결과는 Q-Q-X입니다. 하지만 그 결과를 s에 다시 대입하는 문장이 없으면 s를 자동 변경하는 호출로 보지 않습니다.
원본 변경이 필요한 과제에서는 저장 대상과 업데이트 방식을 따로 확인합니다. 예제를 운영 데이터 전체에 바로 적용하지 말고 복사본과 일부 레코드에서 결과부터 확인하세요.
자체 연습 1~4: 위치·시작점·치환 횟수
1. InStr(1, "AB-AB-X", "-")의 결과는? 정답: 숫자 3. 첫 하이픈의 원문 위치이며 하이픈 문자나 AB가 아닙니다.
2. InStr(4, "AB-AB-X", "-")의 결과는? 정답: 숫자 6. 검색 구간 안의 3이 아니라 원문 기준 위치입니다.
3. Replace("AB-AB-X", "AB", "Q", 4)의 결과는? 정답: Q-X. start 앞의 AB-가 결과에 포함되지 않습니다.
4. Replace("AB-AB-X", "AB", "Q", 1, 1)의 결과는? 정답: Q-AB-X. start는 1, count는 1이므로 첫 일치 한 번만 바꿉니다.
자체 연습 5~7: 미검출·대소문자·Null
5. InStr(1, "AB-AB-X", "Z")와 InStr(1, Null, "Z")는 같은가요? 정답: 각각 0과 Null로 다릅니다. 정상 문자열의 미검출과 값이 없는 입력을 구분합니다.
6. Replace("Ax-aX", "ax", "Q", 1, -1, 1)의 결과는? 정답: Q-Q. 영문 대소문자를 구별하지 않는 텍스트 비교로 모두 바꿉니다.
7. Replace(Null, "-", "/")가 언제나 빈 문자열을 반환하나요? 정답: 아닙니다. 원문 Null은 오류 조건입니다. Null을 빈 값으로 처리하라는 요구가 있을 때만 Nz 등으로 대체값을 명시합니다.
틀린 결과만 복습하고 데이터베이스 단원으로 이동하세요
인위·리바를 말한 다음 '반환값, start, count, compare, Null' 다섯 칸을 적으세요. 새 식을 받으면 숫자인지 문자열인지 예상하고 선택 인수와 입력 값을 확인합니다.
연습 3에서 AB-Q-X를 골랐다면 Replace의 start를 복습하면 됩니다. 연습 6에서 원문을 그대로 썼다면 compare를, 연습 7에서 빈 문자열을 골랐다면 Null 조건을 다시 보세요.
이후 컴활 1급 데이터베이스 심화 단원에서 개념과 문제를 이어 확인하세요. 전체 프로시저 흐름, 문자열 추출 종합, Null 함수 비교는 아래 관련 글에서 필요한 부분만 선택합니다.
근거와 예제의 범위
2026년 10월 9일 Microsoft Learn의 InStr·Replace·Option Compare·IIf와 Microsoft Support의 Access InStr·Replace·문자열 함수·Nz·식 구문 자료를 대조했습니다. VBA와 Access 식의 함수 설명을 기준으로 인수 순서와 반환값·예외를 정리했습니다.
AB-AB-X와 Ax-aX는 자체 제작 문자열입니다. 실제 기출을 옮긴 것이 아니며 출제 빈도나 공식 시험 프로그램 실행 결과를 주장하지 않습니다. 정렬 설정·필드 자료형·Null을 빈 값으로 처리할지 여부는 실제 조건에 따라 확인하세요.