Excel VBA筛选/可见单元格

13
假设我有10行数据。我对数据应用了一些过滤器,第7行和第9行被过滤 或者可见的
我想循环遍历这10行数据,并在一个空列中(假设是C列)仅为可见行(即C7和C9范围)输出字符串"Is Visible"

1
请将您尝试的代码添加到问题中。 - whytheq
2
你能展示一下你的过滤公式吗?虽然不是很相关,但我想看看你尝试过的任何东西。 :) - bonCodigo
3个回答

30

选择前10行中的若干行进行隐藏,然后尝试运行此操作。

Translated text:

选择前10行中的若干行进行隐藏,然后尝试运行此操作。

Option Explicit

Sub CheckIfVisible()

Dim i As Integer, x As Integer
x = 0
For i = 1 To 10
    With Excel.ThisWorkbook.ActiveSheet
        If .Rows(i).EntireRow.Hidden Then
        Else
            .Cells(15 + x, 1) = "Row " & i & "is visible"
            x = x + 1
        End If
    End With
Next i

End Sub

这是您正在寻找的循环类型吗?
也许您可以展示给我们您的循环,这样我们就可以看到您的问题所在了?


0

既然我之前也曾经寻找过这个问题,那么这里有一些可能对未来的谷歌搜索者有用的东西。

如果你是按单元格/行进行操作,你可以直接访问单元格.EntireRow.Hidden布尔值。

在下面的示例中,只需通过选择中的每个单元格进行ForEach循环,并仅读取该单元格中的属性,根据.Hidden为True/False进行计数/着色。

要注意的可能陷阱..

如果您正在测试筛选范围,则需要选择超出范围的一行,因为如果隐藏行位于范围中的倒数第二/最后一行,则可能无法捕获隐藏行,选择选择后的第一行可避免此问题。

对于大范围(10,000+行),它将非常低效。

如果您想测试,请复制粘贴



Sub HowManyHiddenCells()

Dim MyCell, MyRange As Range
Dim CellCountAll, CellCountVisible, CellCountHidden As Integer

Set MyRange = Selection



For Each MyCell In MyRange

    ':: IGNORE EMPTY ::
    If Len(MyCell.text) > 0 Then

        If MyCell.EntireRow.Hidden Then
        MyCell.Interior.Color = RGB(255, 220, 200)
        ':: Count of hidden cells in range
        CellCountHidden = CellCountHidden + 1
        ':: Do Column C Text! ::
        MyCell.Offset(0, 2).FormulaR1C1 = "I was hidden! "
        End If
    
        If MyCell.EntireRow.Hidden = False Then
        MyCell.Interior.Color = RGB(200, 255, 180)
        ':: Count of visible cells in range
        CellCountVisible = CellCountVisible + 1
        End If
        ':: Count of all cells in range
        CellCountAll = CellCountAll + 1
    End If
Next MyCell


MsgBox "Cells total " & CellCountAll & vbNewLine & "Hidden :  " & CellCountHidden & vbNewLine & "Visible : " & CellCountVisible, vbOKOnly + vbInformation, "Count of hidden vs visible"

End Sub

脚本示例 - 在筛选范围上,将隐藏内容标记为红色


-1
受@whytheq的启发,我想出了这个方法,它可以循环遍历所选区域中所有可见行。
Sub Loop_through_selected_rows()
Dim rng As Range: Set rng = ActiveWindow.RangeSelection
Dim i As Integer
For i = 0 To rng.Rows.Count - 1
    If Cells(rng.Row + i, 1).EntireRow.Hidden Then
    Else
        Cells(rng.Row + i, 1).Range("A1:E1").Select 'Set Range within row to your needs
        ' Do something here
    End If
Next
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接