在vba中select一个dynamic范围

我的工作表在列A中包含dynamic数量的行。我想从第一次满足条件到最后一次selectdynamic行数。

在A列中,我的名字只出现在块中。 例如,从A1到A10“Alfred”,从A11到A13“Flo”,从A14到A27“Dave”。

如果variablesName =“Alfred”,如果variablesName =“Flo”,则selectA11到A13,我希望能够从A1到A10中进行select。

我永远不知道名字何时开始或结束,但我知道他们是在块。 我的想法是做一个循环从A1到最后一行,但我不知道如何将一个值的范围的开始和另一个结束,以便我可以select它。

在我发现的所有post中,我们知道范围的开始,但不是结束,所以我们可以使用xlUp或xltoLeft,但在我的情况下,我不能。

你能帮我做循环吗? 谢谢。

既然你问的很好,在这里你去:

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 

你并不需要一个循环来做到这一点。

 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" 

另一个技巧是将值更改为公式,并select范围内的所有公式

 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