问题

问题

为了重新初始化子下拉菜单(下拉菜单 2 取决于下拉菜单 1 中的选择),我在“ThisWorkbook”中输入了以下代码。

如果特定范围(下拉列表 1)中的单元格发生变化,则应该清除子下拉列表的内容。它在存在此范围名称的工作表上工作正常(范围名称为“RSTcabFINISHING”)。

问题

在任何其他工作表(=此范围名称不存在的工作表)上,此代码将清除任意 3 个单元格的内容,直至我更改单元格的内容。

我认为解决方案是只将代码放在需要它的工作表上。但是(如果我错了请告诉我)将代码放在“ThisWorkbook”中似乎更有意义,因为具有上述范围的工作表可能会被乘以(=复制)...

不确定所有这些都是否有意义......我想问题是“我应该怎么做才能避免这种清除内容发生在我想要的任何地方?”。

谢谢!

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Initialize cabinet finishing board
On Error Resume Next
If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
    Application.EnableEvents = False
    Target.Offset(0, 1).Resize(, 3).ClearContents
End If

Exit Sub
End Sub

答案1

好的,您的问题主要源于使用On Error Resume Next

  1. 如果范围不存在,您的 if 语句将抛出错误。这意味着它不会被评估,相反,您会因为 resume next 而跳到下一行。

  2. 现在它将禁用事件。因此,您的事件将仅触发一次,因为您似乎从未重新启用它。

  3. 现在它将清除所有内容,而无需测试您的相交是否有效。

因此,我们需要做两件事:

  1. 修复评估
  2. 放弃 Application.EnableEvents = false,或者至少修复它。大多数事件仅由用户进行更改而不是 VBA 脚本引发,因此您可能可以完全忽略这一点。

解决这个问题的最佳方法是调用一个更安全的函数来验证范围是否存在,并根据结果返回 true 或 false。

类似这样的内容可能对你更有用:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Initialize cabinet finishing board
    If RangeExists("RSTcabFINISHING") Then          'See below for what this does. We only progress if we get true.
        If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
            Target.Offset(0, 1).Resize(, 3).ClearContents
        End If
    End If
End Sub

Function RangeExists(RangeName As String)
    On Error GoTo NotValid:             'If we fail, jump to "NotValid"
    If Range(RangeName).Rows >= 0 Then  'Test if the range exists - if it doesn't we'll get an error, if it does it
                                        'will have 0 or more rows
        RangeExists = True              'We didn't error and we do have 0 or more rows, so the function is true
    End If
    Exit Function                       'Break out of the function before we hit our error handler
NotValid:                               'We only get this far if an error was thrown (Range doesn't exist)
    RangeExists = False                 'Flag the function as false before returning
End Function

相关内容