오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴

엑셀 데이터 필터링 함수 :: Filtered_DB 명령문

데이터가 입력된 배열(DB)를 조건에 따라 실시간으로 필터링하는 Filtered_DB의 사용법 및 동작원리를 살펴봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2022. 04. 20. 03:16
URL 복사
메모 남기기 : (33)

엑셀 데이터 필터링 함수 :: Filtered_DB 명령문 사용법 총정리

엑셀 Filtered_DB 명령문 목차 바로가기
요약

엑셀 Filtered_DB는 데이터가 입력된 배열(DB)를 실시간으로 필터링하는 사용자 지정 함수입니다.

명령문 구문
Array = Filtered_DB ( DB, 조건, [열번호], [일치옵션] )
사용된 인수 및 변수 알아보기
인수 설명
DB
[Variant]
필터링 할 데이터가 입력된 배열(DB) 입니다. Get_DB 함수를 사용하면 시트 안에 입력된 데이터를 배열로 받아올 수 있습니다.
조건
[Variant]
필터링 할 조건입니다. 연산자(>,<,=)와 와일드카드(*,?)를 사용할 수 있습니다.
열번호
[Long, 선택인수]
배열에서 필터링 할 열 번호입니다. 열번호가 빈칸일 경우 배열의 모든 값을 대상으로 필터링합니다. 기본값은 빈칸입니다.
일치옵션
[Boolean, 선택인수]
정확히 일치 여부입니다. TRUE일 경우 조건과 정확히 일치하는 경우만 필터링합니다. 기본값은 FALSE 입니다.
패치노트
  • 2021.07.21
    : 비어있는 DB를 입력할 경우, 오류 대신 비어있는 DB를 반환하도록 명령문 수정
  • 2021.08.19
    : 같지 않음 (<>) 조건으로도 필터링 할 수 있도록 명령문 개선

예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.


상세 설명

엑셀 Filtered_DB 함수는 데이터가 입력된 배열(DB)을 조건에 따라 필터링한 뒤, 필터링 된 결과를 배열로 반환하는 사용자 지정 함수입니다. Filtered_DB 함수는 다른 DB 관련 함수와 함께 여러 엑셀 프로그램을 제작할 때 매우 유용하게 사용할 수 있습니다.

Filtered_DB 함수는 데이터베이스 관련 VBA 함수 중 하나입니다. 더 다양한 DB 관련 함수는 아래 링크를 참고해주세요.

Filtered_DB 함수에 입력하는 조건은 1개만 입력가능하며 AND, OR 조건으로 동시에 필터링 할 수 없습니다. 만약 DB에 여러 조건을 적용하려면 Filtered_DB 함수를 여러번에 걸쳐 사용해야 하며, AND 조건으로만 필터링 할 수 있습니다.

함수의 마지막인수는 [정확히일치] 옵션이며 기본값은 유사일치입니다. 따라서 조건으로 "이"를 입력하면 DB에서 이를 포함하는 모든 값을 필터링합니다.

실전 사용 예제
  1. 직원정보 DB에서 나이가 20 이상인 직원 필터링
    '직원정보 : 직원ID | 직원명 | 부서 | 직급 | 나이
    Dim DB As Variant
    DB = Get_DB(ThisWorkbook.Worksheets("직원정보"))
    DB = Filtered_DB(DB, ">=20", 5)
    '직원정보DB에서 나이가 20 이상인 직원만 필터링됩니다.
  2. 직원정보 DB에서 성이 이씨이고 나이가 20 이상인 직원 필터링
    '직원정보 : 직원ID | 직원명 | 부서 | 직급 | 나이
    Dim DB As Variant
     
    DB = Get_DB(ThisWorkbook.Worksheets("직원정보"))
    DB = Filtered_DB(DB, "이*")
    DB = Filtered_DB(DB, ">=20", 5)
    '직원정보에서 성이 이씨이고 나이가 20 이상인 직원을 필터링합니다.

엑셀 데이터 필터링 함수, Filtered_DB 명령문 동작원리

Filtered_DB 명령문 전체 코드
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'수정 및 배포 시 출처를 반드시 명시해야 합니다.
 
'■ Filtered_DB 함수
'■ 서로 다른 두 시트를 연결합니다. FromWS의 첫번째 필드는 반드시 고유값(ID)이 입력되어야 합니다.
'■ 사용방법
'Array = Filtered_DB(Get_DB(Sheet1),">=200")
'■ 인수 설명
'_____________DB                  : 데이터를 필터링 할 원본 DB 입니다.
'_____________Value             : 필터링 할 조건입니다.
'_____________FilterCol         : [선택인수] 필터링 할 검색 열입니다. 빈칸일 경우 전체 열을 대상으로 필터링합니다.
'_____________ExactMatch   : [선택인수] 정확히 일치 여부입니다. 기본값은 False(=유사일치) 입니다.
'###############################################################
 
Function Filtered_DB(DB, Value, Optional FilterCol, Optional ExactMatch As Boolean = False) As Variant
 
Dim cRow As Long
Dim cCol As Long
Dim vArr As Variant: Dim s As String: Dim filterArr As Variant:  Dim Cols As Variant: Dim Col As Variant: Dim Colcnt As Long
Dim isDateVal As Boolean
Dim vReturn As Variant: Dim vResult As Variant
Dim Dict As Object: Dim dictKey As Variant
Dim i As Long: Dim j As Long
Dim Operator As String
 
'<-- 21.08.19 수정 : DB 비어있을 시, 오류 대신 비어있는 DB 반환 -->
If IsEmpty(DB) Then Filtered_DB = DB: Exit Function
 
Set Dict = CreateObject("Scripting.Dictionary")
 
If Value <> "" Then
    cRow = UBound(DB, 1)
    cCol = UBound(DB, 2)
    ReDim vArr(1 To cRow)
    For i = 1 To cRow
        s = ""
        For j = 1 To cCol
            s = s & DB(i, j) & "|^"
        Next
        vArr(i) = s
    Next
 
    If IsMissing(FilterCol) Then
        filterArr = vArr
    Else
        Cols = Split(FilterCol, ",")
        ReDim filterArr(1 To cRow)
        For i = 1 To cRow
            s = ""
            For Each Col In Cols
                s = s & DB(i, Trim(Col)) & "|^"
            Next
            filterArr(i) = s
        Next
    End If
 
    If Left(Value, 2) = ">=" Or Left(Value, 2) = "<=" Or Left(Value, 2) = "=>" Or Left(Value, 2) = "=<" Or Left(Value, 2) = "<>" Then
        Operator = Left(Value, 2)
        If IsDate(Right(Value, Len(Value) - 2)) Then isDateVal = True
    ElseIf Left(Value, 1) = ">" Or Left(Value, 1) = "<" Then
        Operator = Left(Value, 1)
        If IsDate(Right(Value, Len(Value) - 1)) Then isDateVal = True
    Else: End If
 
'<-- 21.08.19 수정 : 제외조건(<>)으로 필터링 가능하도록 수정 -->
    If Operator <> "" And Operator <> "<>" And Operator <> "=" Then
        If isDateVal = False Then
            Select Case Operator
                Case ">"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) > CDbl(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case "<"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) < CDbl(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case ">=", "=>"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) >= CDbl(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                 Case "<=", "=<"
                    For i = 1 To cRow
                        If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDbl(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
            End Select
        Else
            Select Case Operator
                Case ">"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) > CDate(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case "<"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) < CDate(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                Case ">=", "=>"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) >= CDate(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
                 Case "<=", "=<"
                    For i = 1 To cRow
                        If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDate(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                    Next
            End Select
        End If
    Else
        If ExactMatch = False Then
            If Operator = "<>" Then
                Value = Right(Value, Len(Value) - 2)
                For i = 1 To cRow
                     If Not filterArr(i) Like "*" & Value & "*" Then
                        vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                        vReturn = Split(vArr(i), "|^")
                        Dict.Add i, vReturn
                    End If
                Next
            Else
                For i = 1 To cRow
                    If filterArr(i) Like "*" & Value & "*" Then
                        vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                        vReturn = Split(vArr(i), "|^")
                        Dict.Add i, vReturn
                    End If
                Next
            End If
        Else
            If Operator = "<>" Then
            Value = Right(Value, Len(Value) - 2)
                For i = 1 To cRow
                    If Not filterArr(i) Like Value & "|^" Then
                        vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                        vReturn = Split(vArr(i), "|^")
                        Dict.Add i, vReturn
                    End If
                Next
            Else
                For i = 1 To cRow
                    If filterArr(i) = Value & "|^" Then
                        vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                        vReturn = Split(vArr(i), "|^")
                        Dict.Add i, vReturn
                    End If
                Next
            End If
        End If
    End If
 
    If Dict.Count > 0 Then
        ReDim vResult(1 To Dict.Count, 1 To cCol)
        i = 1
        For Each dictKey In Dict.Keys
            For j = 1 To cCol
                vResult(i, j) = Dict(dictKey)(j - 1)
            Next
            i = i + 1
        Next
    End If
 
    Filtered_DB = vResult
Else
    Filtered_DB = DB
End If
 
End Function
 
Function Get_DB(WS As Worksheet, Optional NoID As Boolean = False, Optional IncludeHeader As Boolean = False) As Variant
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'수정 및 배포 시 출처를 반드시 명시해야 합니다.
 
'■ Get_DB 함수
'■ 지정한 시트의 값을 배열로 반환합니다. 시트의 값은 반드시 A1셀에서 시작해야 합니다. 머릿글 우측으로 ID 값이 없을 경우 NoID를 TRUE로 사용합니다.
'■ 사용방법
'Array = Get_DB(ThisWorkBook.WorkSheets("시트명"), TRUE)
'▶ 인수 설명
'_____________WS                     : 배열로 변환할 시트 개체입니다.
'_____________NoID                  : 머릿글 우측에 신규 ID값이 없을 경우, TRUE로 사용합니다. 기본값은 FALSE 입니다.
'_____________IncludeHeader   : True일 경우 배열에 머릿글을 포함합니다. 기본값은 FALSE 입니다.
'###############################################################
 
Dim cRow As Long
Dim cCol As Long
Dim offCol As Long
 
If NoID = False Then offCol = -1
 
With WS
    cRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    cCol = .Cells(1, .Columns.Count).End(xlToLeft).Column + offCol
    Get_DB = .Range(.Cells(2 + Sgn(IncludeHeader), 1), .Cells(cRow, cCol))
End With
 
End Function
명령문 동작원리 단계별 알아보기
  1. 변수를 선언하고 Dictionary 개체를 설정합니다.
    Dim cRow As Long
    Dim cCol As Long
    Dim vArr As Variant: Dim s As String: Dim filterArr As Variant:  Dim Cols As Variant: Dim Col As Variant: Dim Colcnt As Long
    Dim isDateVal As Boolean
    Dim vReturn As Variant: Dim vResult As Variant
    Dim Dict As Object: Dim dictKey As Variant
    Dim i As Long: Dim j As Long
    Dim Operator As String
     
    Set Dict = CreateObject("Scripting.Dictionary")
  2. 결과값으로 반환 할 전체 배열(vArr)와 필터링 조건을 적용할 임시배열(filterArr)를 생성합니다.
    If Value <> "" Then
        cRow = UBound(DB, 1)
        cCol = UBound(DB, 2)
        ReDim vArr(1 To cRow)
        For i = 1 To cRow
            s = ""
            For j = 1 To cCol
                s = s & DB(i, j) & "|^"
            Next
            vArr(i) = s
        Next
     
        If IsMissing(FilterCol) Then
            filterArr = vArr
        Else
            Cols = Split(FilterCol, ",")
            ReDim filterArr(1 To cRow)
            For i = 1 To cRow
                s = ""
                For Each Col In Cols
                    s = s & DB(i, Trim(Col)) & "|^"
                Next
                filterArr(i) = s
            Next
        End If
  3. 조건으로 연산자(<,>,=)가 포함되어 있을 경우 명령문에 맞게 조건문을 변경합니다.
        If Left(Value, 2) = ">=" Or Left(Value, 2) = "<=" Or Left(Value, 2) = "=>" Or Left(Value, 2) = "=<" Then Operator = Left(Value, 2) If IsDate(Right(Value, Len(Value) - 2)) Then isDateVal = True ElseIf Left(Value, 1) = ">" Or Left(Value, 1) = "<" Then
            Operator = Left(Value, 1)
            If IsDate(Right(Value, Len(Value) - 1)) Then isDateVal = True
        Else: End If
  4. 입력한 조건에 따라 DB를 필터링합니다.
    If Operator <> "" Then
            If isDateVal = False Then
                Select Case Operator
                    Case ">"
                        For i = 1 To cRow
                            If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) > CDbl(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                        Next
                    Case "<"
                        For i = 1 To cRow
                            If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) < CDbl(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn Next Case ">=", "=>"
                        For i = 1 To cRow
                            If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) >= CDbl(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                        Next
                     Case "<=", "=<"
                        For i = 1 To cRow
                            If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDbl(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn Next End Select Else Select Case Operator Case ">"
                        For i = 1 To cRow
                            If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) > CDate(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                        Next
                    Case "<"
                        For i = 1 To cRow
                            If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) < CDate(Right(Value, Len(Value) - 1)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn Next Case ">=", "=>"
                        For i = 1 To cRow
                            If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) >= CDate(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                        Next
                     Case "<=", "=<"
                        For i = 1 To cRow
                            If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDate(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
                        Next
                End Select
            End If
        Else
            If ExactMatch = False Then
                For i = 1 To cRow
                    If filterArr(i) Like "*" & Value & "*" Then
                        vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                        vReturn = Split(vArr(i), "|^")
                        Dict.Add i, vReturn
                    End If
                Next
            Else
                For i = 1 To cRow
                    If filterArr(i) Like Value & "|^" Then
                        vArr(i) = Left(vArr(i), Len(vArr(i)) - 2)
                        vReturn = Split(vArr(i), "|^")
                        Dict.Add i, vReturn
                    End If
                Next
            End If
        End If
  5. 출력할 배열(vResult)을 생성하고 배열 안에 값을 입력 후 함수 결과값으로 배열을 반환한 뒤 명령문을 종료합니다.
        If Dict.Count > 0 Then
            ReDim vResult(1 To Dict.Count, 1 To cCol)
            i = 1
            For Each dictKey In Dict.Keys
                For j = 1 To cCol
                    vResult(i, j) = Dict(dictKey)(j - 1)
                Next
                i = i + 1
            Next
        End If
     
        Filtered_DB = vResult
    Else
        Filtered_DB = DB
    End If
댓글 33
5 (14개 평가)
zzztj****
zzztj**** 2022.03.01 23:03
질문 있습니다.
ExactMatch를 True로 했을때는
Value = Right(Value, Len(Value) - 2) 구문이 없어 조건을 인식하지 못하는거 같은데 맞나요??
오빠두엑셀
오빠두엑셀 작성자 2022.03.09 21:54
zzztj님 안녕하세요.
연산자가 있을 경우에는 대소비교를 하는 것이기 때문에, ExactMatch 여부 상관없이 사용할 수 있습니다.대소비교를 할 때에는, 정확히 일치/유사일치가 의미없기 때문입니다.^^
JC_
JC_ 2022.03.17 23:55
안녕하세요.
패치된 [ Filtered_DB 명령문 전체 코드] 를 적용하려고 하니까 사진처럼 빨간 부분이 생깁니다.
영상 보면서 공부 많이 하고 있습니다. 도움 주셔서 감사합니다.
이미지 2022-03-17 08 49 44
오빠두엑셀
오빠두엑셀 작성자 2022.03.21 20:51
안녕하세요.
홈페이지 글을 작성하는 과정에서 잠시 코드 줄바꿈에 문제가 있었습니다.
다시 수정해드렸으니 한번 확인해보시겠어요?
또는 예제파일에 적어드린 코드도 한번 확인해보세요.
감사합니다.
JC_
JC_ 2022.03.22 00:45
확인했습니다. 감사합니다.
라쿤
라쿤 2022.04.14 21:53
안녕하세요 오빠두엑셀님 질문 있습니다.
  • 2021.08.19
  • : 같지 않음 (<>) 조건으로도 필터링 할 수 있도록 명령문 개선
이 기능을 사용하고 싶은데 코드개선이 된게 맞을까요? 아무리 써봐도 안되서 코드도 한참 뜯어봤는데 어떻게 쓰는지 못찼겠어요 ㅠ
오빠두엑셀
오빠두엑셀 작성자 2022.04.15 02:36
안녕하세요.
예제파일에만 코드가 업데이트 되어 있습니다. 깜빡하고 홈페이지 코드는 수정을 못했네요.ㅡㅜ
방금 코드를 수정했으니 다시 확인해보시겠어요?:)
감사합니다.
라쿤
라쿤 2022.04.15 09:08
그저 한줄기 빛이십니다 ㅎㅎ 감사합니다!
라쿤
라쿤 2022.04.18 16:17
오빠두님 안녕하세요 지난번에 이어 같지 않음 (<>) 조건에 대한 질문이 있습니다.
filtered_db(X ,"<>" & 0 , X) 이런식으로 사용하였을때 0이 아닌값 즉 0보다 크거나 작은값이 필터링 될것이라고 생각했는데 0이 포함되지 않은값이 필터링이 됩니다.
예를들어 10이라는 값도 필터링이됩니다. 11은 필터링이 안되구요 전체 숫자중 0이 들어가면 필터링 되는것 같은데 이걸 의도하신걸까요..?
아직 코드를 제맘대로 수정할만한 실력이 안되서 질문드려봅니다 ㅠ
오빠두엑셀
오빠두엑셀 작성자 2022.04.18 18:52
안녕하세요.
4번째 일치옵션 인수를 TRUE로 사용해보세요.
라쿤
라쿤 2022.04.18 20:16
답변 감사합니다!
음 말씀하신대로 4번째 인수 true로 하니까 오히려 필터링이 하나도 안되고 0이나 10도 필터링이 안되네요 ㅠ 모든값이 다 나오는거 같아요. 제가 잘못 하고 있는걸까요?
오빠두엑셀
오빠두엑셀 작성자 2022.04.20 03:18
안녕하세요.
명령문에 코드가 한 줄 빠져있었습니다.
수정된 코드를 다시 사용해보시겠어요?^^
감사합니다.
라쿤
라쿤 2022.04.20 11:09
오빠두님 감사합니다! 해결되었습니다. 친절하게 알려주셔서 정말 큰 도움이 되고 있습니다! 이번에 진짜쓰는실무엑셀 교재 구입했는데 잘 보겠습니다ㅎㅎ
ta****
ta**** 2022.04.26 13:39
filter_db실행 후 리스트 박스에 추가 시(update_list 사용) 리스트박스에 머리글이 표현되게 해주실수 있나요?ㅜ.ㅜ
오빠두엑셀
오빠두엑셀 작성자 2022.04.28 17:33
안녕하세요.
update_list 함수는 추후 기회가 될 때 머릿글을 포함할 수 있도록 수정해보겠습니다^^
좋은 의견 제공해주셔서 감사드립니다.
NJH
NJH 2022.06.16 15:41
엑셀 data의 SQL DB 변환 강의를 보고 무작정 따라하고 있습니다.
Filter_DB 매크로 기입 후 예제와 같이 DB 출력하고자 하는데, 사진의 노란색 디버그 오류로 인해 Filtered_DB가 제대로 작동하고 있지 않습니다.
해당 문장이 오류:13 - 형식이 일치하지 않습니다. 의 오류로 작동하지 않는데, 어떤 점이 문제인지 질문 드립니다.
Filtered DB_3
오빠두엑셀
오빠두엑셀 작성자 2022.06.23 15:37
안녕하세요.
우선 i와 j가 각각 몇인지 확인해보시고, s 값이 어떻게 설정되는지 한번 디버깅해보세요.
디버깅에 내용은 아래 게시글에서 자세히 안내하였으니 함께 확인해보시면 많은 도움이 되실겁니다.
https://www.oppadu.com/엑셀-vba-디버깅/
감사합니다.
Hellohoney
Hellohoney 2022.07.19 09:28
안녕하세요. 7번째열(G열)에 금액이 들어가있고..
셀서식은 통화로 돼있어서 $200.00이런식으로 셀에 표시가됩니다.
어떤행은 금액이 없고 어떤행은 금액값이 있습니다.
이 시트에서 금액이 들어가있는 행들만 필터해서 보고싶은데
DB = Filtered_DB(DB, ">="&0, 7) 이렇게 입력하니 구문오류라고 뜨고,
스페이스를 넣어서 DB = Filtered_DB(DB, ">="&0, 7) 이렇게 입력하면 '13' 런타임오류라고 뜹니다. ㅠㅠ
뭐가 문제인가요? [0보다크다] 말고 [값이 있다]를 조건으로 넣을수도 있나요?
오빠두엑셀
오빠두엑셀 작성자 2022.07.26 00:09
안녕하세요.
디버깅오류는 적어주신 내용만으로는 확인이 어렵고, 아마 통화서식이여서 숫자가아닌 문자로 인식되어 오류가 발생하는 것으로 보입니다.
값이 있다 조건으로 보시려면,
DB = Filtered_DB(DB, "<>", 7)
이렇게 한번 사용해보시겠어요?
감사합니다.
HJ
HJ 2022.07.29 12:26
안녕하세요 질문이 있습니다.
Arr = Filtered_DB(Arr, "<=" & Sheet3.Range("k2"), 5, True)
이렇게 입력할 경우

13런타임 오류가 발생하면서 디버그시

Case "<=", "=<"
          For i = 1 To cRow
            If CDate(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDate(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
          Next
이부분에 노란표시가 나옵니다 어떻게 해결할 수 있을까요?
HJ
HJ 2022.07.29 13:27
댓글 수정이 안되어서 추가 질문드립니다.
필터하고자 하는 값은 날짜형식으로되어있어서 서식을 일반,숫자 로 바꾸어보았더니 이번엔 아래 문구에 노란색이 표기되어요

Case "<=", "=<"
          For i = 1 To cRow
            If CDbl(Left(filterArr(i), Len(filterArr(i)) - 2)) <= CDbl(Right(Value, Len(Value) - 2)) Then: vArr(i) = Left(vArr(i), Len(vArr(i)) - 2): vReturn = Split(vArr(i), "|^"): Dict.Add i, vReturn
          Next
오빠두엑셀
오빠두엑셀 작성자 2022.07.29 15:52
안녕하세요. 적어주신 내용만으로는 원인 파악이 어렵습니다.
https://www.oppadu.com/엑셀-vba-디버깅/
위 링크를 참고하셔서, value로 어떤 값이 들어갔을 때 오류가 발생하는지 한번 확인해보시겠어요?^^
감사합니다.
HJ
HJ 2022.07.29 16:02
조건에 ">","<","=>","=<" 등의 연산자만 들어가면 런타임에러가 발행합니다. 예제파일을 예를 들면 연봉이 3400 이상인 경우를 검색하려고 h7 셀에 연산자를 넣으면 여지없이 에러가 발생합니다. 2자리인경우만그런가 해서 >3400 이라고 넣어도 그렇고 코드안에서 직접 "<=3400" 을 입력해도 동일합니다.
그러나 <> 연산자는 인식이 잘되어서요..
열번호를 안넣어서 그런가해서 열번호를 넣으면 s = s & DB(i, Trim(Col)) & "|^" 의 아래첨자가 잘못되었다는 오류가 발생합니다.
혹시나 해서 2010버전,2013버전 엑셀 전부 이용해봤고 저 디버깅 오류페이지도 계속 보고 있는데 뭣이 문제인지 잘 모르겠어서요..
재고관리완성파일에서 filterd_db함수만 끌어다 붙여도 봤는데 동일에러가 나와서 여쭈어봅니다.
HJ
HJ 2022.07.29 16:56
아! 찾았습니다. get_db로 받아올때 ID가 없어 true값을 넣어주니 되네요 감사합니다.
Steve. J
Steve. J 2022.10.31 15:06
안녕하세요. 선생님!
첨부해주신 첨부파일을 조금 변경해보았는데요. 하나가 아닌
두 개의 조건으로 하려하는데
아래 부분이 잘못됬다고 뜨는데 어떻게 해야하나요?
        s = s & DB(i, Trim(Col)) & "|^"
Dim WB As Workbook


Set WB = ThisWorkbook


Sheet1.Range("A:E").ClearContents


DB = Get_DB(WB.Worksheets(Sheet1.Range("H6").Value))
DB = Filtered_DB(DB, Sheet1.Range("H7").Value)
DB = Filtered_DB(DB, ">=3000", 5)


Sheet1.Range("A1").Resize(UBound(DB), UBound(DB, 2)).Value = DB


End Sub
오빠두엑셀
오빠두엑셀 작성자 2022.11.01 16:26
안녕하세요!^^
코드를 직접 수정하신 경우 중단점을 잡고 직접 디버깅해보시면 좋을 것 같습니다.
오류가 발생한 부분에 F9 키를 눌러 중단점 설정 후,
직접실행창과 지역창으로 각 변수가 잘 반환되는지 한번 확인해보세요.
https://www.oppadu.com/%ec%97%91%ec%85%80-vba-%eb%94%94%eb%b2%84%ea%b9%85/
디버깅 방법은 위 링크를 한번 참고해보시겠어요?
감사합니다.