4

任意の列に、行 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 が返されます。

4

4 に答える 4

17

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
于 2014-10-01T08:24:56.407 に答える
3

このようなものがあなたのために働くでしょうか、それとも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)

チェックする必要がある範囲の大きさによっては、時間がかかる場合があります。

于 2012-12-07T19:25:34.900 に答える
1

私は、いくつかのアプリケーションで 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

誰かがそれが役立つことを願っています。

于 2013-05-06T17:16:48.177 に答える
1

ここに別の方法があります。

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
于 2012-12-07T21:44:32.667 に答える