如何跳过For Each循环语句中范围内的第一个元素? [EXCEL-VBA]

时间:2018-12-14 08:07:30

标签: excel vba excel-vba

我想做的事情相对简单。我有一个根据条件过滤的数据集,因此隐藏了工作表中的某些行。我为过滤后的数据设置了一个范围,该范围仅应通过示例代码可见的单元格进行。

With MyDataWorksheet.AutoFilter.Range
     On Error Resume Next
     Set AutoFilterRange = .SpecialCells(xlCellTypeVisible)
     On Error GoTo 0
End With

现在,我想遍历AutoFilterRange变量中的所有数据,该变量应该已经捕获了所有可见行。我让他们做这样的事情。

Sub aSub()

Dim DR As Range
For Each DR In AutoFilterRange
    'Do something here
Next DR

End Sub

我在每个循环中都使用它来处理可见行,但是我想跳过数据范围中的第一个元素,因为该元素行号包含我的标题名称。我以为这样做会帮助解决我的问题,但是它所做的只是转到标题行元素之后的下一个隐藏行元素。

For Each DR In AutoFilterRange.Offset(1,0)
    'Do something here
Next DR

3 个答案:

答案 0 :(得分:2)

类似这样的东西

With MyDataWorksheet
    If .AutoFilterMode Then
        With .AutoFilter.Range
            Set AutoFilterRange = .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0).SpecialCells(xlCellTypeVisible)
        End With
    End If
End With

在您的代码中,如果AutoFilter未打开,则不会显示AutoFilterRange,所以我也跳过了这一部分。

答案 1 :(得分:1)

您可以添加一个if语句和一个“标志”。

Sub aSub()

Dim DR As Range
Dim flag as Boolean
flag = false
For Each DR In AutoFilterRange
    If flag = true Then
        'Do something here
    End If
    flag = true
Next DR

End Sub

由于标志为false,这将跳过第一次迭代,然后将其设置为true,它将在所有其他迭代中do something

答案 2 :(得分:0)

您可以更改范围以不使用第一行:

Set AutoFilterRange = Range(Range("A2"), Range("A2").End(xlDown)).Cells