배열 에 어떤 값 이 포함 되 어 있 는 지 여 부 를 어떻게 빨리 판단 합 니까?
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 함 수 는 배열 에서 찾 을 수 있 지만 다음 과 같은 제한 이 있 습 니 다.
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
함 수 를 사용 하여 실현 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PHP 배열에서 요소의 값이 최대 값인 키 이름을 가져옵니다.Qiita 에 " "@ PHP 매뉴얼 데이터 최대값이 나타나는 순서대로 획득 결과 키를 정렬한 후 가져오기 결과 @ paiza.IO PHP v5.6.40, v7.1.33, v7.4.4 " "@ StackOverflo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.