Excel 运行时错误1004:清除下拉列表旁边的单元格

Excel 运行时错误1004:清除下拉列表旁边的单元格,excel,vba,Excel,Vba,我正试图清除我的下拉列表旁边的单元格。目标是在其更改时清除其旁边的单元格。如果excel工作表很简单,并且没有太多其他数据,那么我的代码工作得很好。现在在我想要实现它的工作表上,它总是给我错误VBA运行时错误1004“应用程序定义或对象定义错误”。我怎样才能解决这个问题?另一件让它更难的事情是,我在私有子工作表中还有其他代码_Change(ByVal Target作为范围) 我认为一个解决方案可能是找到一种方法,让它在不使用Target的情况下工作。不幸的是,我似乎找不到没有这个的东西 Priv

我正试图清除我的下拉列表旁边的单元格。目标是在其更改时清除其旁边的单元格。如果excel工作表很简单,并且没有太多其他数据,那么我的代码工作得很好。现在在我想要实现它的工作表上,它总是给我错误VBA运行时错误1004“应用程序定义或对象定义错误”。我怎样才能解决这个问题?另一件让它更难的事情是,我在
私有子工作表中还有其他代码_Change(ByVal Target作为范围)

我认为一个解决方案可能是找到一种方法,让它在不使用Target的情况下工作。不幸的是,我似乎找不到没有这个的东西

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = True
    If Target.Column = 2 And Target.Validation.Type = 3 Then
        Application.EnableEvents = False
        Target.Offset(0, 1).ClearContents
    End If
End Sub
编辑:其他代码的一部分


非常感谢你的帮助

如果
target
没有验证集,您将看到错误1004。请注意,VBA将计算
If
-语句的两部分。即使
Target.Column
不是2(因此整个if不能为True),VBA也会检查
Target.Validation.Type

另一个问题是
target
可以包含多个单元格(例如,如果用户将数据剪切粘贴到多个单元格中)。您需要分别检查每个单元格

不幸的是,在VBA中没有简单的测试。如果单元格有验证,则需要使用“错误恢复下一步”中的
来检查类型(请参阅)

此外,
启用事件
也有问题。如果触发器即将修改数据,则需要禁用事件。这是为了防止此修改本身调用Change触发器,这可能导致无休止的递归调用(最终导致堆栈溢出错误)。但是,在任何情况下都需要启用这些事件,否则将不会再次调用触发器

你的扳机看起来像

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    
    Dim cell As Range
    For Each cell In Target
        If cell.Column = 2 Then
            Dim vType
            vType = Null
            On Error Resume Next
            vType = cell.Validation.Type
            On Error GoTo 0
    
            If vType = 3 Then
                cell.Offset(0, 1).ClearContents
            End If
        End If
    Next
    
    Application.EnableEvents = True
End Sub

如果
target
没有验证集,您将看到错误1004。请注意,VBA将计算
If
-语句的两部分。即使
Target.Column
不是2(因此整个if不能为True),VBA也会检查
Target.Validation.Type

另一个问题是
target
可以包含多个单元格(例如,如果用户将数据剪切粘贴到多个单元格中)。您需要分别检查每个单元格

不幸的是,在VBA中没有简单的测试。如果单元格有验证,则需要使用“错误恢复下一步”中的
来检查类型(请参阅)

此外,
启用事件
也有问题。如果触发器即将修改数据,则需要禁用事件。这是为了防止此修改本身调用Change触发器,这可能导致无休止的递归调用(最终导致堆栈溢出错误)。但是,在任何情况下都需要启用这些事件,否则将不会再次调用触发器

你的扳机看起来像

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    
    Dim cell As Range
    For Each cell In Target
        If cell.Column = 2 Then
            Dim vType
            vType = Null
            On Error Resume Next
            vType = cell.Validation.Type
            On Error GoTo 0
    
            If vType = 3 Then
                cell.Offset(0, 1).ClearContents
            End If
        End If
    Next
    
    Application.EnableEvents = True
End Sub

下拉列表在哪个单元格中?您应该使用
Intersect
Target
和该特定单元格相交,以测试更改的单元格是否是具有下拉列表的单元格。其他代码是什么?@BigBen multiple cells是下拉列表,但并非所有tha中的细胞column@SJR我将把它添加到post
应用程序中。代码片段开头的EnableEvents=True
不起任何作用,可以轻松删除。下拉列表在哪个单元格中?您应该使用
Intersect
Target
和该特定单元格相交,以测试更改的单元格是否是具有下拉列表的单元格。其他代码是什么?@BigBen multiple cells是下拉列表,但并非所有tha中的细胞column@SJR我将把它添加到post
应用程序中。在代码片段的开头,EnableEvents=True
不起任何作用,可以很容易地删除。我将对它进行一些测试,并在发现它非常有效时将其标记为已回答。已经谢谢了!我将对它进行一些测试,当我发现它非常有效时,将其标记为已回答。已经谢谢了!