500 行を超える数字の列があります。VBA を使用して、変数 X が列のいずれかの値と一致するかどうかを確認する必要があります。
誰か助けてくれませんか?
範囲の検索メソッドは、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
最も簡単なのは使用することです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
かなり簡単です。
@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