excel根据下拉列表更改隐藏包含错误值的行

时间:2018-05-15 10:49:31

标签: excel vba excel-vba

当索引/匹配公式返回“N / A”时,我想隐藏B9-B40列中的行,现在我设法在表是静态时在VBA中完成它但是我有一个基于drop的动态表 - 向下选择表示每次下拉选择更改时返回的N / As数可能不同。

以下是我现在根据当前下拉选项隐藏N / A的行,我的下拉列表是C2,C3和C4。但事后考虑下降并未进一步改变。我对VBA不是很称职,所以任何帮助都会很棒。

感谢。

Option Explicit


Sub hide_if_error()

    Dim MyCell As Range, Rng As Range

    Set Rng = Range("B9:B40")

    For Each MyCell In Rng

        If IsError(MyCell) Then

            MyCell.EntireRow.Hidden = True

        End If

    Next MyCell

End Sub

1 个答案:

答案 0 :(得分:1)

你可以做到

Range("B9:B40").SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Hidden = True

您需要提前测试是否存在错误。

这可能看起来像:

Option Explicit
Public Sub hide_if_error()
    With ThisWorkbook.Worksheets("Sheet4")

        .Range("B9:B40").EntireRow.Hidden = False

        If Evaluate("=SUM(IF(ISERROR(" & .Range("B9:B40").Address & "),1))") > 0 Then '<==check if any errors present

            .Range("B9:B40").SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Hidden = True

        End If
    End With
End Sub

如有必要,您可以将上述内容链接到工作表更改或下拉更改事件,以便每次使用下拉列表进行更新时都会触发

例如:

如果数据验证位于C2:C4,您可以在工作表的代码窗格中输入以下事件代码:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrHand
    If Not Intersect(Target, Range("C2:C4")) Is Nothing Then
        Application.EnableEvents = False
        hide_if_error
    End If
ErrHand:
Application.EnableEvents = True
End Sub

注意:

工作表事件代码位于与工作表4关联的代码窗格中:

Code pane

其他代码进入标准模块(此处为模块1):

Module 1

示例运行:

Test run