programing

Excel VBA를 사용하여 값이 배열에 있는지 확인합니다.

linuxpc 2023. 4. 11. 21:45
반응형

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

테스트용으로 설정한 데이터 그림과 테스트를 다음에 수행합니다.

테스트 2

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

반응형