我的工作表在A列中包含动态行数。 我想从第一次满足条件到最后一次选择动态行数。
在A栏中,我的名字只出现在块中。例如,从A1到A10“Alfred”,从A11到A13“Flo”,从A14到A27“Dave”。
如果变量Name =“Alfred”,我希望能够从A1到A10中选择 如果变量Name =“Flo”等,则选择A11到A13
我永远不知道名字何时开始或结束,但我知道它们是在块中。 我的想法是从A1到最后一行循环, 但我不知道如何将值归因于范围的起点而另一个归结到末尾,以便我可以选择它。
在我发现的所有帖子中,我们知道范围的开始但不是结束,所以我们可以使用xlUp或xltoLeft,但在我的情况下我不能。
你能帮我做一下这个循环吗?感谢。答案 0 :(得分:2)
既然你问得这么好,就去吧:
Dim blockBeginning, blockEnd, searchedColumn, firstRowSearched, lastRowSearched As Integer, searchString As String
searchString = "Flo"
searchedColumn = 1
firstRowSearched = 1
lastRowSearched = 30
blockBeginning = -1
For i = firstRowSearched To lastRowSearched
If (Cells(i, searchedColumn).Value = searchString) Then
If (blockBeginning = -1) Then
blockBeginning = i
End If
blockEnd = i
End If
Next i
If (blockBeginning = -1) Then
MsgBox ("Column <" & searchedColumn & "> does not have any entry with <" & searchString & ">")
Else
Range(Cells(blockBeginning, searchedColumn), Cells(blockEnd, searchedColumn)).Select
End If
答案 1 :(得分:1)
你真的不需要循环来做到这一点。
Public Sub SelectBlockRange(searchTerm As String, inColumn As String)
Dim rng As Range
Dim blockStart As Long, blockLength As Long
On Error Resume Next
blockStart = CLng(WorksheetFunction.Match(searchTerm, Columns(inColumn), 0))
blockLength = CLng(WorksheetFunction.CountIf(Range(Columns(inColumn).Cells(blockStart), _
Columns(inColumn).Cells(Rows.Count)), _
searchTerm))
If blockStart > 0 And blockLength > 0 Then
Set rng = Range(Columns(inColumn).Cells(blockStart), _
Columns(inColumn).Cells((blockStart + blockLength - 1)))
rng.Select
End If
End Sub
然后你可以这样称呼它:
SelectBlockRange "Flo", "A"
答案 2 :(得分:0)
另一个技巧是将值更改为公式并选择范围
中的所有公式Set columnA = UsedRange.Resize(, 1)
columnA.Value2 = columnA.Value2 ' optional to convert any formulas to values
columnA.Replace "Flo", "=""Flo"" "
columnA.SpecialCells(xlCellTypeFormulas).Select
columnA.Value2 = columnA.Value2 ' optional to convert the formulas back to values