6

使用 VBA(Excel 365 (16.0.12527.20880),德语)我正在尝试根据Office VBA 参考Checkbox1将复选框( )标​​题的删除线属性设置为这应该可以工作。False

以下代码放置在(简化的)中并更改(并且是静态的,通过 VBA 编辑器创建,而不是在运行时通过代码创建Module1)的删除线值。UserForm1.Checkbox1UserForm1Checkbox1

    Sub ChangeCheckBox()

    UserForm1.CheckBox1.Caption = "Test" 'this triggers the Init-Procedure, which only sets the Height and Width of the UserForm. This shouldn't effect the problem, but I'm mentioning it here so it's clear that the form has been initialized. But if I leave it out, it's the same problem.       

    'Pre-Test - works fine

        'Check initial value
        Debug.Print UserForm1.CheckBox1.Font.Strikethrough  'returns false (as it should)
        
        'Write value and check it
        UserForm1.CheckBox1.Font.Strikethrough = False
        Debug.Print UserForm1.CheckBox1.Font.Strikethrough  'returns false (as it should)

        'Write value and check it again
        UserForm1.CheckBox1.Font.Strikethrough = False
        Debug.Print UserForm1.CheckBox1.Font.Strikethrough  'returns false (as it should)

    'This next line seeems to cause the post-test failure

        tmpString = ThisWorkbook.Worksheets("Sheet1").Cells(tmpIndex, tmpColumn).Value
        Debug.Print tmpString     'returns the correct value

    'Post-Test - fails!!!

        'Check initial value
        Debug.Print UserForm1.CheckBox1.Font.Strikethrough  'returns false (as it should)

        'Write value and check it
        UserForm1.CheckBox1.Font.Strikethrough = False
        Debug.Print UserForm1.CheckBox1.Font.Strikethrough  'returns true (should still be false)

        'Write value and check it again
        UserForm1.CheckBox1.Font.Strikethrough = False
        Debug.Print UserForm1.CheckBox1.Font.Strikethrough  'returns true (definitely should return false now)

    End Sub

在我的情况下,由于某种原因,该命令将框设置为True而不是False. 到目前为止,我已将问题定位到特定的代码行。“预测试”成功,“后测试”失败(其他一切正常)。请注意,我正在逐步使用调试模式,没有其他代码在“中间”执行。

如果我创建一个不同的表单并在那里尝试同样的事情,问题仍然存在。原来的程序是几百行代码,但我创建了上面的Testprocedure,问题仍然存在。我还可以通过仅使用一张工作表、一个用户表单/复选框和一个包含测试程序的模块从头开始创建一个新的 Excel 文件来重现它。

那么,到底为什么会tmpString = ThisWorkbook.Worksheets("Sheetname").Cells(tmpIndex, tmpColumn).Value导致“后测”失败呢?

注意:此错误不能在所有机器上重现,我在不同的机器上尝试过。在那里,我无法重现该错误。

4

3 回答 3

1

我无法重现该问题,并且我在 3 台不同的机器上进行了尝试。但是,我记得大约 7 年前看到了一个类似的问题,我设法通过首先检查是否需要更改字体属性的值来解决它。

尝试替换所有出现的这种情况:

UserForm1.CheckBox1.Font.Strikethrough = False

有了这个:

If UserForm1.CheckBox1.Font.Strikethrough Then UserForm1.CheckBox1.Font.Strikethrough = False

这基本上将.Font.Strikethrough属性设置为False仅当它已经存在时,True因为否则它False(显然)并且如果该属性的设置器中有任何错误,那么这将跳过错误。


与您的问题无关,但使用 Userform 的默认实例不是一个好主意,就像您在此处使用Userform1.Checkbox.... 我建议您阅读@MathieuGuindon 在 2017 年撰写的这篇文章。

于 2021-08-31T13:00:33.197 回答
0

尝试为您的工作表使用索引而不是名称。

在编程语言中发生的事情很有趣。

tmpString = ThisWorkbook.Worksheets(1).Cells(tmpIndex, tmpColumn).Value
    Debug.Print tmpString

它对我有用,我认为是因为 VBA 中的多态函数无需调试!因为没有其他东西可以导致这种行为!

于 2021-09-04T18:40:49.887 回答
0

我已经设法以与您发生相同的方式重现该问题。这里的根本原因是您在关闭表单后没有显式卸载表单,这意味着您在打开时对其进行的所有修改都会保留在内存中。例如,使用您的代码,即使在第二次运行时也显示带有删除线的复选框。这意味着它保留在内存中。

因此,要解决此问题,只需Unload UserForm1在运行代码后添加您的过程。

虽然这种方法适用于重置复选框(我假设这是您的最终目标),但由于某种原因,对于最后 2 次检查,它仍然返回 true。要解决此问题(尽管如果您实现了目标可能没有必要),然后只需使用@Cristian Buse 的 if/then 解决方案。

于 2021-09-05T10:44:59.057 回答