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