【问题标题】:#VBA - Private Sub Worksheet_Change Error: Method 'Hidden' of Object 'Range' Field#VBA - Private Sub Worksheet_Change 错误:对象“范围”字段的方法“隐藏”
【发布时间】:2020-08-07 21:02:18
【问题描述】:

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

问题:

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

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

错误消息是:运行时错误,对象“范围”字段的方法“隐藏”

代码如下:

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. 尝试添加一个与上述相同的公共子程序,调用此公共子程序与 Range("E60").Value = "NA" 语句放置在同一位置,但它在同一位置失败并且/ 或使 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)Application.EnableEvents = True 之后添加Application.EnableEvents = FalseEnd Sub 之前,它工作得很好。当你包含这两个语句时会发生什么?当使用 Worksheet_Change 事件来操作同一工作表中的单元格值时,您总是有可能启动无限循环。
  • 如果您在更新事件期间更改工作表中的值,您绝对必须使用Application.EnableEvents = false 以避免无限循环。是否有任何您未在此处发布的代码会更改工作表上的值?
  • @MichaelWycisk Ha,比我快 4 秒 ;)
  • @Absinthe 是的:-)。但我同意您的观点,VBAAWARD 没有发布所有代码,上面发布的代码不会更改任何单元格值(但问题指出单元格 E60E65 应该更新)。据我所知,单独隐藏/显示行不应触发Worksheet_Change 事件。
  • @MichaelWycisk 我以前试过这个,但我一定做错了什么——它奏效了。似乎就是这样。我将 application.enableevents 行添加到顶部和底部(false/true),并在 ELSEIF Range("E58").value = NA then 点添加了 2 行代码,它起作用了!非常感谢!

标签: excel vba loops range worksheet


【解决方案1】:

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

由于您试图更改同一工作表上的单元格值,Worksheet_Change 事件将在您更改同一工作表上的单元格值时自行触发,从而导致无限循环。 p>

修改后的代码如下所示:

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

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

我正在尝试更新代码,以便如果有人在单元格中选择“NA” E58,(此单元格上有 3 个下拉选项:是/否/NA)它 将单元格 E60E65 的值也更新为 NA,...

但您的代码不会更新这些单元格。仅隐藏/取消隐藏行或列不会触发Worksheet_Change 事件,因此不会导致无限循环。

【讨论】:

    【解决方案2】:

    仅当您选择的单元格发生更改时才运行您想要的代码,而不是工作表中的任何单元格。

    例如:

    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 的示例。读一读。这应该可以轻松实现您想要的。

    【讨论】:

    • 感谢您分享您的见解!快速提问,因为以上内容直接取自微软页面:我如何将其应用于我拥有的代码?我不需要 msgbox。那么我是否将 IF NOT 语句添加到 IF/ELSEIF/END IF 语句的每个部分?不太确定如何应用它。提前致谢。
    • 尝试将此应用到我的代码中,但它再次使文件崩溃。任何有关如何实际应用它的见解将不胜感激。谢谢。
    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2021-09-25
    相关资源
    最近更新 更多