表中有一列显示工厂名称,但我只需要特定工厂名称的数据(假设工厂“澳大利亚”)。
我的想法是找到匹配的第一行和最后一行,因为同一工厂的数据总是以连续的方式呈现。这样,我可以获得与我的搜索相匹配的单元格范围。
找到第一个匹配的行位置非常容易,但我在获取最后一个匹配的行位置时遇到了困难。
这是关于这部分的代码:
Sub Search()
Dim sh As Worksheet
Dim searchStr As String
Dim lastRow As Long, firstRow as Long
Dim tableRange As range
Set sh = Worksheets("Total order")
searchStr = "Australia"
Set tableRange = sh.range("B:B").Find(what:=searchStr, LookIn:=xlValues, lookat:=xlWhole)
firstRow = tableRange.Row
End Sub
处理的表格示例:
最佳答案
引用某列中字符串第一次出现的单元格到最后一次出现的单元格的范围
旁注
Range.Find method
有点棘手。例如,您可能没有意识到在您的代码中搜索是从单元格B2
开始的(在这种情况下更可取),并且使用xlValues
可能会导致不希望的结果如果行被隐藏(可能不重要)。
用法
使用该函数,根据屏幕截图,您可以(在
searchStr = "Australia"
之后)使用:Set tableRange = refRangeFirstLast(sh.Columns("B"), searchStr)
引用范围
B4:B7
,或使用:Set tableRange = refRangeFirstLast(sh.Columns("B"), searchStr).Offset(, -1).Resize(, 4)
引用范围
A4:D7
。
代码
Function refRangeFirstLast( _
ByVal ColumnRange As Range, _
ByVal SearchString As String) _
As Range
If Not ColumnRange Is Nothing Then
With ColumnRange
Dim FirstCell As Range: Set FirstCell = _
.Find(SearchString, .Cells(.Cells.Count), xlFormulas, xlWhole)
If Not FirstCell Is Nothing Then
Dim LastCell As Range: Set LastCell = _
.Find(SearchString, , xlFormulas, xlWhole, , xlPrevious)
Set refRangeFirstLast = .Worksheet.Range(FirstCell, LastCell)
End If
End With
End If
End Function
Sub refRangeFirstLastTEST()
Const SearchString As String = "Australia"
Dim ColumnRange As Range
Set ColumnRange = ThisWorkbook.Worksheets("Total order").Columns("B")
Dim rg As Range: Set rg = refRangeFirstLast(ColumnRange, SearchString)
If Not rg Is Nothing Then
Debug.Print rg.Address
Else
MsgBox "The reference could not be created.", vbExclamation, "Fail?"
End If
End Sub
关于excel - 如何找到使用 VBA 匹配的范围内的最后一行单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66407077/