任意の列に、行 1 から次の値があるとします。
1 A
2 A
3 A
4 A
5 B
6 B
7 B
8 A
9 A
10 A
start=5 が最初の B で、last=7 が最後の B であると言えるようにしたいのです。B がない場合は、最初と最後の両方で 0 が返されます。
VBA では、豊富な組み込みの Excel 関数に引き続きアクセスできることを忘れないでください。例 (データが列 1 にあると仮定):
最初の B を見つけ...
Columns(1).Find(What:="B", LookAt:=xlWhole, MatchCase:=False).Row 'Returns 5
最後の B を見つけ...
Columns(1).Find(What:="B", LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False).Row 'Returns 7
B が見つからない場合は、エラーが返されます。B が見つからない場合、エラー処理を使用して 0 を返すことで、これを利用できます。すべてを一緒に入れて...
Sub DoTest()
Dim RowFirst As Integer, _
RowLast As Integer
On Error GoTo ErrorHandler
RowFirst = Columns(1).Find(What:="B", LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False).Row
RowLast = Columns(1).Find(What:="B", LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False).Row
Exit Sub
ErrorHandler:
RowFirst = 0
RowLast = 0
End Sub
このようなものがあなたのために働くでしょうか、それとも2つの別々の機能が必要ですか?
Function findValues(place As String, val As String, rng As Range) As Integer
Dim r As Range
findValues = 0
For Each r In rng
If InStr(r.Value2, val) > 0 Then
findValues = r.Row
If LCase(place) = "first" Then
Exit For
End If
End If
Next
End Function
次のように使用します。
Dim rng As Range
Set rng = Range("B1:B10")
Dim i As Integer
i = findValues("first", "B", rng)
i = findValues("last", "B", rng)
チェックする必要がある範囲の大きさによっては、時間がかかる場合があります。
私は、いくつかのアプリケーションで Kevin Pope の方法を使用してきましたが、必要のないものが含まれている場合があることがわかりました。私の経験と解決策を共有したいと思いました。
最近、私は次のようなものがあることに気づきました:
Mouser EPM1270GT144I5
Mouser EPM1270GT144I5
Mouser GRM32DR71E106K
Mouser GRM32DR71E106K
TTI GRM32DR71E106KA12L
Avnet GS816273CC-250I
Avnet GS816273CC-250I
これを探していました:GRM32DR71E106K
検索していた 2 つと、同じ文字列で始まる 3 つ目が返されます。
EXACT マッチの検索に適応する必要がありました。修正は非常に簡単でした:
Public Function findValues(Val As String, Rng As Range, Optional place As Integer) As Integer
Dim R As Range
findValues = 0
For Each R In Rng
If StrComp(R.Value2, Val) = 0 Then
' If InStr(R.Value2, Val) > 0 Then
findValues = R.Row
If place = 1 Then
Exit For
End If
End If
Next
End Function
誰かがそれが役立つことを願っています。
ここに別の方法があります。
Sub FindFirstLast()
Dim vaValues As Variant
Dim vaFilter As Variant
Dim lFirst As Long
Dim lLast As Long
Const sFIND As String = "B"
With Application.WorksheetFunction
'Get a 1-d array from a column
vaValues = .Transpose(Sheet1.Range("A1:A10").Value)
'Use match to get the first instance
lFirst = .Match(sFIND, vaValues, False)
'Filter on the values
vaFilter = Filter(vaValues, sFIND)
'Assumes they're all together
lLast = lFirst + UBound(vaFilter)
End With
Debug.Print lFirst, lLast
End Sub