programing

VBA 열에 값이 있는지 확인합니다.

closeapi 2023. 5. 16. 22:40
반응형

VBA 열에 값이 있는지 확인합니다.

저는 500줄이 넘는 숫자의 열을 가지고 있습니다.변수 X가 열의 값과 일치하는지 확인하기 위해 VBA를 사용해야 합니다.

누가 저 좀 도와주실 수 있나요?

범위의 찾기 방법은 for 루프를 사용하여 모든 셀을 수동으로 순환하는 것보다 빠릅니다.

다음은 vba에서 찾기 방법을 사용하는 예입니다.

Sub Find_First()
Dim FindString As String
Dim Rng As Range
FindString = InputBox("Enter a Search value")
If Trim(FindString) <> "" Then
    With Sheets("Sheet1").Range("A:A") 'searches all of column A
        Set Rng = .Find(What:=FindString, _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False)
        If Not Rng Is Nothing Then
            Application.Goto Rng, True 'value found
        Else
            MsgBox "Nothing found" 'value not found
        End If
    End With
End If
End Sub

가장 단순한 사용 방법Match

If Not IsError(Application.Match(ValueToSearchFor, RangeToSearchIn, 0)) Then
    ' String is in range

VBA 없이 작업을 수행하려면 다음과 같은 조합을 사용할 수 있습니다.IF,ISERROR,그리고.MATCH.

따라서 모든 값이 열 A에 있으면 열 B에 다음 공식을 입력합니다.

=IF(ISERROR(MATCH(12345,A:A,0)),"Not Found","Value found on row " & MATCH(12345,A:A,0))

그러면 값 "12345"(셀 참조일 수도 있음)가 검색됩니다.값을 찾을 수 없으면,MATCH"#N/A"를 반환하고ISERROR그것을 잡으려고 노력합니다.

VBA를 사용하려면 FOR 루프를 사용하는 것이 가장 빠릅니다.

Sub FindMatchingValue()
    Dim i as Integer, intValueToFind as integer
    intValueToFind = 12345
    For i = 1 to 500    ' Revise the 500 to include all of your values
        If Cells(i,1).Value = intValueToFind then 
            MsgBox("Found value on row " & i)
            Exit Sub
        End If
    Next i

    ' This MsgBox will only show if the loop completes with no success
    MsgBox("Value not found in the range!")  
End Sub

VBA에서 워크시트 함수를 사용할 수 있지만 워크시트 함수는 까다롭고 때로는 무의미한 오류를 발생시킵니다.FOR루프는 꽤 완벽합니다.

사용해 보십시오.

If Application.WorksheetFunction.CountIf(RangeToSearchIn, ValueToSearchFor) = 0 Then
Debug.Print "none"
End If

스콧의 답변을 함수로 수정하기 위해:

Function FindFirstInRange(FindString As String, RngIn As Range, Optional UseCase As Boolean = True, Optional UseWhole As Boolean = True) As Variant

    Dim LookAtWhat As Integer

    If UseWhole Then LookAtWhat = xlWhole Else LookAtWhat = xlPart

    With RngIn
        Set FindFirstInRange = .Find(What:=FindString, _
                                     After:=.Cells(.Cells.Count), _
                                     LookIn:=xlValues, _
                                     LookAt:=LookAtWhat, _
                                     SearchOrder:=xlByRows, _
                                     SearchDirection:=xlNext, _
                                     MatchCase:=UseCase)

        If FindFirstInRange Is Nothing Then FindFirstInRange = False

    End With

End Function

값을 찾을 수 없으면 FALSE를 반환하고, 값이 발견되면 범위를 반환합니다.

선택적으로 대소문자를 구분하거나 부분 단어 일치를 허용하도록 지정할 수 있습니다.

당신이 원한다면 그것을 미리 추가할 수 있기 때문에 제가 트림을 뺐습니다.

예:

MsgBox FindFirstInRange(StringToFind, Range("2:2"), TRUE, FALSE).Address

그러면 두 번째 행에서 대소문자를 구분하는 부분 단어 검색이 수행되고 주소가 있는 상자가 표시됩니다.다음은 동일한 검색이지만 대소문자를 구분하지 않는 전체 단어 검색입니다.

MsgBox FindFirstInRange(StringToFind, Range("2:2")).Address

이 기능을 원하는 대로 쉽게 조정하거나 변형에서 부울 또는 기타로 변경하여 속도를 조금 높일 수 있습니다.

VBA의 찾기는 때때로 브루트 포스 루프 또는 매치와 같은 다른 방법보다 느리기 때문에 VBA가 기본이라고 해서 가장 빠르다고 가정하지 마십시오.더 복잡하고 유연하기 때문에 항상 효율적이지는 않습니다.그리고 "Object variable or with block variable not set" 오류와 같이 주의해야 할 몇 가지 재미있는 특이점이 있습니다.

@JeffC가 @sdanse의 함수에서 언급한 문제 해결:

Function FindFirstInRange(FindString As String, RngIn As Range, Optional UseCase As Boolean = True, Optional UseWhole As Boolean = True) As Variant

    Dim LookAtWhat As Integer

    If UseWhole Then LookAtWhat = xlWhole Else LookAtWhat = xlPart

    With RngIn
        Set FindFirstInRange = .Find(What:=FindString, _
                                     After:=.Cells(.Cells.Count), _
                                     LookIn:=xlValues, _
                                     LookAt:=LookAtWhat, _
                                     SearchOrder:=xlByRows, _
                                     SearchDirection:=xlNext, _
                                     MatchCase:=UseCase)
        
        If FindFirstInRange Is Nothing Then
            FindFirstInRange = False
            Exit Function
        End If
        
        If IsEmpty(FindFirstInRange) Then
            FindFirstInRange = False
        Else
            FindFirstInRange = True
        End If
            
    End With

End Function

워크시트 함수 추가 시도:

If Not IsError(Application.WorksheetFunction.Match(ValueToSearchFor, RangeToSearchIn, 0)) Then
' String is in range
=IF(COUNTIF($C$2:$C$500,A2)>0,"Exist","Not Exists")

언급URL : https://stackoverflow.com/questions/12642164/check-if-value-exists-in-column-in-vba

반응형