由主/顶级条目控制的单元格值

时间:2017-04-19 18:58:29

标签: excel vba excel-vba

我正在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

我猜测测试持续进行测试并导致崩溃。但我不确定如何最好地退出潜艇。

提前致谢。

2 个答案:

答案 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