Выберите первую видимую ячейку на каждом листе с помощью al oop в VBA - PullRequest
0 голосов
/ 29 мая 2020

Я использую VBA ниже, чтобы выбрать первую видимую ячейку в отфильтрованном диапазоне:

Sub Postioning_Option_01()
Sheet1.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 2).Select
End Sub

Теперь, вместо того, чтобы применять только это VBA на Sheet1 Я хочу с l oop через все листы.
Следовательно, я попытался go с этим VBA:

Sub Postioning_Option_02()
Dim b As Worksheet
For Each b In Worksheets
b.Select
b.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 2).Select
Next b
End Sub

Когда я запускаю это VBA, я получаю ошибку Object variable or With block variable not set.
Что мне нужно изменить в VBA, чтобы он заработал?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Небольшое исследование с использованием автофильтра

Ничего особенного в первых 4 подпрограммах, но последние 2 выглядят немного глубже, но могут быть вне контекста.

Option Explicit

Sub Positioning_Option_01()
    If Sheet1.AutoFilterMode Then
        Sheet1.AutoFilter.Range.Offset(1) _
          .SpecialCells(xlCellTypeVisible).Cells(1, 2).Select
    Else
    End If
End Sub

Sub Postioning_Option_02()
    Dim b As Worksheet
    For Each b In ThisWorkbook.Worksheets
        b.Activate
        If b.AutoFilterMode Then
            b.AutoFilter.Range.Offset(1) _
              .SpecialCells(xlCellTypeVisible).Cells(1, 2).Select
        Else
        End If
    Next
End Sub

Sub Positioning_Option_01_With()
    With Sheet1
        If .AutoFilterMode Then
            With .AutoFilter.Range.Offset(1) _
              .SpecialCells(xlCellTypeVisible).Cells(1, 2)
                .Select
            End With
        Else
        End If
    End With
End Sub

Sub Postioning_Option_02_With()
    Dim b As Worksheet
    For Each b In ThisWorkbook.Worksheets
        b.Activate
        With b
            If .AutoFilterMode Then
                With .AutoFilter.Range.Offset(1) _
                  .SpecialCells(xlCellTypeVisible).Cells(1, 2)
                    .Select
                End With
            Else
            End If
        End With
    Next
End Sub

Sub Pos_Offset()
    With Sheet1
        If .AutoFilterMode Then
            ' The following range refers to the range below headers containing
            ' data and one empty row range below data.
            With .AutoFilter.Range.Offset(1)
                ' If no match in AutoFilter, after applying "SpecialCells"
                ' the cell in the row below data will be selected. You can't
                ' tell if it is contained in "AutoFilter.Range".
                With .SpecialCells(xlCellTypeVisible).Cells(1, 2)
                    .Select
                    Debug.Print .Address, .Value
                End With
            End With
        Else
            ' AutoFilterMode is False
            MsgBox "AutoFilterMode is set to 'False'."
        End If
    End With
End Sub

Sub Pos_Actual()
    With Sheet1
        If .AutoFilterMode Then
            ' The range below headers containing data.
            With .AutoFilter.Range
                With .Rows(2).Resize(.Rows.Count - 1)
                    ' If no match in AutoFilter, after applying SpecialCells
                    ' in the following line, the following error occurs:
                    ' "Run-time error '1004': No cells were found."
                    ' Therefore:
                    On Error Resume Next
                    With .SpecialCells(xlCellTypeVisible).Cells(1, 2)
                        If Err.Number <> 0 Then
                            ' The are no visible cells.
                            MsgBox "No visible cells."
                        Else
                            .Select
                            Debug.Print .Address, .Value
                        End If
                        On Error GoTo 0
                    End With
                End With
            End With
        Else
            ' AutoFilterMode is False
            MsgBox "AutoFilterMode is set to 'False'."
        End If
    End With
End Sub
0 голосов
/ 29 мая 2020

Листы без автофильтра пропускаются:

Sub Postioning_Option_02()

    Dim b As Worksheet
    For Each b In Worksheets
        If b.AutoFilterMode Then
            b.Select
            b.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 2).Select
        End If
    Next b

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...