Excel VBA 数据验证交换仅在调试模式下工作



我正在处理的 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/

需要做的是创建另一个列表,该列表引用引用表数据的列表。我不敢相信这是需要做的修复。

如果有人解释为什么这个"解决方案"有效,或者为什么你不能直接参考列表数据,我将很高兴听到!

最新更新