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

问题描述 投票:-1回答:2

我遇到了一个我正在研究的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)

excel vba excel-vba validation
2个回答
0
投票

假设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

0
投票

感谢大家的投入。看来excel 2013在这些组合框中用于数据验证的列表名称存在问题。我在这里使用了解决方案:

http://blog.contextures.com/archives/2014/09/18/worksheet-combo-box-problem-in-excel-2013/

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

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

© www.soinside.com 2019 - 2024. All rights reserved.