Excel VBA:返回列中第一次出现的单词? 最后?

假设我有一个任意的列,从第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,那么第一个和最后一个都是。

这样的事情会为你工作还是你需要两个独立的function?

 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) 

取决于你需要检查的范围有多大,这可能需要一段时间。

不要忘记,在VBA中,您仍然可以使用丰富的内置Excel函数。 示例(假设您的数据在第1列中):

find第一个B …
Columns(1).Find(What:="B", LookAt:=xlWhole, MatchCase:=False).Row 'Returns 5

find最后一个B …
Columns(1).Find(What:="B", LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False).Row 'Returns 7

如果没有findB,则返回错误。 如果找不到B,我们可以利用error handling返回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 

这是另一种方式。

 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 

我已经在一些应用程序中使用了Kevin Pope的方法,但是发现它有时候会包含我不想要的东西。 以为我会分享我的经验和解决scheme。

最近我意识到,如果我有这样的事情:

 Mouser EPM1270GT144I5 Mouser EPM1270GT144I5 Mouser GRM32DR71E106K Mouser GRM32DR71E106K TTI GRM32DR71E106KA12L Avnet GS816273CC-250I Avnet GS816273CC-250I 

并正在寻找这个:GRM32DR71E106K

它会返回我正在search的两个和第三个以相同的string开始。

我需要适应search精确匹配。 修复很简单:

  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 

我希望有人认为有用。