- 최초 작성일: 2001-07-03
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 사용되지 않은 재료 구하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 게시판에 올라온 질문을 살펴봅니다. 질문자가 든 예시 표는 아래와 같습니다.
| 스킨 | 로션 | 크림 | 에센스 | 비 교 | |
|---|---|---|---|---|---|
| A원료 | PP | PE | AS | PETG | ABS,AL |
| B원료 | PE | ABS | AL | PP,AS,PETG | |
| C원료 | |||||
| D원료 |
전체 재료 종류: PP,PE,AS,PETG,ABS,AL
즉 비교 란에는 전체 재료 종류 중에서 사용된 적이 없는 것만 뽑아낸 것입니다.
그러니깐 엑셀 함수를 써서 빨간색으로 표시한 것을 추출해 내고 싶은데 어떤 함수를 써서
어떻게 해야 하는 지 모르겠습니다.
여기서 예를 든 자료는 몇 개 안되지만 제가 하려고 하는 자료는 무지 많거든요.
그러니깐 꼭꼭 알려주시면 무지 고맙겠습니다.
사용되지 않은 재료 구하기
핵심 요약: 사용되지 않은 항목 구하기
전체 항목을 배열에 담고 사용된 항목을 지운 뒤 남은 항목을 & 연산자로 이어 붙이면 사용되지 않은 항목만 얻을 수 있습니다.
- 1단계: 전체 재료명을 배열 변수에 하나씩 대입합니다.
- 2단계: 순환문으로 셀 값과 같은 배열 값을 빈 문자열로 바꿉니다.
- 3단계: 남은 값을 이어 붙이고 끝의 쉼표를 제거해 반환합니다.
Step 1: 사용자 정의 함수로 해결하기
이런 경우에는 엑셀 함수보다 VBA를 사용하면 쉽게 해결할 수 있습니다. 아래의 표에서 빨간 네모로 둘러싼 부분을 보세요.
| 스킨 | 로션 | 크림 | 에센스 | 비 교 (=MultiCompare(C,D,E,F)) | |
|---|---|---|---|---|---|
| A원료 | PP | PE | AS | PETG | ABS,AL |
| B원료 | PE | ABS | AL | PP,AS,PETG | |
| C원료 | AS | PETG | AL | PP,PE,ABS | |
| D원료 | PP,PE,AS,PETG,ABS,AL |
(D원료는 사용된 재료가 없으므로 전체 재료가 나옵니다.)
몇 줄 안되는 VBA 코드를 작성하면 이렇게 해결하실 수가 있습니다.
Step 2: MultiCompare 함수
Function MultiCompare(F1, F2, F3, F4) As String
'''네 개의 셀 값을 인수로 넘겨 받습니다.
Dim strName(0 To 5) As String
Dim strTemp As String
Dim strChar As String
Dim strResult As String
Dim blnOK As Boolean
Dim i As Integer
'''필요한 변수들을 선언합니다. 여기서 strName이라는 배열 변수(정적 배열변수)가 사용되었습니다.
'''이 배열 변수에 재료명을 하나씩 대입합니다.
strName(0) = "PP,"
strName(1) = "PE,"
strName(2) = "AS,"
strName(3) = "PETG,"
strName(4) = "ABS,"
strName(5) = "AL,"
For i = LBound(strName) To UBound(strName)
If F1 & "," = strName(i) Then strName(i) = ""
If F2 & "," = strName(i) Then strName(i) = ""
If F3 & "," = strName(i) Then strName(i) = ""
If F4 & "," = strName(i) Then strName(i) = ""
Next i
'''순환문을 돌면서 각 배열 변수에 저장된 값과 셀의 값을 하나씩 비교합니다. 만약 두 값이 같으면
'''배열 변수에 저장된 값을 NULL값으로 바꾸어 줍니다. 두 값이 같다는 것은 사용된 원료라는 얘기지요?
For i = LBound(strName) To UBound(strName)
strChar = strChar & strName(i)
Next i
'''그래서 사용되지 않은 값들만을 & 연산자를 사용하여 연결합니다.
strChar = Trim(strChar)
If Len(strChar) > 0 Then strChar = Left(strChar, Len(strChar) - 1)
MultiCompare = strChar
'''strChar 변수에 저장된 값을 문자열 함수를 이용하여 정리를 한 다음 결과값으로 되돌립니다.
'''이 부분은 왜 필요할까요? 잘 생각해 보세요. ^^
End Function
워크시트의 비교 칸에는 =MultiCompare(C28,D28,E28,F28)처럼 네 개의 셀을 인수로 넘겨 사용합니다.
마무리
언제나 그렇듯이, 아주 간단합니다. 많이 응용해 보시기를…
정리 — 미사용 항목 추출 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 인수 전달 | Function MultiCompare(F1, F2, F3, F4) | 네 개의 셀 값 입력 |
| 배열 선언 | Dim strName(0 To 5) As String | 전체 재료 저장 |
| 사용 항목 제거 | If F1 & "," = strName(i) Then strName(i) = "" | 사용된 재료 지움 |
| 문자열 연결 | strChar = strChar & strName(i) | 남은 재료 이어 붙임 |
| 정리 | Left(strChar, Len(strChar) - 1) | 끝의 쉼표 제거 |
자주 묻는 질문 (FAQ)
Q1. 전체 목록 중 사용되지 않은 항목만 뽑으려면 어떻게 하나요?
전체 항목을 배열에 담고 사용된 항목과 같은 값을 지운 다음 남은 값을 이어 붙이면 됩니다.
Q2. 사용된 항목이 하나도 없으면 어떻게 되나요?
전체 항목이 그대로 남아 모든 재료가 결과로 나오며, 남은 항목이 없을 때는 빈 문자열을 반환합니다.
Q3. 사용자 정의 함수는 워크시트에서 어떻게 쓰나요?
일반 함수처럼 =MultiCompare(C28,D28,E28,F28)와 같이 셀에 입력해 사용합니다.
마치며
배열과 순환문을 활용한 간단한 사용자 정의 함수로 엑셀 함수만으로는 까다로운 여집합 문제를 쉽게 해결할 수 있습니다.