2

我正在尝试运行一个简单的 For 循环,该循环将在以后扩展以包含更多功能,但由于它不断抛出错误“无效的下一个控制变量引用”而遇到麻烦。下面列出了我尝试使用的代码。

Sub Tickbox()

Set Location = Sheets("TickBoxSheet").Range("B:B")

i = WorksheetFunction.CountA(Location)

Sheets("TickBoxSheet").Range("B2").Select


For a = 1 To i
    If Selection.Value = "True" Then
        Row = Selection.Row
        'Hide some rows in another sheet via if statements

        ActiveCell.Offset(1, 0).Select
    End If
Next i

End Sub

我不知道今天早上我是否需要更多的咖啡,但我似乎无法弄清楚到底发生了什么。任何帮助将不胜感激。

4

2 回答 2

8

递增变量 (in Next) 应该是索引变量,即:

For a = 1 To i
  '...
Next a

i作为索引如此受欢迎,您应该在其他情况下使用它之前三思而后行。

于 2012-07-04T08:35:27.870 回答
5

你已经从 llmo 得到了答案。然而,我想强调的还有一些其他的事情......

尽量避免.Select。它会减慢你的代码。

此外,考虑到您想要遍历所有有数据的行,没有必要给您最后一行。WorksheetFunction.CountA(Location)我建议这个

Sub Tickbox()
    Dim i As Long, a As Long, Rw As Long

    With Sheets("TickBoxSheet")
        i = .Range("B" & .Rows.Count).End(xlUp).row

        For a = 2 To i
            If .Range("B" & a).Value = "True" Then
                Rw = a
                'Hide some rows in another sheet via if statements
            End If
        Next a
    End With
End Sub

您也可以使用 Autofilter 使其更快,这样您就可以遍历只有True例如的单元格

Sub Tickbox()
    Dim i As Long, a As Long, Rw As Long
    Dim Location As Range, acell As Range

    With Sheets("TickBoxSheet")
        '~~> Remove any filters
        .AutoFilterMode = False

        i = .Range("B" & .Rows.Count).End(xlUp).row

        With .Range("B1:B" & i)
            .AutoFilter Field:=1, Criteria1:="True"
            Set Location = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
            Debug.Print Location.Address
        End With

        '~~> Remove any filters
        .AutoFilterMode = False

        For Each acell In Location
            If acell.Value = "TRUE" Then
                Rw = acell.row
                'Hide some rows in another sheet via if statements
            End If
        Next acell
    End With
End Sub
于 2012-07-04T08:52:58.727 回答