嘿,我的VBA代码有一个很奇怪的问题。我使用宏以编程方式添加/删除用户窗体控件。当我简单地添加一个用户窗体控件,然后尝试将其删除时,一切正常。但是,一旦我尝试删除刚刚创建并使用过的userform控件(就像userform.Show一样),就会收到标题为error的错误。在再次尝试后它起作用了……所以第一个问题是,这到底是什么?第二个问题是我该如何解决还是什至需要解决?我可以通过某种错误处理解决这个错误吗?

我不确定代码的哪一部分有助于理解我的问题,但是我认为删除用户窗体控件的代码可能会有所帮助:

Public Function delete_userform_controls(strUserForm As String)
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim iCount As Integer
    Dim cnt As Control
    Dim iMaxColumns As Integer
    Dim lCountOfLines As Long

    Set VBProj = ActiveWorkbook.VBProject
    Set VBComp = VBProj.VBComponents(strUserForm)

    For Each cnt In VBComp.Designer.Controls
        If TypeName(cnt) = "Label" Then iMaxColumns = iMaxColumns + 1
    Next cnt

    With VBComp.Designer
        For iCount = 0 To iMaxColumns - 1
            .Controls.Remove ("label_" & iCount & "")
            .Controls.Remove ("textbox_" & iCount & "")
        Next
        .Controls.Remove ("ok_button")
        .Controls.Remove ("cancel_button")
    End With

    With VBComp.CodeModule
        .DeleteLines 1, .CountOfLines
    End With
End Function

另外,如果我不使用任何用户格式,就可以随意添加和删除控件,没有错误……谢谢!

最佳答案

我怀疑您是在设计时添加控件的,但是一旦加载了用户窗体,您就试图在运行时删除控件,这是不允许的。当您第一次看到错误并选择[结束]时,您正在重置VBA环境,该环境将卸载UserForm。 (其他情况也会发生:所有全局变量都失去其值。)这时,不再加载用户窗体,因此您可以删除控件。

如果是这种情况,则需要在添加控件之前确保已加载用户窗体。第一次执行userform.Show时,会发生两件事:加载表单,然后使其可见。您可以使用.Load方法加载它,而不必使其可见。然后,您可以添加控件。只要您不使用.Unload方法(或重置VBA)卸载表单,您的控件就会保留下来。 .Hide和.Show将更改窗体的可见性,但不会导致在运行时添加的控件被丢弃。

另一方面,如果您真的想在设计时添加控件以使其持久化(并在保存工作簿时保存),则需要在删除控件之前使用.Unload来卸载表单。

关于vba - Excel VBA运行时错误 '-2147319767 (80028029)',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27459958/

10-12 17:38
查看更多