在vba

时间:2016-08-01 19:32:24

标签: excel vba excel-vba

我的工作表在A列中包含动态行数。 我想从第一次满足条件到最后一次选择动态行数。

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

如果变量Name =“Alfred”,我希望能够从A1到A10中选择 如果变量Name =“Flo”等,则选择A11到A13

我永远不知道名字何时开始或结束,但我知道它们是在块中。 我的想法是从A1到最后一行循环, 但我不知道如何将值归因于范围的起点而另一个归结到末尾,以便我可以选择它。

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

你能帮我做一下这个循环吗?感谢。

3 个答案:

答案 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