배열 에 어떤 값 이 포함 되 어 있 는 지 여 부 를 어떻게 빨리 판단 합 니까?

8556 단어 배열VBA
다 차원 배열 은 자주 사용 하 는 데이터 구조 로 배열 에 특정한 요 소 를 포함 하 는 지 판단 하 는 일반적인 방법 은 바로 변수 전체 배열 이 고 하나씩 비교 하 는 것 이다.사용자 정의 함 수 는 다음 과 같 습 니 다.
Function ItemInArrayLoop(aData, vEle) As Boolean
    ItemInArrayLoop = False
    For i = 1 To ubund(aData, 1)
        For j = 1 To UBound(aData, 2)
            If aData(i, j) = vItem Then
                ItemInArrayLoop = True
                Exit Function
            End If
        Next j
    Next i
End Function

함수 반환 값 은 불 형식 입 니 다.간단 한 테스트 코드:
Sub DEMO_LOOP()
    Dim a(1 To 10, 1 To 10), b(1 To 10, 1 To 10), i, j
    For i = 1 To 10
        For j = 1 To 10
            a(i, j) = i + j
            b(i, j) = CStr(i + j)
        Next
    Next
    Debug.Print ItemInArrayLoop(a(), 10) ' True
    Debug.Print ItemInArrayLoop(a(), 20) ' False,   20
    Debug.Print ItemInArrayLoop(a(), "10")   ' False,        
    Debug.Print ItemInArrayLoop(b(), "10")   ' True
End Sub

배열 요소 가 비교적 많 거나 차원 이 비교적 많 을 때 순환 판단 효율 이 비교적 낮다.VBA 의 솔 루 션 인 만큼 워 크 시트 를 활용 할 지 효율 성 을 높 일 지 고민 할 수 있 을 것 이다.워 크 시트 함수 MATCH 는 배열 에 어떤 값 이 포함 되 어 있 는 지 신속하게 판단 하지만 1 차원 배열 만 지원 합 니 다. 다행히도 워 크 시트 함수 INDEX 는 배열 의 절편 을 실현 할 수 있 습 니 다. 즉, 다 차원 배열 의 일부분 은 1 차원 배열 로 전환 할 수 있 습 니 다.
Function ItemInArray(aData, vEle) As Boolean
    ItemInArray = False
    If VBA.IsArray(aData) Then
        For i = LBound(aData, 2) To UBound(aData, 2)
            ItemInArray = Not (IsError(Application.Match(vEle, Application.Index(aData, , i), 0)))
            If ItemInArray Then Exit Function
        Next i
    End If
End Function

테스트 코드 는 다음 과 같 습 니 다. 결 과 는 순환 판단 과 완전히 같 습 니 다.
Sub DEMO()
    Dim a(1 To 10, 1 To 10), b(1 To 10, 1 To 10), i, j
    For i = 1 To 10
        For j = 1 To 10
            a(i, j) = i + j
            b(i, j) = CStr(i + j)
        Next
    Next
    Debug.Print ItemInArray(a(), 10) ' True
    Debug.Print ItemInArray(a(), 20) ' False,   20
    Debug.Print ItemInArray(a(), "10")   ' False,        
    Debug.Print ItemInArray(b(), "10")   ' True
End Sub

VBA 의 Fitler 함 수 는 배열 에서 찾 을 수 있 지만 다음 과 같은 제한 이 있 습 니 다.
  • String 배열 이 어야 합 니 다
  • 정확 한 검색 을 실현 할 수 없습니다. 예 를 들 어 아래 코드 에 있 는 배열 a () 는 1 에서 10 을 포함 하고 Filter 로 '1' 을 찾 습 니 다. 돌아 온 결 과 는 두 가지 요소 이 고 배열 요소 '10' 도 결과 배열 에 있 기 때문에 ItemInArray 중의 MATCH 은 간단하게 Filter 로 대체 할 수 없습니다.
  • Sub DEMO_FILTER()
        Dim a(1 To 10) As String, i, aRes
        For i = 1 To 10
            a(i) = i
        Next
        aRes = VBA.Filter(a(), "1")
        Debug.Print Join(aRes, ",")
    End Sub

    문자열 배열 에 대해 배열 요소 가 규범 화 된 데이터 라면 사용 INSTR 판단 이 더욱 간결 합 니 다.
    Sub DEMO()
        aKey = Array("R01", "R02", "R03")
        ' option 1
        sKeyList = Join(aKey, "|")
        Debug.Print InStr(1, sKeyList, "R01", vbTextCompare) > 0
        Debug.Print InStr(1, sKeyList, "R11", vbTextCompare) > 0
        ' option 2
        Debug.Print UBound(VBA.Filter(aKey, "R01", , vbTextCompare)) = 0
        Debug.Print UBound(VBA.Filter(aKey, "R11", , vbTextCompare)) = 0 '     ,Ubound      -1
    End Sub

    먼저 JOIN 함수 로 배열 을 문자열 로 연결 하고 데이터 요 소 는 '|' 을 구분자 로 한 다음 INSTR 을 사용 하여 찾 은 문자 가 이 문자열 에 포함 되 어 있 는 지 판단 합 니 다.이 응용 장면 에서 도 FILTER 함 수 를 사용 하여 실현 할 수 있다.

    좋은 웹페이지 즐겨찾기