我正在Excel中构建用户输入表单(我知道这不是理想的方式,但它是所有内容的首选程序)。
我有一系列用户需要回答的问题,这些问题被分解为子集。我希望每个子集都有一个主要问题,它会自动将所有剩余项目分配给“否”。我在其自己的表中有每个问题子集以简化其他任务(表名为“Process”),左上角的单元格是主要的是/否条目单元格。工作表宏我运行后立即崩溃Excel。我错过了什么吗?
Private Sub Worksheet_Change(ByVal target As Range)
If [Process].Cells(1, 1).Value = "No" Then
[Process].Cells(2, 1).Value = "No"
End If
End Sub
我猜测测试持续进行测试并导致崩溃。但我不确定如何最好地退出潜艇。
提前致谢。
答案 0 :(得分:0)
只要该工作表上的任何单元格值发生更改,Worksheet_Change
处理程序就会执行。
[Process]
是一个括号中的表达式,它在运行时由Excel进行评估,它没有选择假设您指的是活动工作表(处理Worksheet_Change
的工作表),这意味着您的Process
表位于要修改的工作表上。
您的处理程序正在自行调用 ad infinitum ,直到调用堆栈剧烈爆炸。
之前禁用工作表事件:
Application.EnableEvents = False
在以下情况后恢复它们:
Application.EnableEvents = True
这样你在处理“嘿我被修改”事件时对工作表所做的任何修改,都不会启动另一个“嘿我被修改”事件。
我建议您也用实际的对象模型调用替换括号中的表达式,以便进行编译时验证。
Public Property Get ProcessTable() As ListObject
Set ProcessTable = Me.ListObjects("Process")
End Property
Private Sub Worksheet_Change(ByVal target As Range)
Application.EnableEvents = False
On Error GoTo CleanExit
Static table As ListObject
If table Is Nothing Then Set table = ProcessTable
With table.Range
If .Cells(1, 1).Value = "No" Then .Cells(2, 1).Value = "No"
End With
CleanExit:
Application.EnableEvents = True
Err.Clear
End Sub
答案 1 :(得分:-3)
If [Process].Cells(1, 1).Value = "No" Then
[Process].Cells(2, 1).Value = "No"
End
End If