Excel 运行时错误1004:清除下拉列表旁边的单元格
我正试图清除我的下拉列表旁边的单元格。目标是在其更改时清除其旁边的单元格。如果excel工作表很简单,并且没有太多其他数据,那么我的代码工作得很好。现在在我想要实现它的工作表上,它总是给我错误VBA运行时错误1004“应用程序定义或对象定义错误”。我怎样才能解决这个问题?另一件让它更难的事情是,我在Excel 运行时错误1004:清除下拉列表旁边的单元格,excel,vba,Excel,Vba,我正试图清除我的下拉列表旁边的单元格。目标是在其更改时清除其旁边的单元格。如果excel工作表很简单,并且没有太多其他数据,那么我的代码工作得很好。现在在我想要实现它的工作表上,它总是给我错误VBA运行时错误1004“应用程序定义或对象定义错误”。我怎样才能解决这个问题?另一件让它更难的事情是,我在私有子工作表中还有其他代码_Change(ByVal Target作为范围) 我认为一个解决方案可能是找到一种方法,让它在不使用Target的情况下工作。不幸的是,我似乎找不到没有这个的东西 Priv
私有子工作表中还有其他代码_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
不起任何作用,可以很容易地删除。我将对它进行一些测试,并在发现它非常有效时将其标记为已回答。已经谢谢了!我将对它进行一些测试,当我发现它非常有效时,将其标记为已回答。已经谢谢了!