#VBA - Private Sub Worksheet_Change Error: Method 'Hidden' of Object 'Range' Field

#VBA - Private Sub Worksheet_Change Error: Method 'Hidden' of Object 'Range' Field

花了 3 个多小时试图解决这个问题。任何帮助,将不胜感激。我在底部尝试过的解决方案。

问题:

我正在尝试更新代码,以便如果有人在单元格 E58 中选择“NA”(此单元格上有 3 个下拉选项:Yes/No/NA),它会更新单元格 E60 的值和 E65 也是 NA,而不会中断当前的操作。我尝试过的每个解决方案都会导致代码循环回到顶部并在从顶部开始的第 6 行失败 and/or 导致文件崩溃:

   Rows("9").EntireRow.Hidden = True

错误消息是:运行-时间错误,对象'Range'字段的方法“隐藏”

代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)   

If Range("E8").Value = "No" Then
    Rows("9").EntireRow.Hidden = True
ElseIf Range("E8").Value = "Yes" Then
    Rows("9").EntireRow.Hidden = False
    ElseIf Range("E8").Value = "" Then
    Rows("9").EntireRow.Hidden = True

End If

 If Range("E10").Value = "No" Then
    Rows("11").EntireRow.Hidden = True
ElseIf Range("E10").Value = "No" Then
    Rows("11").EntireRow.Hidden = False
ElseIf Range("E10").Value = "Yes" Then
    Rows("11").EntireRow.Hidden = True
     ElseIf Range("E10").Value = "" Then
    Rows("11").EntireRow.Hidden = True

End If

If Range("E58").Value = "Yes" Then
    Rows("59").EntireRow.Hidden = True
     
ElseIf Range("E58").Value = "NA" Then
    Rows("59").EntireRow.Hidden = True
    Range("E60").Value = "NA"
ElseIf Range("E58").Value = "No" Then
    Rows("59").EntireRow.Hidden = False
 ElseIf Range("E58").Value = "" Then
    Rows("59").EntireRow.Hidden = True

End If


 
 If Range("E60").Value = "No" Then
    Rows("61").EntireRow.Hidden = True
    Rows("62").EntireRow.Hidden = False
    Rows("63").EntireRow.Hidden = True
ElseIf Range("E60").Value = "NA" Then
    Rows("61:62").EntireRow.Hidden = True
ElseIf Range("E60").Value = "Yes" Then
    Rows("62").EntireRow.Hidden = False
    Rows("63").EntireRow.Hidden = False
    Rows("61").EntireRow.Hidden = True
ElseIf Range("E60").Value = "" Then
    Rows("61:63").EntireRow.Hidden = True
End If



If Range("E63").Value = "No" Then
    Rows("64").EntireRow.Hidden = False
ElseIf Range("E63").Value = "N/A" Then
    Rows("64").EntireRow.Hidden = True
ElseIf Range("E63").Value = "Yes" Then
    Rows("64").EntireRow.Hidden = True
ElseIf Range("E63").Value = "Partial" Then
    Rows("64").EntireRow.Hidden = False
ElseIf Range("E63").Value = "" Then
    Rows("64").EntireRow.Hidden = True
End If
 
 
 If Range("E65").Value = "False" Then
    Rows("66").EntireRow.Hidden = True
    Rows("67").EntireRow.Hidden = True
ElseIf Range("E65").Value = "NA" Then
    Rows("66:67").EntireRow.Hidden = True
ElseIf Range("E65").Value = "Yes" Then
    Rows("66").EntireRow.Hidden = False
    Rows("67").EntireRow.Hidden = False
ElseIf Range("E65").Value = "" Then
    Rows("66:67").EntireRow.Hidden = True
End If

注意:未提及的行也有类似的命令,但这里只需要执行此操作。

尝试过的解决方案:

  1. 尝试在 ELSEIF 语句中添加一行

      ElseIf Range("E58").Value = "NA" Then
      Range("E60").Value = "NA"
    

虽然这确实吐出 E60 中的 NA,但代码循环回到顶部并在第 6 行再次失败。

  1. 尝试添加一个 public sub 来执行与上面相同的操作,并调用这个 public sub 放置在与 Range("E60") 相同的位置.Value = "NA" 语句但它在同一位置失败 and/or 使 excel.

    崩溃
  2. 尝试使用 Application.EnableEvents = True/False 进行试验,但这会导致 ELSEIF 语句( ElseIf Range("E58").Value = "" Then Rows("59").EntireRow.Hidden = True) 无法正常运行。

非常感谢您的帮助。

谢谢。

运行 只有当您选择的单元格被更改时您才需要的代码,而不是工作表中的任何单元格。

例如:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

    ' The variable KeyCells contains the cells that will
    ' cause an alert when they are changed.
    Set KeyCells = Range("A1:C10")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

        ' Display a message when one of the designated cells has been 
        ' changed.
        ' Place your code here.
        MsgBox "Cell " & Target.Address & " has changed."

    End If
End Sub

因为此代码仅显示来自 Range("A1:C10") 的单元格的消息。在您的情况下,当 E58 中发生更改时,您应该 运行 一些特定的逻辑,并在 Worksheet_Change 事件中排除 E60 和 E65。

示例来自 here。读一读。这应该可以轻松实现您想要的效果。

您必须在 Private Sub Worksheet_Change(ByVal Target As Range) 之后添加 Application.EnableEvents = False,在 End Sub 之前添加 Application.EnableEvents = True

由于您试图更改同一 sheet 上的单元格值,因此当您更改同一 sheet 上的单元格值时,Worksheet_Change 事件将自行触发,从而导致无限循环.

修改后的代码如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    If Range("E8").Value = "No" Then
        Rows("9").EntireRow.Hidden = True
    ElseIf Range("E8").Value = "Yes" Then
        Rows("9").EntireRow.Hidden = False
    ElseIf Range("E8").Value = "" Then
        Rows("9").EntireRow.Hidden = True
    End If

    If Range("E10").Value = "No" Then
        Rows("11").EntireRow.Hidden = True
    ElseIf Range("E10").Value = "No" Then
        Rows("11").EntireRow.Hidden = False
    ElseIf Range("E10").Value = "Yes" Then
        Rows("11").EntireRow.Hidden = True
    ElseIf Range("E10").Value = "" Then
        Rows("11").EntireRow.Hidden = True
    End If

    If Range("E58").Value = "Yes" Then
        Rows("59").EntireRow.Hidden = True
    ElseIf Range("E58").Value = "NA" Then
        Rows("59").EntireRow.Hidden = True
        Range("E60").Value = "NA"
    ElseIf Range("E58").Value = "No" Then
        Rows("59").EntireRow.Hidden = False
    ElseIf Range("E58").Value = "" Then
        Rows("59").EntireRow.Hidden = True
    End If
 
    If Range("E60").Value = "No" Then
        Rows("61").EntireRow.Hidden = True
        Rows("62").EntireRow.Hidden = False
        Rows("63").EntireRow.Hidden = True
    ElseIf Range("E60").Value = "NA" Then
        Rows("61:62").EntireRow.Hidden = True
    ElseIf Range("E60").Value = "Yes" Then
        Rows("62").EntireRow.Hidden = False
        Rows("63").EntireRow.Hidden = False
        Rows("61").EntireRow.Hidden = True
    ElseIf Range("E60").Value = "" Then
        Rows("61:63").EntireRow.Hidden = True
    End If

    If Range("E63").Value = "No" Then
        Rows("64").EntireRow.Hidden = False
    ElseIf Range("E63").Value = "N/A" Then
        Rows("64").EntireRow.Hidden = True
    ElseIf Range("E63").Value = "Yes" Then
        Rows("64").EntireRow.Hidden = True
    ElseIf Range("E63").Value = "Partial" Then
        Rows("64").EntireRow.Hidden = False
    ElseIf Range("E63").Value = "" Then
        Rows("64").EntireRow.Hidden = True
    End If
 
    If Range("E65").Value = "False" Then
        Rows("66").EntireRow.Hidden = True
        Rows("67").EntireRow.Hidden = True
    ElseIf Range("E65").Value = "NA" Then
        Rows("66:67").EntireRow.Hidden = True
    ElseIf Range("E65").Value = "Yes" Then
        Rows("66").EntireRow.Hidden = False
        Rows("67").EntireRow.Hidden = False
    ElseIf Range("E65").Value = "" Then
        Rows("66:67").EntireRow.Hidden = True
    End If
    
    Application.EnableEvents = True

End Sub

注意:我假设您的代码中有更多元素。你写

I'm trying to update the code so that if anyone selects "NA" in cell E58, (there are 3 drop-down options on this cell: Yes/No/NA) it updates the value of cell E60 and E65 as being NA as well,...

但是您的代码不会更新这些单元格。只有 hiding/unhiding 行或列不会触发 Worksheet_Change 事件,因此不会导致无限循环。