我遇到了一个我正在研究的excel VBA项目的问题。
我有一段代码,当勾选一个activeX复选框时,它会在表格中切换数据验证。现在,当我尝试修改或添加数据验证时,它会抛出错误“运行时错误'1004':应用程序定义的错误或对象定义的错误”。但是,当我单步执行代码段并在excel中通过数据功能区手动检查单元格数据验证时,它在调试器中工作。
以下是代码的简化示例:
Private Sub CheckBox1_Click()
If ActiveSheet.OLEObjects("CheckBox1").Object.Value Then
With Range("e4")
.ClearContents
.Validation.Delete
.Validation.Add xlValidateList, xlValidAlertStop, xlBetween, "=lst_b"
End With
Else
With Range("e4")
.ClearContents
.Validation.Delete
.Validation.Add xlValidateList, xlValidAlertStop, xlBetween, "=lst_a"
End With
End If
同样,这仅在我单步执行代码并在第5行和第11行之后通过工具栏物理打开数据验证窗口时才起作用。检查时没有验证,我可以继续执行代码而没有问题。
这工作得比较早,我不明白为什么我的代码停止工作,因为我没有在代码破坏时修改这部分代码。
任何帮助或输入将不胜感激。如果您需要更多信息,请与我们联系。
谢谢,
编辑:所以只需到另一台机器并设置一个测试工作空间来处理这个问题,完全相同的代码就像以前一样工作。有什么理由可以在不同的机器上改变吗? (两者都运行excel 2013)
假设CheckBox1的初始状态未选中== False。
在模块级别声明私有bCheckBox1
并尝试以下操作:
Option Explicit
Private bCheckBox1 As Boolean
...
Private Sub CheckBox1_Click()
Dim sStr$
bCheckBox1 = Not bCheckBox1
Select Case bCheckBox1
Case True: sStr = "=lst_b"
Case False: sStr = "=lst_a"
End Select
With Range("e4")
.ClearContents
.Validation.Delete
.Validation.Add xlValidateList, xlValidAlertStop, xlBetween, sStr
End With
End Sub
感谢大家的投入。看来excel 2013在这些组合框中用于数据验证的列表名称存在问题。我在这里使用了解决方案:
http://blog.contextures.com/archives/2014/09/18/worksheet-combo-box-problem-in-excel-2013/
需要做的是创建另一个列表,该列表引用引用表数据的列表。我不能相信这是一个需要做的修复。
如果有人解释为什么这个“解决方案”有效,或者为什么你不能直接参考列表数据,我很乐意听到!