Excel VBA를 사용하여 값이 배열에 있는지 확인합니다.
아래 코드는 값이 배열에 있는지 여부를 확인하는 것입니다.
Sub test()
vars1 = Array("Examples")
vars2 = Array("Example")
If IsInArray(Range("A1").Value, vars1) Then
x = 1
End If
If IsInArray(Range("A1").Value, vars2) Then
x = 1
End If
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
셀이A1
라는 단어가 포함되어 있습니다.Examples
어떤 이유에서인지 두 사람 모두IsInArray
두 어레이 모두에 대해 존재하는 것으로 인식되는 경우vars1
배열
이 기능을 사용하려면 무엇을 변경해야 합니까?IsInArray
정확히 일치시킬 수 있을까요?
다음과 같이 강제할 수 있습니다.
Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
Dim i
For i = LBound(arr) To UBound(arr)
If arr(i) = stringToBeFound Then
IsInArray = True
Exit Function
End If
Next i
IsInArray = False
End Function
사용법
IsInArray("example", Array("example", "someother text", "more things", "and another"))
이 질문은 여기서 했습니다.VBA 어레이 - 엄밀한 (개략이 아닌) 일치를 확인합니다.
Sub test()
vars1 = Array("Examples")
vars2 = Array("Example")
If IsInArray(Range("A1").value, vars1) Then
x = 1
End If
If IsInArray(Range("A1").value, vars2) Then
x = 1
End If
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function
저는 바로 이 질문을 찾아봤고, 그 답을 보았을 때, 대부분의 경우에서 효과가 있을 만한 뭔가 다른 것을 만들어 냈습니다(대부분의 경우보다 코드를 덜 선호하기 때문입니다.기본적으로 배열을 딜리미터 문자로 구분된 배열 요소를 포함하는 문자열로 변환한 다음 검색 값을 딜리미터 문자로 랩하고 instr을 통과합니다.
Function is_in_array(value As String, test_array) As Boolean
If Not (IsArray(test_array)) Then Exit Function
If InStr(1, "'" & Join(test_array, "'") & "'", "'" & value & "'") > 0 _
Then is_in_array = True
End Function
그리고 다음과 같은 기능을 수행합니다.
test = is_in_array(1, array(1, 2, 3))
값이 배열에 존재하는지 여부를 확인하려면 Excel VBA의 Match() 함수를 사용합니다.
Sub test()
Dim x As Long
vars1 = Array("Abc", "Xyz", "Examples")
vars2 = Array("Def", "IJK", "MNO")
If IsNumeric(Application.Match(Range("A1").Value, vars1, 0)) Then
x = 1
ElseIf IsNumeric(Application.Match(Range("A1").Value, vars2, 0)) Then
x = 1
End If
MsgBox x
End Sub
다음 함수는 일치하지 않으면 '0'을 반환하고 일치하는 경우 '양의 정수'를 반환합니다.
Function IsInArray(stringToBeFound As String, arr As Variant) As Integer
IsInArray = InStr(Join(arr, ""), stringToBeFound)
End Function
주의: 이 함수는 먼저 'Join'을 사용하여 어레이 콘텐츠 전체를 문자열에 연결한 후(Join 메서드가 내부적으로 루프를 사용하는지 여부를 알 수 없음) 다음 다음 명령을 사용하여 이 문자열 내에서 일치 여부를 확인합니다.InStr
.
퍼포먼스와 파워를 겸비해야 할 또 다른 변종을 제공하고 싶습니다.
- somethodly slow는 사용하지 않습니다).
- 는 , 등을 서포트하고 있습니다(- 만이 아닙니다).
- 검색 대상 항목의 인덱스를 반환합니다.
- n번째 오카렌즈
...
'-1 if not found
'https://stackoverflow.com/a/56327647/1915920
Public Function IsInArray( _
item As Variant, _
arr As Variant, _
Optional nthOccurrence As Long = 1 _
) As Long
IsInArray = -1
Dim i As Long: For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) = item Then
If nthOccurrence > 1 Then
nthOccurrence = nthOccurrence - 1
GoTo continue
End If
IsInArray = i
Exit Function
End If
continue:
Next i
End Function
다음과 같이 사용합니다.
Sub testInt()
Debug.Print IsInArray(2, Array(1, 2, 3)) '=> 1
End Sub
Sub testString1()
Debug.Print IsInArray("b", Array("a", "b", "c", "a")) '=> 1
End Sub
Sub testString2()
Debug.Print IsInArray("b", Array("a", "b", "c", "b"), 2) '=> 3
End Sub
Sub testBool1()
Debug.Print IsInArray(False, Array(True, False, True)) '=> 1
End Sub
Sub testBool2()
Debug.Print IsInArray(True, Array(True, False, True), 2) '=> 2
End Sub
기본적으로는 @Brad의 답변일 뿐이지만, 찾고 있는 아이템의 인덱스가 어레이에 있는 경우 반환되는 약간 수정된 함수를 포함시키는 것이 좋다고 생각했습니다.항목이 배열에 없으면 반환됩니다.-1
대신.
이 출력은 "in string" 함수와 마찬가지로 확인할 수 있습니다.If InStr(...) > 0 Then
그래서 그 아래에 작은 테스트 기능을 예시로 만들었습니다.
Option Explicit
Public Function IsInArrayIndex(stringToFind As String, arr As Variant) As Long
IsInArrayIndex = -1
Dim i As Long
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) = stringToFind Then
IsInArrayIndex = i
Exit Function
End If
Next i
End Function
Sub test()
Dim fruitArray As Variant
fruitArray = Array("orange", "apple", "banana", "berry")
Dim result As Long
result = IsInArrayIndex("apple", fruitArray)
If result >= 0 Then
Debug.Print chr(34) & fruitArray(result) & chr(34) & " exists in array at index " & result
Else
Debug.Print "does not exist in array"
End If
End Sub
그리고 2차원 어레이에 대해 1개씩 분할했습니다.범위에 따라 어레이를 생성하면 보통 이 형태로 되어 있기 때문입니다.
입력으로 사용되는 배열의 두 인덱스(값이 발견되었다고 가정)인 두 개의 값만 있는 단일 차원 변형 배열을 반환합니다. 수 없는 이은 returns을음 음음음 음음음 음음음 of 음 of of of of of 을 반환합니다.(-1, -1)
.
Option Explicit
Public Function IsInArray2DIndex(stringToFind As String, arr As Variant) As Variant
IsInArray2DIndex= Array(-1, -1)
Dim i As Long
Dim j As Long
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
If arr(i, j) = stringToFind Then
IsInArray2DIndex= Array(i, j)
Exit Function
End If
Next j
Next i
End Function
테스트용으로 설정한 데이터 그림과 테스트를 다음에 수행합니다.
Sub test2()
Dim fruitArray2D As Variant
fruitArray2D = sheets("Sheet1").Range("A1:B2").value
Dim result As Variant
result = IsInArray2DIndex("apple", fruitArray2D)
If result(0) >= 0 And result(1) >= 0 Then
Debug.Print chr(34) & fruitArray2D(result(0), result(1)) & chr(34) & " exists in array at row: " & result(0) & ", col: " & result(1)
Else
Debug.Print "does not exist in array"
End If
End Sub
범위("A1")에 예제가 있는지 확인하려고 합니다.Value 실패 시 Example 체크하지 않으시겠습니까?마이코드가 완벽하게 작동할 것 같아요.확인해주세요.
Sub test()
Dim string1 As String, string2 As String
string1 = "Examples"
string2 = "Example"
If InStr(1, Range("A1").Value, string1) > 0 Then
x = 1
ElseIf InStr(1, Range("A1").Value, string2) > 0 Then
x = 2
End If
종료 서브
언급URL : https://stackoverflow.com/questions/38267950/check-if-a-value-is-in-an-array-or-not-with-excel-vba
'programing' 카테고리의 다른 글
git은 변경된 변경만 추가하고 추적되지 않은 파일은 무시합니다. (0) | 2023.04.11 |
---|---|
HTML Anchor를 'name'으로 만들어야 하나요, 아니면 'id'로 만들어야 합니까? (0) | 2023.04.11 |
WSL(Bash on Windows) 루트 파일 시스템을 다른 하드 드라이브로 이동하시겠습니까? (0) | 2023.04.11 |
Swift - 문자열을 이중으로 변환하는 방법 (0) | 2023.04.11 |
ValueError: NA/NaN 값을 포함하는 벡터로 인덱싱할 수 없습니다. (0) | 2023.04.11 |