# 한셀 종합 가이드: 함수와 실전 기능 모음
한셀·엑셀 작업을 주로 하는 군대 업무를 어느정도 자동화하기 위해 공부하고 사용했던 함수와 기능들을 정리해보았다.
---
## 목차
Part 1. 함수 편
1. 조회·참조 함수 (VLOOKUP, INDEX, MATCH, INDIRECT, CELL, OFFSET)
2. 논리 함수 (IF, IFERROR, OR, NOT, ISNUMBER)
3. 수학·통계·위치 함수 (SMALL, AGGREGATE, INT, MOD, MAX, COUNTA, ROW)
4. 텍스트 함수 (MID, FIND, LEN, EXACT, TRIM)
5. 실전 조합 패턴 10가지
Part 2. 실전 기능·기법 편
6. 외부 파일 참조 관련
7. 이름 정의 (Named Range)
8. 데이터 유효성 검사
9. 수식 입력·편집 기법
10. 계산 옵션과 재계산
11. 데이터 세척·디버깅
12. 시트·열 관리
13. 기타 실전 꿀팁
부록
- 배열수식 vs AGGREGATE 비교
- 유용한 단축키 요약
---
# Part 1. 함수 편
## 1. 조회·참조 함수
### 1-1. VLOOKUP — 수직 조회
문법: `VLOOKUP(찾을값, 표범위, 반환열번호, [일치방식])`
표범위의 첫 번째 열에서 찾을값을 검색한 뒤, 같은 행의 지정한 열 값을 반환합니다.
- 일치방식: 0 또는 FALSE는 정확히 일치, 1 또는 TRUE(생략 시)는 근사값
- 실무에선 거의 항상 0(정확히 일치) 을 씀
- 와일드카드(`*`, `?`) 사용 가능 — 단, 일치방식이 0일 때만
기본 예시
A열에 상품명, B열에 가격이 있을 때 "사과"의 가격 찾기:
=VLOOKUP("사과", $A$2:$B$100, 2, 0)
와일드카드 예시
"급여"가 포함된 첫 번째 항목 찾기:
=VLOOKUP("*급여*", $A$1:$B$100, 2, 0)
셀 참조와 결합 (C1에 검색어가 있을 때):
=VLOOKUP("*"&C1&"*", $A$1:$B$100, 2, 0)
---
### 1-2. INDEX — 행·열 좌표로 값 가져오기
문법: `INDEX(범위, 행번호, [열번호])`
범위 내에서 특정 위치의 값을 반환. 1차원 범위면 열번호 생략, 2차원 범위면 둘 다 지정.
- 행번호에 0을 넣으면 해당 열 전체를 배열로 반환 (주의 필요)
- VLOOKUP과 달리 왼쪽으로도 조회 가능하고, 순서 상관없이 자유롭게 접근
예시
=INDEX($A$1:$C$10, 5, 2) → 5행 2열의 값
=INDEX($A$1:$A$10, 3) → A3의 값
=INDEX($B$1:$H$1, J1) → 1행에서 J1번째 열의 값 (날짜 조회)
---
### 1-3. MATCH — 값의 위치 찾기
문법: `MATCH(찾을값, 검색범위, [일치방식])`
검색범위에서 찾을값이 몇 번째에 있는지 반환. 값 자체가 아니라 위치(순서) 를 반환합니다.
- 일치방식 0 = 정확히 일치, 1(생략) = 근사값(오름차순), -1 = 근사값(내림차순)
- 못 찾으면 `#N/A` 반환
예시
=MATCH("병가", $T$2:$T$13, 0) → T열에서 "병가"의 위치 (예: 3)
매핑 테이블에 특정 값이 있는지 확인하는 용도로 자주 씀:
=ISNUMBER(MATCH(N1, mapping, 0)) → 있으면 TRUE, 없으면 FALSE
---
### 1-4. INDIRECT — 문자열을 셀 참조로 변환
문법: `INDIRECT(참조_텍스트)`
텍스트 형태로 표현된 셀 주소를 실제 참조로 변환. 참조를 동적으로 만들 때 사용.
- 다른 파일 참조 시 해당 파일이 열려 있어야 값이 나옴
- 휘발성 함수: 시트가 재계산될 때마다 다시 계산됨 → 남용하면 성능 저하
예시
=INDIRECT("A"&1) → A1 참조
=INDIRECT("Sheet2!B"&C1) → C1이 5면 Sheet2!B5의 값
=INDIRECT("["&$Z$1&"]"&A1&"_지출명세서!$C$3") → 파일명·시트명 조립
---
### 1-5. CELL — 셀 정보 반환
문법: `CELL(정보유형, [참조])`
셀의 서식·위치·내용 정보를 반환.
- `"filename"`: 전체 경로 (경로\[파일명]시트명 형태)
- `"address"`: 셀 주소
- `"row"`, `"col"`: 행·열 번호
시트 이름 추출 응용
=MID(CELL("filename",A1), FIND("]",CELL("filename",A1))+1, 100)
"]" 위치를 찾아 그 뒤부터 자르면 시트 이름만 남음. 파일을 한 번 저장한 뒤에야 작동.
---
### 1-6. OFFSET — 기준 셀에서 이동한 위치
문법: `OFFSET(기준, 행이동, 열이동, [높이], [너비])`
기준 셀에서 지정한 만큼 이동한 위치의 셀(또는 범위) 반환. INDIRECT처럼 휘발성.
예시
=OFFSET(A1, 2, 3) → A1에서 2행 아래, 3열 오른쪽 = D3
=OFFSET(A1, 0, 0, 10, 1) → A1부터 10행×1열 범위 = A1:A10
---
## 2. 논리 함수
### 2-1. IF — 조건 분기
문법: `IF(조건, 참일때, 거짓일때)`
조건이 TRUE면 첫 번째 값을, FALSE면 두 번째 값을 반환.
중첩 IF 예시
=IF(A1>90, "A",
IF(A1>80, "B",
IF(A1>70, "C", "F")))
중요: 중첩 IF는 진짜 단락 평가
IF는 조건이 TRUE면 뒤의 조건은 아예 실행하지 않음. 반면 OR/AND는 모든 인자를 실행하므로, 잘못 쓰면 INDEX 등에서 예상치 못한 에러가 남.
---
### 2-2. IFERROR — 에러 처리
문법: `IFERROR(수식, 에러시_대체값)`
수식이 에러(#N/A, #REF!, #DIV/0! 등)를 반환하면 대체값으로 대체.
예시
=IFERROR(VLOOKUP(A1, table, 2, 0), "-") → 못 찾으면 "-"
=IFERROR(A1/B1, 0) → 0으로 나누면 0
VLOOKUP 실무에서 사실상 필수 조합.
---
### 2-3. OR / NOT
OR(조건1, 조건2, ...) → 하나라도 TRUE면 TRUE
NOT(조건) → 반대로 뒤집기
주의: OR은 단락 평가 안 함
=OR(A1=0, 10/A1>5) → A1=0일 때 뒤의 10/A1도 실행 → #DIV/0!
안전하게 쓰려면 IF 중첩:
=IF(A1=0, TRUE, 10/A1>5)
---
### 2-4. ISNUMBER — 숫자인지 확인
문법: `ISNUMBER(값)`
값이 숫자면 TRUE, 아니면 FALSE. 텍스트, 에러값, 빈 셀은 FALSE.
MATCH와 결합해 `ISNUMBER(MATCH(값, 리스트, 0))` 패턴으로 "리스트에 이 값이 있는지" 판정. MATCH가 못 찾으면 #N/A를 반환하는데, ISNUMBER로 감싸면 TRUE/FALSE로 깔끔하게 정리됨.
---
## 3. 수학·통계·위치 함수
### 3-1. SMALL — k번째로 작은 값
문법: `SMALL(범위_또는_배열, k)`
범위에서 k번째로 작은 값을 반환. LARGE는 반대(k번째로 큰 값).
- 텍스트, 논리값, 빈 셀은 무시
- 배열수식과 결합해 "빈칸 압축" 필터링에 핵심
배열수식 결합 (Ctrl+Shift+Enter)
{=SMALL(IF($A$1:$A$10<>"", ROW($A$1:$A$10)), ROW())}
값이 있는 셀들의 행번호만 골라내 순서대로 1번째, 2번째, ... 반환.
---
### 3-2. AGGREGATE — 배열수식 없이 집계
문법: `AGGREGATE(함수번호, 옵션, 배열, [k])`
SMALL·LARGE·SUM 등을 Ctrl+Shift+Enter 없이 배열 연산으로 수행. 에러값 무시 옵션 내장.
- 함수번호 15 = SMALL, 14 = LARGE, 9 = SUM 등
- 옵션 6 = 에러값 무시
SMALL + IF 배열식의 대체
=AGGREGATE(15, 6, ROW($A$1:$A$10)/($A$1:$A$10<>""), ROW())
`1/($A$1:$A$10<>"")`는 빈 셀에서 `1/FALSE=#DIV/0!` 에러를 내는데, 옵션 6이 이걸 무시. 일반 Enter로 작동.
---
### 3-3. INT / MOD — 정수부·나머지
INT(수) → 소수점 이하 버림
MOD(수, 나눌수) → 나머지
2차원 좌표 계산 응용
1차원 순번(1,2,3,...)을 인원 수 9명 기준으로 날짜·이름 인덱스로 변환:
=INT((ROW()-1)/9)+1 → 날짜 인덱스: 1~9행 → 1, 10~18행 → 2, ...
=MOD(ROW()-1, 9)+1 → 이름 인덱스: 1행 → 1, 2행 → 2, ..., 10행 → 1, ...
---
### 3-4. MAX — 최댓값
문법: `MAX(값1, 값2, ...)`
경계 방어 응용
=INDEX($A$1:$A$63, MAX(ROW()-9, 1)) → 음수/0 방지
---
### 3-5. COUNTA — 빈 셀이 아닌 셀 개수
문법: `COUNTA(범위)`
범위 내 빈 셀이 아닌 셀의 개수. 숫자·텍스트·논리값·에러값 모두 포함.
=COUNTA($A$2:$A$100) → A2~A100에 값이 몇 개 있는지
인원 수가 유동적일 때 수식의 "9" 대신 `COUNTA(...)`로 대체 가능.
---
### 3-6. ROW — 셀의 행번호
문법: `ROW([참조])`
참조가 있으면 그 셀의 행번호, 없으면 수식이 있는 셀의 행번호.
=ROW() → A1에 넣으면 1, A2로 드래그하면 2, ...
=SMALL(범위, ROW()) → k=1,2,3,... 자동 증가
---
## 4. 텍스트 함수
### 4-1. MID — 문자열 잘라내기
문법: `MID(텍스트, 시작위치, 길이)`
=MID("Hello World", 7, 5) → "World"
---
### 4-2. FIND — 위치 찾기 (대소문자 구분)
문법: `FIND(찾을텍스트, 대상텍스트, [시작위치])`
대상 텍스트에서 찾을 텍스트가 시작되는 위치(1부터). 못 찾으면 `#VALUE!`. 대소문자 구분함(SEARCH는 구분 안 함).
MID와 결합한 시트 이름 추출
=MID(CELL("filename",A1), FIND("]",CELL("filename",A1))+1, 100)
"]" 뒤의 시트명 부분을 잘라냄. 100은 넉넉한 길이.
---
### 4-3. LEN — 문자열 길이
문법: `LEN(텍스트)`
문자열의 문자 개수. 공백도 포함.
눈에 안 보이는 문자 디버깅에 필수
=LEN(B2)&" / "&LEN(C2) → 두 셀의 길이 비교
"연차"와 "연차 "(뒤 공백 있음)는 눈으로는 구분 어렵지만 LEN 결과가 2 vs 3으로 명확히 다름.
---
### 4-4. EXACT — 두 텍스트가 정확히 같은지
문법: `EXACT(텍스트1, 텍스트2)`
대소문자와 공백까지 정확히 일치하면 TRUE. `=` 연산자는 대소문자 무시하지만 EXACT는 엄격.
=EXACT("연차", "연차") → TRUE
=EXACT("연차", "연차 ") → FALSE (뒤 공백)
---
### 4-5. TRIM — 공백 정리
문법: `TRIM(텍스트)`
문자열 앞뒤 공백을 제거하고, 중간의 연속된 공백을 하나로 축소.
=TRIM(" 안녕 하세요 ") → "안녕 하세요"
주의: TRIM이 만능은 아님
일반 공백(스페이스, 코드 32)만 제거. 유니코드의 non-breaking space(코드 160), zero-width space 등은 남음. 이런 문자는 찾기·바꾸기 또는 메모장 경유 복사로 세척.
---
## 5. 실전 조합 패턴 10가지
### 패턴 1: IFERROR + VLOOKUP — 안전한 조회
=IFERROR(VLOOKUP(A1, 표, 2, 0), "")
못 찾으면 #N/A 대신 빈칸 반환. VLOOKUP 실무에서 사실상 필수 조합.
---
### 패턴 2: INDEX + MATCH — VLOOKUP의 상위 호환
=INDEX(반환열, MATCH(찾을값, 검색열, 0))
VLOOKUP은 검색열이 항상 표의 첫 열이어야 하지만, INDEX+MATCH는 자유롭게 배치 가능. 왼쪽으로도 조회 가능.
---
### 패턴 3: INDIRECT + 문자열 조립 — 동적 시트 참조
=INDIRECT("["&$Z$1&"]"&A1&"_지출명세서!$C$3:$G$12")
파일명·시트명을 셀 값으로 참조. 자동화된 참조 조립. 대상 파일은 열려 있어야 함.
---
### 패턴 4: INDEX + SMALL + IF + ROW — 빈칸 압축 필터
{=IFERROR(INDEX($A$1:$A$100,
SMALL(IF($B$1:$B$100<>"", ROW($B$1:$B$100)), ROW())), "")}
B열에 값이 있는 행들의 A열 값만 위로 몰아 표시. Ctrl+Shift+Enter. 근태 정리·필터링에 만능.
---
### 패턴 5: AGGREGATE(15, 6, ...) — 배열수식 없이 필터
=IFERROR(INDEX($A$1:$A$100,
AGGREGATE(15, 6, ROW($B$1:$B$100)/($B$1:$B$100<>""), ROW())), "")
패턴 4와 같은 결과를 일반 Enter로. Ctrl+Shift+Enter 안 되는 상황에서 대체.
---
### 패턴 6: CELL + MID + FIND — 시트 이름 추출
=MID(CELL("filename",A1), FIND("]",CELL("filename",A1))+1, 100)
파일 저장 후 작동. 각 시트에 A1에 넣어두면 그 시트의 이름이 자동으로 뜸. INDIRECT와 결합하면 시트별 자동 참조가 가능.
---
### 패턴 7: INT + MOD + ROW — 1차원 → 2차원 좌표
=INT((ROW()-1)/N)+1 → 첫 번째 축 인덱스
=MOD(ROW()-1, N)+1 → 두 번째 축 인덱스
세로로 확장한 데이터를 날짜×인원 같은 2차원으로 다시 매핑. N을 사람 수로 하면 날짜×인원이 되고, 날짜 수로 하면 인원×날짜가 됨.
---
### 패턴 8: ISNUMBER + MATCH — 리스트 소속 여부
=ISNUMBER(MATCH(A1, $리스트, 0))
A1이 리스트에 있으면 TRUE, 없으면 FALSE. 필터 기준으로 자주 씀.
---
### 패턴 9: 중첩 IF — OR을 안전하게 대체
=IF(조건1, 값1,
IF(조건2, 값2,
IF(조건3, 값3, 기본값)))
OR은 모든 조건을 실행하지만 IF는 조건별로 단락 평가. `INDEX(..., 0)` 같은 위험한 호출이 뒤에 있을 때는 반드시 중첩 IF로.
---
### 패턴 10: LEN + EXACT + TRIM — 텍스트 오염 디버깅
=LEN(A1)&" / "&LEN(B1) → 눈에 안 보이는 차이 확인
=EXACT(A1, B1) → 대소문자·공백까지 엄격 비교
=TRIM(A1) → 앞뒤 공백 정리
"왜 같은 값 같은데 매칭이 안 되지?"의 90%는 이 세 함수로 원인 파악. 특히 다른 파일에서 복사해 온 데이터에서 자주 발생.
---
# Part 2. 실전 기능·기법 편
## 6. 외부 파일 참조 관련
### 6-1. 데이터 유효성 검사에 다른 파일 참조가 안 되는 문제
문제
데이터 유효성 검사의 목록 원본에 다른 파일의 범위(`[원본.cell]Sheet1!$A:$A`)를 직접 넣으면 인식하지 않음. 같은 파일 내 참조는 되는데 외부 파일은 막혀 있음.
이유
프로그램이 의도적으로 막아둠. 원본 파일이 닫혀 있을 때 목록이 비어버리는 무결성 문제와, 원본 파일 이동·이름변경 시 링크 깨짐을 사용자가 알아차리기 어려운 문제 때문.
해결: 이름 정의(Named Range)로 우회
1. 상단 메뉴 → 수식 → 이름 정의 (또는 Ctrl+F3)
2. 이름: 예 → `항목목록`
3. 참조 대상에 외부 파일 경로 입력: `=[원본.cell]Sheet1!$A$1:$A$20`
4. 데이터 유효성 검사 → 제한대상: 목록 → 원본: `=항목목록`
이름 정의를 거치면 유효성 검사가 이를 정상 참조로 인정. 단, 원본 파일이 열려 있어야 드롭다운에 항목이 표시됨.
---
### 6-2. 파일 참조가 [1]로 자동 변환되는 문제
문제
파일을 저장하고 다시 열면 `[지출결의서.cell]`같은 파일명 참조가 `[1]`로 바뀌어 있음.
이유
한셀·엑셀은 외부 참조를 파일 내부의 링크 테이블에 인덱스 번호로 저장합니다. 두 파일이 동시에 열려 있으면 인덱스를 실제 파일명으로 변환해 표시하지만, 소스 파일이 닫혀 있으면 저장된 인덱스 그대로(`[1]`) 표시. 수식은 여전히 정상 작동함.
해결책들
- 소스 파일 먼저 열기: 파일 참조가 정상 표시됨
- 연결 끊기: 편집 → 연결 → 연결 끊기. 외부 참조가 현재 값으로 고정됨(원본이 변해도 반영 안 됨). 결산 후 보관용에 적합
- 같은 폴더에 상대경로로 관리: 파일 이동에 영향 없음
---
### 6-3. INDIRECT 안 문자열도 [1]로 바뀌는 문제
문제
INDIRECT 안에 `"[지출결의서.cell]"`이라고 텍스트로 써도 저장/열기 후 `[1]`로 바뀜.
이유
한셀의 링크 스캐너가 저장 시점에 문자열까지 스캔해 `[파일명.확장자]` 패턴을 찾으면 링크 테이블에 등록해버림.
해결: 파일명을 셀에 넣어두기 (권장)
Z1: 지출결의서.cell ← 셀에 파일명 저장
수식: =INDIRECT("["&$Z$1&"]"&A1&"_지출명세서!$C$3:$G$12")
파일명이 문자열 리터럴로 존재하지 않으니 스캐너가 인식하지 못함. 나중에 파일명이 바뀌어도 Z1만 수정하면 되니 유지보수도 편함.
---
### 6-4. 편집 → 연결(링크) 메뉴
편집 → 연결에서 현재 파일이 참조하는 외부 파일 목록 확인 가능:
- 연결 업데이트: 최신 값 새로고침
- 원본 변경: 참조 대상을 다른 파일로 교체
- 연결 끊기: 값 고정
- 원본 열기: 참조 파일을 바로 열기
---
## 7. 이름 정의 (Named Range)
### 7-1. 기본 사용법
범위·수식에 이름을 붙여 관리. 복잡한 참조를 간결하게 표현 가능.
만들기
- 범위 선택 후 상단 왼쪽 이름 상자에 이름 입력 후 Enter (가장 빠름)
- 또는 Ctrl+F3 → 새로 만들기
- 수식 → 이름 정의
---
### 7-2. 이름 정의의 활용
① 복잡한 범위를 간결한 이름으로
이름: 매출목록 → 참조: =Sheet1!$B$2:$B$1000
수식: =SUM(매출목록)
② 자주 쓰는 상수
이름: 부가세율 → 참조: =0.1
수식: =A1*부가세율
③ 외부 파일 참조 우회
이름: 항목목록 → 참조: =[원본.cell]Sheet1!$A$1:$A$20
유효성 검사 원본: =항목목록
④ 동적 범위 이름 (COUNTA + OFFSET)
이름: 매출_동적
참조: =OFFSET(Sheet1!$B$2, 0, 0, COUNTA(Sheet1!$B:$B)-1, 1)
데이터가 추가돼도 자동으로 범위 확장. 대시보드·차트에서 유용.
---
## 8. 데이터 유효성 검사
### 8-1. 기본 사용
데이터 → 유효성 검사 (한셀 메뉴 위치는 버전마다 조금 다름)
제한 대상 종류
| 유형 | 용도 |
|---|---|
| 정수 | 지정 범위 내 정수만 |
| 소수 | 지정 범위 내 실수만 |
| 목록 | 드롭다운으로 선택 (가장 많이 씀) |
| 날짜/시간 | 날짜 범위 제한 |
| 텍스트 길이 | 글자 수 제한 |
| 사용자 지정 | 수식으로 조건 지정 |
---
### 8-2. 목록 만들기 3가지 방법
① 직접 입력
원본: 연차,반차,병가,공가
간단하지만 항목 늘어나면 관리 어려움.
② 같은 파일 내 셀 참조
원본: =$Z$2:$Z$20
③ 다른 파일 참조 (이름 정의 필수)
이름 정의: 항목 = [원본.cell]Sheet1!$A$1:$A$20
원본: =항목
---
### 8-3. 사용자 지정 조건의 응용
"이 열의 항목은 중복 불가"
=COUNTIF($A$1:$A$100, A1)=1
같은 열에 이미 같은 값이 있으면 입력 불가.
"이 셀 값은 반드시 다른 열의 값보다 커야 함"
=A1>B1
---
### 8-4. 오류 알림 스타일
- 중지: 잘못된 입력 불가
- 경고: 경고 표시 후 계속 여부 선택
- 정보: 알림만, 입력 허용
---
## 9. 수식 입력·편집 기법
### 9-1. 배열수식(CSE) 다루기
입력 요령
1. 수식 입력 후 Ctrl + Shift + Enter
2. 성공 시 수식 양쪽에 `{ }`가 자동으로 붙음
3. 편집 시에도 다시 CSE로 확정해야 함
CSE가 안 될 때 체크리스트
- 셀 편집 모드(F2)에서 눌러야 함
- 한글 입력 상태면 영문으로 전환
- 수식 입력줄이 활성화되어 있어야 함
- 계속 안 되면 AGGREGATE(15, 6, ...) 로 대체
---
### 9-2. 수식 편집 핵심 단축키
| 단축키 | 기능 |
|---|---|
| F2 | 셀 편집 모드 진입 |
| F4 | 참조 절대/상대 순환 ($A$1 → A$1 → $A1 → A1) |
| F9 | 전체 재계산 |
| Shift+F9 | 현재 시트만 재계산 |
| 수식 부분 선택 후 F9 | 선택 부분만 계산해서 값 확인 (디버깅) |
| Ctrl+` (백틱) | 수식/값 표시 전환 |
| Ctrl+Enter | 선택된 여러 셀에 같은 수식 한 번에 입력 |
| Alt+= | 자동 합계 삽입 |
---
### 9-3. 절대·상대 참조
| 표기 | 의미 | 드래그 시 변화 |
|---|---|---|
| A1 | 완전 상대 | 행·열 모두 변함 |
| $A1 | 열 고정 | 행만 변함 |
| A$1 | 행 고정 | 열만 변함 |
| $A$1 | 완전 절대 | 변하지 않음 |
실전 팁: 매핑 테이블·헬퍼 영역은 `$A$1` 스타일로 고정. 각 행에서 상대적으로 참조해야 하는 값(같은 행의 다른 열)은 `A1`처럼 상대 참조.
---
## 10. 계산 옵션과 재계산
### 10-1. 재귀 참조 다루기
자기 열의 다른 행을 참조하는 재귀식은 일반적으로 문제없이 작동하지만, 계산 순서가 꼬여 잠깐 이상한 값을 보이는 경우가 있음.
대처
- F9로 전체 재계산
- 수식 → 계산 옵션 → 자동 (수동으로 되어 있으면 값이 갱신 안 됨)
- 진짜 순환 참조가 있으면 상태 표시줄에 경고. 반복 계산 옵션을 켜야 계산됨
---
### 10-2. 계산 옵션
- 자동: 데이터 변경 즉시 재계산 (기본)
- 수동: F9 눌러야 재계산. 큰 파일에서 성능용
- 테이블 제외 자동: 데이터 테이블만 수동
---
### 10-3. 순환 참조와 반복 계산
A1이 B1을 참조하고 B1이 A1을 참조하는 경우. 기본적으로 오류. 파일 → 옵션 → 수식 → 반복 계산 활성화하면 지정한 횟수만큼 반복 계산해 근사값 도출(특수 목적에만 사용).
---
## 11. 데이터 세척·디버깅
### 11-1. 눈에 안 보이는 문자 찾기
증상: "연차"와 "연차"가 눈으로는 같은데 `N1=N10` 비교에서 FALSE가 나옴. 특히 다른 파일에서 복사해 온 데이터에서 자주 발생.
진단 3단계
1) =LEN(A1)&"/"&LEN(B1) → 길이 비교
2) =EXACT(A1, B1) → 엄격 비교
3) =CODE(MID(A1, 위치, 1)) → 특정 위치의 문자 코드 확인
CODE 값이 32면 일반 공백, 160이면 non-breaking space, 8203이면 zero-width space.
---
### 11-2. 데이터 세척 방법
① TRIM으로 공백 제거
=TRIM(A1) → 일반 공백만 제거
② SUBSTITUTE로 특정 문자 제거
=SUBSTITUTE(A1, CHAR(160), "") → non-breaking space 제거
=SUBSTITUTE(A1, CHAR(8203), "") → zero-width space 제거
③ 찾기·바꾸기(Ctrl+H)로 일괄
문제 문자를 셀에서 복사해 찾을 값에 붙여넣고, 바꿀 값은 비운 채 모두 바꾸기.
④ 메모장 경유 (만능)
데이터 선택 → 값 복사 → 메모장에 붙여넣기 → 다시 복사 → 원래 위치에 붙여넣기.
서식·이상 문자·수식이 모두 벗겨져 순수 텍스트만 남음.
---
### 11-3. 수식 부분 계산 디버깅
수식 창에서 부분 선택 → F9
복잡한 수식의 특정 부분만 계산해 값을 확인. 예: `IF(A1>0, X, Y)`에서 `A1>0`만 선택 후 F9 → 실제 결과가 TRUE/FALSE로 표시. Esc로 복원.
---
## 12. 시트·열 관리
### 12-1. 열·행 숨기기
헬퍼 열 감추기
J~R열처럼 중간 계산용 헬퍼는 열 머리글 선택 → 우클릭 → 숨기기. 수식은 그대로 작동하고 결과만 깔끔하게 보임.
다시 표시: 숨겨진 열 양쪽을 선택 → 우클릭 → 숨기기 취소.
---
### 12-2. 그룹화
여러 열/행을 접었다 폈다 할 수 있는 아웃라인 기능.
- 열 선택 → 데이터 → 그룹
- 왼쪽 위의 +/- 버튼으로 접기/펴기
- 숨기기보다 유연 (필요할 때만 잠깐 펴서 확인)
---
### 12-3. 틀 고정
보기 → 틀 고정. 스크롤해도 지정한 행/열이 항상 보임. 첫 행·첫 열만 고정, 지정 위치 기준 고정 등 옵션 있음.
---
### 12-4. 창 나누기
보기 → 나누기. 한 시트를 여러 창으로 나눠 다른 위치를 동시에 볼 수 있음. 큰 표에서 앞뒤 비교할 때 편함.
---
### 12-5. 시트 관리
| 동작 | 방법 |
|---|---|
| 시트 복사 | Ctrl 누른 채 시트 탭 드래그 |
| 여러 시트 동시 편집 | Ctrl로 여러 탭 선택 → 편집한 게 모든 시트에 반영 |
| 시트 색상 | 탭 우클릭 → 탭 색상 |
| 시트 보호 | 검토 → 시트 보호 |
| 시트 숨기기 | 탭 우클릭 → 숨기기 |
---
## 13. 기타 실전 꿀팁
### 13-1. 자동 채우기 옵션
셀 드래그로 채운 뒤 나타나는 아이콘 클릭 → 옵션 선택:
- 셀 복사 (완전 복사)
- 연속 데이터 채우기 (1,2,3,...)
- 서식만 채우기
- 서식 없이 채우기
---
### 13-2. 이동 옵션 (Ctrl+G / F5)
특정 유형 셀만 선택
Ctrl+G → 옵션 → 종류 선택:
- 빈 셀: 빈 셀만 선택 (일괄 채우기용)
- 상수: 값이 입력된 셀만
- 수식: 수식이 있는 셀만
- 조건부 서식: 조건부 서식이 걸린 셀
매우 큰 표에서 특정 유형만 골라 편집할 때 유용.
---
### 13-3. 조건부 서식
서식 → 조건부 서식. 값에 따라 자동으로 색·글꼴 변경.
- 셀 강조 규칙: 특정 값보다 크거나 작을 때
- 상위/하위 규칙: 상위 10%, 평균 초과 등
- 데이터 막대·색조·아이콘 집합: 시각화
- 수식 사용: 임의 조건으로 서식 적용 (예: 짝수 행 배경색)
---
### 13-4. 선택하여 붙여넣기 (Ctrl+Alt+V)
특히 유용한 옵션
- 값: 수식이 아닌 결과값만 붙여넣기 (수식을 값으로 고정)
- 서식: 서식만 복사
- 연산: 붙여넣을 때 사칙연산 (일괄 곱하기 등)
- 행/열 바꿈: 가로↔세로 전환
---
### 13-5. 빠른 채우기 (Flash Fill)
패턴을 인식해 자동으로 나머지 채움. 예: A열에 "홍길동", B열에 "홍"만 입력 후 Ctrl+E → 성씨만 자동 추출.
---
### 13-6. 필터·정렬
- 데이터 → 자동 필터: 열 머리글에 드롭다운 → 조건 선택
- 정렬: 데이터 → 정렬 → 여러 기준으로 다단 정렬 가능
- 고급 필터: 조건을 별도 영역에 정의해 복잡한 필터
---
### 13-7. 피벗 테이블 (요약 분석)
대량 데이터를 요약·집계할 때. 삽입 → 피벗 테이블. 드래그로 행/열/값을 배치. 근태 정리 같은 반복 업무에서 원본 표만 바꾸면 요약이 자동 갱신되는 형태로 활용 가능.
---
### 13-8. 스파크라인
셀 하나 안에 미니 차트를 그림. 삽입 → 스파크라인. 트렌드·요약 시각화에 좋음.
---
### 13-9. 메모(주석)와 셀 설명
- 셀 우클릭 → 메모 삽입: 셀에 부가 설명. 빨간 삼각형으로 표시
- 복잡한 수식이 있는 셀에 메모로 "무엇을 하는지" 남겨두면 나중에 유지보수 편함
---
# 부록
## A. 배열수식과 AGGREGATE 비교
| | 배열수식 (SMALL + IF) | AGGREGATE(15, 6, ...) |
|---|---|---|
| 입력 방법 | Ctrl+Shift+Enter | 일반 Enter |
| 수식 표시 | `{ ... }`로 감싸짐 | 일반 수식 |
| 가독성 | 익숙하면 명확 | 함수번호 15가 뭔지 알아야 함 |
| 호환성 | 구버전에서도 작동 | 비교적 신규 함수 |
| 디버깅 | 수식 창에서 F9로 부분 평가 어려움 | 비교적 쉬움 |
| 편집 실수 | 재입력 시 CSE 잊기 쉬움 | 편집 걱정 없음 |
둘 다 같은 결과를 얻을 수 있으므로 상황과 취향에 따라 선택. Ctrl+Shift+Enter가 안 되는 환경에서는 AGGREGATE가 안전.
---
## B. 유용한 단축키 요약
| 단축키 | 기능 |
|---|---|
| Ctrl+방향키 | 데이터 끝까지 이동 |
| Ctrl+Shift+방향키 | 데이터 끝까지 선택 |
| Ctrl+Home / End | 시트 처음 / 데이터 끝 |
| Ctrl+; | 오늘 날짜 입력 |
| Ctrl+Shift+; | 현재 시간 입력 |
| Ctrl+D / R | 위 셀 아래로 복사 / 왼쪽 셀 오른쪽으로 복사 |
| Ctrl+1 | 셀 서식 대화상자 |
| Ctrl+T | 표(테이블) 만들기 |
| Ctrl+Z / Y | 실행 취소 / 다시 실행 |
| Ctrl+Page Up/Down | 시트 탭 이동 |
| Ctrl+F3 | 이름 관리자 |
| Ctrl+H | 찾기·바꾸기 |
| Ctrl+G 또는 F5 | 이동 옵션 |
| Ctrl+E | 빠른 채우기 |
| Ctrl+Alt+V | 선택하여 붙여넣기 |
| Alt+= | 자동 합계 |
| F2 | 셀 편집 모드 |
| F4 | 참조 절대/상대 순환 |
| F9 | 전체 재계산 |
| Ctrl+` | 수식/값 표시 전환 |
---
한셀 기준으로 작성되었으며, 엑셀에서도 대부분 동일하게 사용 가능합니다.
메뉴 위치와 일부 단축키는 버전에 따라 다를 수 있습니다.
# 한셀 종합 가이드: 함수와 실전 기능 모음
한셀·엑셀 작업을 주로 하는 군대 업무를 어느정도 자동화하기 위해 공부하고 사용했던 함수와 기능들을 정리해보았다.
---
## 목차
Part 1. 함수 편
1. 조회·참조 함수 (VLOOKUP, INDEX, MATCH, INDIRECT, CELL, OFFSET)
2. 논리 함수 (IF, IFERROR, OR, NOT, ISNUMBER)
3. 수학·통계·위치 함수 (SMALL, AGGREGATE, INT, MOD, MAX, COUNTA, ROW)
4. 텍스트 함수 (MID, FIND, LEN, EXACT, TRIM)
5. 실전 조합 패턴 10가지
Part 2. 실전 기능·기법 편
6. 외부 파일 참조 관련
7. 이름 정의 (Named Range)
8. 데이터 유효성 검사
9. 수식 입력·편집 기법
10. 계산 옵션과 재계산
11. 데이터 세척·디버깅
12. 시트·열 관리
13. 기타 실전 꿀팁
부록
- 배열수식 vs AGGREGATE 비교
- 유용한 단축키 요약
---
# Part 1. 함수 편
## 1. 조회·참조 함수
### 1-1. VLOOKUP — 수직 조회
문법: `VLOOKUP(찾을값, 표범위, 반환열번호, [일치방식])`
표범위의 첫 번째 열에서 찾을값을 검색한 뒤, 같은 행의 지정한 열 값을 반환합니다.
- 일치방식: 0 또는 FALSE는 정확히 일치, 1 또는 TRUE(생략 시)는 근사값
- 실무에선 거의 항상 0(정확히 일치) 을 씀
- 와일드카드(`*`, `?`) 사용 가능 — 단, 일치방식이 0일 때만
기본 예시
A열에 상품명, B열에 가격이 있을 때 "사과"의 가격 찾기:
=VLOOKUP("사과", $A$2:$B$100, 2, 0)
와일드카드 예시
"급여"가 포함된 첫 번째 항목 찾기:
=VLOOKUP("*급여*", $A$1:$B$100, 2, 0)
셀 참조와 결합 (C1에 검색어가 있을 때):
=VLOOKUP("*"&C1&"*", $A$1:$B$100, 2, 0)
---
### 1-2. INDEX — 행·열 좌표로 값 가져오기
문법: `INDEX(범위, 행번호, [열번호])`
범위 내에서 특정 위치의 값을 반환. 1차원 범위면 열번호 생략, 2차원 범위면 둘 다 지정.
- 행번호에 0을 넣으면 해당 열 전체를 배열로 반환 (주의 필요)
- VLOOKUP과 달리 왼쪽으로도 조회 가능하고, 순서 상관없이 자유롭게 접근
예시
=INDEX($A$1:$C$10, 5, 2) → 5행 2열의 값
=INDEX($A$1:$A$10, 3) → A3의 값
=INDEX($B$1:$H$1, J1) → 1행에서 J1번째 열의 값 (날짜 조회)
---
### 1-3. MATCH — 값의 위치 찾기
문법: `MATCH(찾을값, 검색범위, [일치방식])`
검색범위에서 찾을값이 몇 번째에 있는지 반환. 값 자체가 아니라 위치(순서) 를 반환합니다.
- 일치방식 0 = 정확히 일치, 1(생략) = 근사값(오름차순), -1 = 근사값(내림차순)
- 못 찾으면 `#N/A` 반환
예시
=MATCH("병가", $T$2:$T$13, 0) → T열에서 "병가"의 위치 (예: 3)
매핑 테이블에 특정 값이 있는지 확인하는 용도로 자주 씀:
=ISNUMBER(MATCH(N1, mapping, 0)) → 있으면 TRUE, 없으면 FALSE
---
### 1-4. INDIRECT — 문자열을 셀 참조로 변환
문법: `INDIRECT(참조_텍스트)`
텍스트 형태로 표현된 셀 주소를 실제 참조로 변환. 참조를 동적으로 만들 때 사용.
- 다른 파일 참조 시 해당 파일이 열려 있어야 값이 나옴
- 휘발성 함수: 시트가 재계산될 때마다 다시 계산됨 → 남용하면 성능 저하
예시
=INDIRECT("A"&1) → A1 참조
=INDIRECT("Sheet2!B"&C1) → C1이 5면 Sheet2!B5의 값
=INDIRECT("["&$Z$1&"]"&A1&"_지출명세서!$C$3") → 파일명·시트명 조립
---
### 1-5. CELL — 셀 정보 반환
문법: `CELL(정보유형, [참조])`
셀의 서식·위치·내용 정보를 반환.
- `"filename"`: 전체 경로 (경로\[파일명]시트명 형태)
- `"address"`: 셀 주소
- `"row"`, `"col"`: 행·열 번호
시트 이름 추출 응용
=MID(CELL("filename",A1), FIND("]",CELL("filename",A1))+1, 100)
"]" 위치를 찾아 그 뒤부터 자르면 시트 이름만 남음. 파일을 한 번 저장한 뒤에야 작동.
---
### 1-6. OFFSET — 기준 셀에서 이동한 위치
문법: `OFFSET(기준, 행이동, 열이동, [높이], [너비])`
기준 셀에서 지정한 만큼 이동한 위치의 셀(또는 범위) 반환. INDIRECT처럼 휘발성.
예시
=OFFSET(A1, 2, 3) → A1에서 2행 아래, 3열 오른쪽 = D3
=OFFSET(A1, 0, 0, 10, 1) → A1부터 10행×1열 범위 = A1:A10
---
## 2. 논리 함수
### 2-1. IF — 조건 분기
문법: `IF(조건, 참일때, 거짓일때)`
조건이 TRUE면 첫 번째 값을, FALSE면 두 번째 값을 반환.
중첩 IF 예시
=IF(A1>90, "A",
IF(A1>80, "B",
IF(A1>70, "C", "F")))
중요: 중첩 IF는 진짜 단락 평가
IF는 조건이 TRUE면 뒤의 조건은 아예 실행하지 않음. 반면 OR/AND는 모든 인자를 실행하므로, 잘못 쓰면 INDEX 등에서 예상치 못한 에러가 남.
---
### 2-2. IFERROR — 에러 처리
문법: `IFERROR(수식, 에러시_대체값)`
수식이 에러(#N/A, #REF!, #DIV/0! 등)를 반환하면 대체값으로 대체.
예시
=IFERROR(VLOOKUP(A1, table, 2, 0), "-") → 못 찾으면 "-"
=IFERROR(A1/B1, 0) → 0으로 나누면 0
VLOOKUP 실무에서 사실상 필수 조합.
---
### 2-3. OR / NOT
OR(조건1, 조건2, ...) → 하나라도 TRUE면 TRUE
NOT(조건) → 반대로 뒤집기
주의: OR은 단락 평가 안 함
=OR(A1=0, 10/A1>5) → A1=0일 때 뒤의 10/A1도 실행 → #DIV/0!
안전하게 쓰려면 IF 중첩:
=IF(A1=0, TRUE, 10/A1>5)
---
### 2-4. ISNUMBER — 숫자인지 확인
문법: `ISNUMBER(값)`
값이 숫자면 TRUE, 아니면 FALSE. 텍스트, 에러값, 빈 셀은 FALSE.
MATCH와 결합해 `ISNUMBER(MATCH(값, 리스트, 0))` 패턴으로 "리스트에 이 값이 있는지" 판정. MATCH가 못 찾으면 #N/A를 반환하는데, ISNUMBER로 감싸면 TRUE/FALSE로 깔끔하게 정리됨.
---
## 3. 수학·통계·위치 함수
### 3-1. SMALL — k번째로 작은 값
문법: `SMALL(범위_또는_배열, k)`
범위에서 k번째로 작은 값을 반환. LARGE는 반대(k번째로 큰 값).
- 텍스트, 논리값, 빈 셀은 무시
- 배열수식과 결합해 "빈칸 압축" 필터링에 핵심
배열수식 결합 (Ctrl+Shift+Enter)
{=SMALL(IF($A$1:$A$10<>"", ROW($A$1:$A$10)), ROW())}
값이 있는 셀들의 행번호만 골라내 순서대로 1번째, 2번째, ... 반환.
---
### 3-2. AGGREGATE — 배열수식 없이 집계
문법: `AGGREGATE(함수번호, 옵션, 배열, [k])`
SMALL·LARGE·SUM 등을 Ctrl+Shift+Enter 없이 배열 연산으로 수행. 에러값 무시 옵션 내장.
- 함수번호 15 = SMALL, 14 = LARGE, 9 = SUM 등
- 옵션 6 = 에러값 무시
SMALL + IF 배열식의 대체
=AGGREGATE(15, 6, ROW($A$1:$A$10)/($A$1:$A$10<>""), ROW())
`1/($A$1:$A$10<>"")`는 빈 셀에서 `1/FALSE=#DIV/0!` 에러를 내는데, 옵션 6이 이걸 무시. 일반 Enter로 작동.
---
### 3-3. INT / MOD — 정수부·나머지
INT(수) → 소수점 이하 버림
MOD(수, 나눌수) → 나머지
2차원 좌표 계산 응용
1차원 순번(1,2,3,...)을 인원 수 9명 기준으로 날짜·이름 인덱스로 변환:
=INT((ROW()-1)/9)+1 → 날짜 인덱스: 1~9행 → 1, 10~18행 → 2, ...
=MOD(ROW()-1, 9)+1 → 이름 인덱스: 1행 → 1, 2행 → 2, ..., 10행 → 1, ...
---
### 3-4. MAX — 최댓값
문법: `MAX(값1, 값2, ...)`
경계 방어 응용
=INDEX($A$1:$A$63, MAX(ROW()-9, 1)) → 음수/0 방지
---
### 3-5. COUNTA — 빈 셀이 아닌 셀 개수
문법: `COUNTA(범위)`
범위 내 빈 셀이 아닌 셀의 개수. 숫자·텍스트·논리값·에러값 모두 포함.
=COUNTA($A$2:$A$100) → A2~A100에 값이 몇 개 있는지
인원 수가 유동적일 때 수식의 "9" 대신 `COUNTA(...)`로 대체 가능.
---
### 3-6. ROW — 셀의 행번호
문법: `ROW([참조])`
참조가 있으면 그 셀의 행번호, 없으면 수식이 있는 셀의 행번호.
=ROW() → A1에 넣으면 1, A2로 드래그하면 2, ...
=SMALL(범위, ROW()) → k=1,2,3,... 자동 증가
---
## 4. 텍스트 함수
### 4-1. MID — 문자열 잘라내기
문법: `MID(텍스트, 시작위치, 길이)`
=MID("Hello World", 7, 5) → "World"
---
### 4-2. FIND — 위치 찾기 (대소문자 구분)
문법: `FIND(찾을텍스트, 대상텍스트, [시작위치])`
대상 텍스트에서 찾을 텍스트가 시작되는 위치(1부터). 못 찾으면 `#VALUE!`. 대소문자 구분함(SEARCH는 구분 안 함).
MID와 결합한 시트 이름 추출
=MID(CELL("filename",A1), FIND("]",CELL("filename",A1))+1, 100)
"]" 뒤의 시트명 부분을 잘라냄. 100은 넉넉한 길이.
---
### 4-3. LEN — 문자열 길이
문법: `LEN(텍스트)`
문자열의 문자 개수. 공백도 포함.
눈에 안 보이는 문자 디버깅에 필수
=LEN(B2)&" / "&LEN(C2) → 두 셀의 길이 비교
"연차"와 "연차 "(뒤 공백 있음)는 눈으로는 구분 어렵지만 LEN 결과가 2 vs 3으로 명확히 다름.
---
### 4-4. EXACT — 두 텍스트가 정확히 같은지
문법: `EXACT(텍스트1, 텍스트2)`
대소문자와 공백까지 정확히 일치하면 TRUE. `=` 연산자는 대소문자 무시하지만 EXACT는 엄격.
=EXACT("연차", "연차") → TRUE
=EXACT("연차", "연차 ") → FALSE (뒤 공백)
---
### 4-5. TRIM — 공백 정리
문법: `TRIM(텍스트)`
문자열 앞뒤 공백을 제거하고, 중간의 연속된 공백을 하나로 축소.
=TRIM(" 안녕 하세요 ") → "안녕 하세요"
주의: TRIM이 만능은 아님
일반 공백(스페이스, 코드 32)만 제거. 유니코드의 non-breaking space(코드 160), zero-width space 등은 남음. 이런 문자는 찾기·바꾸기 또는 메모장 경유 복사로 세척.
---
## 5. 실전 조합 패턴 10가지
### 패턴 1: IFERROR + VLOOKUP — 안전한 조회
=IFERROR(VLOOKUP(A1, 표, 2, 0), "")
못 찾으면 #N/A 대신 빈칸 반환. VLOOKUP 실무에서 사실상 필수 조합.
---
### 패턴 2: INDEX + MATCH — VLOOKUP의 상위 호환
=INDEX(반환열, MATCH(찾을값, 검색열, 0))
VLOOKUP은 검색열이 항상 표의 첫 열이어야 하지만, INDEX+MATCH는 자유롭게 배치 가능. 왼쪽으로도 조회 가능.
---
### 패턴 3: INDIRECT + 문자열 조립 — 동적 시트 참조
=INDIRECT("["&$Z$1&"]"&A1&"_지출명세서!$C$3:$G$12")
파일명·시트명을 셀 값으로 참조. 자동화된 참조 조립. 대상 파일은 열려 있어야 함.
---
### 패턴 4: INDEX + SMALL + IF + ROW — 빈칸 압축 필터
{=IFERROR(INDEX($A$1:$A$100,
SMALL(IF($B$1:$B$100<>"", ROW($B$1:$B$100)), ROW())), "")}
B열에 값이 있는 행들의 A열 값만 위로 몰아 표시. Ctrl+Shift+Enter. 근태 정리·필터링에 만능.
---
### 패턴 5: AGGREGATE(15, 6, ...) — 배열수식 없이 필터
=IFERROR(INDEX($A$1:$A$100,
AGGREGATE(15, 6, ROW($B$1:$B$100)/($B$1:$B$100<>""), ROW())), "")
패턴 4와 같은 결과를 일반 Enter로. Ctrl+Shift+Enter 안 되는 상황에서 대체.
---
### 패턴 6: CELL + MID + FIND — 시트 이름 추출
=MID(CELL("filename",A1), FIND("]",CELL("filename",A1))+1, 100)
파일 저장 후 작동. 각 시트에 A1에 넣어두면 그 시트의 이름이 자동으로 뜸. INDIRECT와 결합하면 시트별 자동 참조가 가능.
---
### 패턴 7: INT + MOD + ROW — 1차원 → 2차원 좌표
=INT((ROW()-1)/N)+1 → 첫 번째 축 인덱스
=MOD(ROW()-1, N)+1 → 두 번째 축 인덱스
세로로 확장한 데이터를 날짜×인원 같은 2차원으로 다시 매핑. N을 사람 수로 하면 날짜×인원이 되고, 날짜 수로 하면 인원×날짜가 됨.
---
### 패턴 8: ISNUMBER + MATCH — 리스트 소속 여부
=ISNUMBER(MATCH(A1, $리스트, 0))
A1이 리스트에 있으면 TRUE, 없으면 FALSE. 필터 기준으로 자주 씀.
---
### 패턴 9: 중첩 IF — OR을 안전하게 대체
=IF(조건1, 값1,
IF(조건2, 값2,
IF(조건3, 값3, 기본값)))
OR은 모든 조건을 실행하지만 IF는 조건별로 단락 평가. `INDEX(..., 0)` 같은 위험한 호출이 뒤에 있을 때는 반드시 중첩 IF로.
---
### 패턴 10: LEN + EXACT + TRIM — 텍스트 오염 디버깅
=LEN(A1)&" / "&LEN(B1) → 눈에 안 보이는 차이 확인
=EXACT(A1, B1) → 대소문자·공백까지 엄격 비교
=TRIM(A1) → 앞뒤 공백 정리
"왜 같은 값 같은데 매칭이 안 되지?"의 90%는 이 세 함수로 원인 파악. 특히 다른 파일에서 복사해 온 데이터에서 자주 발생.
---
# Part 2. 실전 기능·기법 편
## 6. 외부 파일 참조 관련
### 6-1. 데이터 유효성 검사에 다른 파일 참조가 안 되는 문제
문제
데이터 유효성 검사의 목록 원본에 다른 파일의 범위(`[원본.cell]Sheet1!$A:$A`)를 직접 넣으면 인식하지 않음. 같은 파일 내 참조는 되는데 외부 파일은 막혀 있음.
이유
프로그램이 의도적으로 막아둠. 원본 파일이 닫혀 있을 때 목록이 비어버리는 무결성 문제와, 원본 파일 이동·이름변경 시 링크 깨짐을 사용자가 알아차리기 어려운 문제 때문.
해결: 이름 정의(Named Range)로 우회
1. 상단 메뉴 → 수식 → 이름 정의 (또는 Ctrl+F3)
2. 이름: 예 → `항목목록`
3. 참조 대상에 외부 파일 경로 입력: `=[원본.cell]Sheet1!$A$1:$A$20`
4. 데이터 유효성 검사 → 제한대상: 목록 → 원본: `=항목목록`
이름 정의를 거치면 유효성 검사가 이를 정상 참조로 인정. 단, 원본 파일이 열려 있어야 드롭다운에 항목이 표시됨.
---
### 6-2. 파일 참조가 [1]로 자동 변환되는 문제
문제
파일을 저장하고 다시 열면 `[지출결의서.cell]`같은 파일명 참조가 `[1]`로 바뀌어 있음.
이유
한셀·엑셀은 외부 참조를 파일 내부의 링크 테이블에 인덱스 번호로 저장합니다. 두 파일이 동시에 열려 있으면 인덱스를 실제 파일명으로 변환해 표시하지만, 소스 파일이 닫혀 있으면 저장된 인덱스 그대로(`[1]`) 표시. 수식은 여전히 정상 작동함.
해결책들
- 소스 파일 먼저 열기: 파일 참조가 정상 표시됨
- 연결 끊기: 편집 → 연결 → 연결 끊기. 외부 참조가 현재 값으로 고정됨(원본이 변해도 반영 안 됨). 결산 후 보관용에 적합
- 같은 폴더에 상대경로로 관리: 파일 이동에 영향 없음
---
### 6-3. INDIRECT 안 문자열도 [1]로 바뀌는 문제
문제
INDIRECT 안에 `"[지출결의서.cell]"`이라고 텍스트로 써도 저장/열기 후 `[1]`로 바뀜.
이유
한셀의 링크 스캐너가 저장 시점에 문자열까지 스캔해 `[파일명.확장자]` 패턴을 찾으면 링크 테이블에 등록해버림.
해결: 파일명을 셀에 넣어두기 (권장)
Z1: 지출결의서.cell ← 셀에 파일명 저장
수식: =INDIRECT("["&$Z$1&"]"&A1&"_지출명세서!$C$3:$G$12")
파일명이 문자열 리터럴로 존재하지 않으니 스캐너가 인식하지 못함. 나중에 파일명이 바뀌어도 Z1만 수정하면 되니 유지보수도 편함.
---
### 6-4. 편집 → 연결(링크) 메뉴
편집 → 연결에서 현재 파일이 참조하는 외부 파일 목록 확인 가능:
- 연결 업데이트: 최신 값 새로고침
- 원본 변경: 참조 대상을 다른 파일로 교체
- 연결 끊기: 값 고정
- 원본 열기: 참조 파일을 바로 열기
---
## 7. 이름 정의 (Named Range)
### 7-1. 기본 사용법
범위·수식에 이름을 붙여 관리. 복잡한 참조를 간결하게 표현 가능.
만들기
- 범위 선택 후 상단 왼쪽 이름 상자에 이름 입력 후 Enter (가장 빠름)
- 또는 Ctrl+F3 → 새로 만들기
- 수식 → 이름 정의
---
### 7-2. 이름 정의의 활용
① 복잡한 범위를 간결한 이름으로
이름: 매출목록 → 참조: =Sheet1!$B$2:$B$1000
수식: =SUM(매출목록)
② 자주 쓰는 상수
이름: 부가세율 → 참조: =0.1
수식: =A1*부가세율
③ 외부 파일 참조 우회
이름: 항목목록 → 참조: =[원본.cell]Sheet1!$A$1:$A$20
유효성 검사 원본: =항목목록
④ 동적 범위 이름 (COUNTA + OFFSET)
이름: 매출_동적
참조: =OFFSET(Sheet1!$B$2, 0, 0, COUNTA(Sheet1!$B:$B)-1, 1)
데이터가 추가돼도 자동으로 범위 확장. 대시보드·차트에서 유용.
---
## 8. 데이터 유효성 검사
### 8-1. 기본 사용
데이터 → 유효성 검사 (한셀 메뉴 위치는 버전마다 조금 다름)
제한 대상 종류
| 유형 | 용도 |
|---|---|
| 정수 | 지정 범위 내 정수만 |
| 소수 | 지정 범위 내 실수만 |
| 목록 | 드롭다운으로 선택 (가장 많이 씀) |
| 날짜/시간 | 날짜 범위 제한 |
| 텍스트 길이 | 글자 수 제한 |
| 사용자 지정 | 수식으로 조건 지정 |
---
### 8-2. 목록 만들기 3가지 방법
① 직접 입력
원본: 연차,반차,병가,공가
간단하지만 항목 늘어나면 관리 어려움.
② 같은 파일 내 셀 참조
원본: =$Z$2:$Z$20
③ 다른 파일 참조 (이름 정의 필수)
이름 정의: 항목 = [원본.cell]Sheet1!$A$1:$A$20
원본: =항목
---
### 8-3. 사용자 지정 조건의 응용
"이 열의 항목은 중복 불가"
=COUNTIF($A$1:$A$100, A1)=1
같은 열에 이미 같은 값이 있으면 입력 불가.
"이 셀 값은 반드시 다른 열의 값보다 커야 함"
=A1>B1
---
### 8-4. 오류 알림 스타일
- 중지: 잘못된 입력 불가
- 경고: 경고 표시 후 계속 여부 선택
- 정보: 알림만, 입력 허용
---
## 9. 수식 입력·편집 기법
### 9-1. 배열수식(CSE) 다루기
입력 요령
1. 수식 입력 후 Ctrl + Shift + Enter
2. 성공 시 수식 양쪽에 `{ }`가 자동으로 붙음
3. 편집 시에도 다시 CSE로 확정해야 함
CSE가 안 될 때 체크리스트
- 셀 편집 모드(F2)에서 눌러야 함
- 한글 입력 상태면 영문으로 전환
- 수식 입력줄이 활성화되어 있어야 함
- 계속 안 되면 AGGREGATE(15, 6, ...) 로 대체
---
### 9-2. 수식 편집 핵심 단축키
| 단축키 | 기능 |
|---|---|
| F2 | 셀 편집 모드 진입 |
| F4 | 참조 절대/상대 순환 ($A$1 → A$1 → $A1 → A1) |
| F9 | 전체 재계산 |
| Shift+F9 | 현재 시트만 재계산 |
| 수식 부분 선택 후 F9 | 선택 부분만 계산해서 값 확인 (디버깅) |
| Ctrl+` (백틱) | 수식/값 표시 전환 |
| Ctrl+Enter | 선택된 여러 셀에 같은 수식 한 번에 입력 |
| Alt+= | 자동 합계 삽입 |
---
### 9-3. 절대·상대 참조
| 표기 | 의미 | 드래그 시 변화 |
|---|---|---|
| A1 | 완전 상대 | 행·열 모두 변함 |
| $A1 | 열 고정 | 행만 변함 |
| A$1 | 행 고정 | 열만 변함 |
| $A$1 | 완전 절대 | 변하지 않음 |
실전 팁: 매핑 테이블·헬퍼 영역은 `$A$1` 스타일로 고정. 각 행에서 상대적으로 참조해야 하는 값(같은 행의 다른 열)은 `A1`처럼 상대 참조.
---
## 10. 계산 옵션과 재계산
### 10-1. 재귀 참조 다루기
자기 열의 다른 행을 참조하는 재귀식은 일반적으로 문제없이 작동하지만, 계산 순서가 꼬여 잠깐 이상한 값을 보이는 경우가 있음.
대처
- F9로 전체 재계산
- 수식 → 계산 옵션 → 자동 (수동으로 되어 있으면 값이 갱신 안 됨)
- 진짜 순환 참조가 있으면 상태 표시줄에 경고. 반복 계산 옵션을 켜야 계산됨
---
### 10-2. 계산 옵션
- 자동: 데이터 변경 즉시 재계산 (기본)
- 수동: F9 눌러야 재계산. 큰 파일에서 성능용
- 테이블 제외 자동: 데이터 테이블만 수동
---
### 10-3. 순환 참조와 반복 계산
A1이 B1을 참조하고 B1이 A1을 참조하는 경우. 기본적으로 오류. 파일 → 옵션 → 수식 → 반복 계산 활성화하면 지정한 횟수만큼 반복 계산해 근사값 도출(특수 목적에만 사용).
---
## 11. 데이터 세척·디버깅
### 11-1. 눈에 안 보이는 문자 찾기
증상: "연차"와 "연차"가 눈으로는 같은데 `N1=N10` 비교에서 FALSE가 나옴. 특히 다른 파일에서 복사해 온 데이터에서 자주 발생.
진단 3단계
1) =LEN(A1)&"/"&LEN(B1) → 길이 비교
2) =EXACT(A1, B1) → 엄격 비교
3) =CODE(MID(A1, 위치, 1)) → 특정 위치의 문자 코드 확인
CODE 값이 32면 일반 공백, 160이면 non-breaking space, 8203이면 zero-width space.
---
### 11-2. 데이터 세척 방법
① TRIM으로 공백 제거
=TRIM(A1) → 일반 공백만 제거
② SUBSTITUTE로 특정 문자 제거
=SUBSTITUTE(A1, CHAR(160), "") → non-breaking space 제거
=SUBSTITUTE(A1, CHAR(8203), "") → zero-width space 제거
③ 찾기·바꾸기(Ctrl+H)로 일괄
문제 문자를 셀에서 복사해 찾을 값에 붙여넣고, 바꿀 값은 비운 채 모두 바꾸기.
④ 메모장 경유 (만능)
데이터 선택 → 값 복사 → 메모장에 붙여넣기 → 다시 복사 → 원래 위치에 붙여넣기.
서식·이상 문자·수식이 모두 벗겨져 순수 텍스트만 남음.
---
### 11-3. 수식 부분 계산 디버깅
수식 창에서 부분 선택 → F9
복잡한 수식의 특정 부분만 계산해 값을 확인. 예: `IF(A1>0, X, Y)`에서 `A1>0`만 선택 후 F9 → 실제 결과가 TRUE/FALSE로 표시. Esc로 복원.
---
## 12. 시트·열 관리
### 12-1. 열·행 숨기기
헬퍼 열 감추기
J~R열처럼 중간 계산용 헬퍼는 열 머리글 선택 → 우클릭 → 숨기기. 수식은 그대로 작동하고 결과만 깔끔하게 보임.
다시 표시: 숨겨진 열 양쪽을 선택 → 우클릭 → 숨기기 취소.
---
### 12-2. 그룹화
여러 열/행을 접었다 폈다 할 수 있는 아웃라인 기능.
- 열 선택 → 데이터 → 그룹
- 왼쪽 위의 +/- 버튼으로 접기/펴기
- 숨기기보다 유연 (필요할 때만 잠깐 펴서 확인)
---
### 12-3. 틀 고정
보기 → 틀 고정. 스크롤해도 지정한 행/열이 항상 보임. 첫 행·첫 열만 고정, 지정 위치 기준 고정 등 옵션 있음.
---
### 12-4. 창 나누기
보기 → 나누기. 한 시트를 여러 창으로 나눠 다른 위치를 동시에 볼 수 있음. 큰 표에서 앞뒤 비교할 때 편함.
---
### 12-5. 시트 관리
| 동작 | 방법 |
|---|---|
| 시트 복사 | Ctrl 누른 채 시트 탭 드래그 |
| 여러 시트 동시 편집 | Ctrl로 여러 탭 선택 → 편집한 게 모든 시트에 반영 |
| 시트 색상 | 탭 우클릭 → 탭 색상 |
| 시트 보호 | 검토 → 시트 보호 |
| 시트 숨기기 | 탭 우클릭 → 숨기기 |
---
## 13. 기타 실전 꿀팁
### 13-1. 자동 채우기 옵션
셀 드래그로 채운 뒤 나타나는 아이콘 클릭 → 옵션 선택:
- 셀 복사 (완전 복사)
- 연속 데이터 채우기 (1,2,3,...)
- 서식만 채우기
- 서식 없이 채우기
---
### 13-2. 이동 옵션 (Ctrl+G / F5)
특정 유형 셀만 선택
Ctrl+G → 옵션 → 종류 선택:
- 빈 셀: 빈 셀만 선택 (일괄 채우기용)
- 상수: 값이 입력된 셀만
- 수식: 수식이 있는 셀만
- 조건부 서식: 조건부 서식이 걸린 셀
매우 큰 표에서 특정 유형만 골라 편집할 때 유용.
---
### 13-3. 조건부 서식
서식 → 조건부 서식. 값에 따라 자동으로 색·글꼴 변경.
- 셀 강조 규칙: 특정 값보다 크거나 작을 때
- 상위/하위 규칙: 상위 10%, 평균 초과 등
- 데이터 막대·색조·아이콘 집합: 시각화
- 수식 사용: 임의 조건으로 서식 적용 (예: 짝수 행 배경색)
---
### 13-4. 선택하여 붙여넣기 (Ctrl+Alt+V)
특히 유용한 옵션
- 값: 수식이 아닌 결과값만 붙여넣기 (수식을 값으로 고정)
- 서식: 서식만 복사
- 연산: 붙여넣을 때 사칙연산 (일괄 곱하기 등)
- 행/열 바꿈: 가로↔세로 전환
---
### 13-5. 빠른 채우기 (Flash Fill)
패턴을 인식해 자동으로 나머지 채움. 예: A열에 "홍길동", B열에 "홍"만 입력 후 Ctrl+E → 성씨만 자동 추출.
---
### 13-6. 필터·정렬
- 데이터 → 자동 필터: 열 머리글에 드롭다운 → 조건 선택
- 정렬: 데이터 → 정렬 → 여러 기준으로 다단 정렬 가능
- 고급 필터: 조건을 별도 영역에 정의해 복잡한 필터
---
### 13-7. 피벗 테이블 (요약 분석)
대량 데이터를 요약·집계할 때. 삽입 → 피벗 테이블. 드래그로 행/열/값을 배치. 근태 정리 같은 반복 업무에서 원본 표만 바꾸면 요약이 자동 갱신되는 형태로 활용 가능.
---
### 13-8. 스파크라인
셀 하나 안에 미니 차트를 그림. 삽입 → 스파크라인. 트렌드·요약 시각화에 좋음.
---
### 13-9. 메모(주석)와 셀 설명
- 셀 우클릭 → 메모 삽입: 셀에 부가 설명. 빨간 삼각형으로 표시
- 복잡한 수식이 있는 셀에 메모로 "무엇을 하는지" 남겨두면 나중에 유지보수 편함
---
# 부록
## A. 배열수식과 AGGREGATE 비교
| | 배열수식 (SMALL + IF) | AGGREGATE(15, 6, ...) |
|---|---|---|
| 입력 방법 | Ctrl+Shift+Enter | 일반 Enter |
| 수식 표시 | `{ ... }`로 감싸짐 | 일반 수식 |
| 가독성 | 익숙하면 명확 | 함수번호 15가 뭔지 알아야 함 |
| 호환성 | 구버전에서도 작동 | 비교적 신규 함수 |
| 디버깅 | 수식 창에서 F9로 부분 평가 어려움 | 비교적 쉬움 |
| 편집 실수 | 재입력 시 CSE 잊기 쉬움 | 편집 걱정 없음 |
둘 다 같은 결과를 얻을 수 있으므로 상황과 취향에 따라 선택. Ctrl+Shift+Enter가 안 되는 환경에서는 AGGREGATE가 안전.
---
## B. 유용한 단축키 요약
| 단축키 | 기능 |
|---|---|
| Ctrl+방향키 | 데이터 끝까지 이동 |
| Ctrl+Shift+방향키 | 데이터 끝까지 선택 |
| Ctrl+Home / End | 시트 처음 / 데이터 끝 |
| Ctrl+; | 오늘 날짜 입력 |
| Ctrl+Shift+; | 현재 시간 입력 |
| Ctrl+D / R | 위 셀 아래로 복사 / 왼쪽 셀 오른쪽으로 복사 |
| Ctrl+1 | 셀 서식 대화상자 |
| Ctrl+T | 표(테이블) 만들기 |
| Ctrl+Z / Y | 실행 취소 / 다시 실행 |
| Ctrl+Page Up/Down | 시트 탭 이동 |
| Ctrl+F3 | 이름 관리자 |
| Ctrl+H | 찾기·바꾸기 |
| Ctrl+G 또는 F5 | 이동 옵션 |
| Ctrl+E | 빠른 채우기 |
| Ctrl+Alt+V | 선택하여 붙여넣기 |
| Alt+= | 자동 합계 |
| F2 | 셀 편집 모드 |
| F4 | 참조 절대/상대 순환 |
| F9 | 전체 재계산 |
| Ctrl+` | 수식/값 표시 전환 |
---
한셀 기준으로 작성되었으며, 엑셀에서도 대부분 동일하게 사용 가능합니다.
메뉴 위치와 일부 단축키는 버전에 따라 다를 수 있습니다.