41

500 行を超える数字の列があります。VBA を使用して、変数 X が列のいずれかの値と一致するかどうかを確認する必要があります。

誰か助けてくれませんか?

4

8 に答える 8

58

範囲の検索メソッドは、for ループを使用してすべてのセルを手動でループするよりも高速です。

これは、vba で find メソッドを使用する例です。

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
于 2012-09-28T15:37:49.933 に答える
38

最も簡単なのは使用することですMatch

If Not IsError(Application.Match(ValueToSearchFor, RangeToSearchIn, 0)) Then
    ' String is in range
于 2012-09-28T23:25:11.843 に答える
24

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かなり簡単です。

于 2012-09-28T14:52:54.703 に答える
0

@sdanse の関数で @JeffC が言及した問題を修正しました。

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
于 2021-05-27T14:11:05.117 に答える