将Userform导入VBComponents后无法读取属性

Bur*_*ter 6 excel vba excel-vba userform

我尝试导入一个Userform:

With ownVBProj.VBComponents.Import(FileName:=FName)
  Print #2, FName; " has ", .Properties.Count; " Properties"
End With
Run Code Online (Sandbox Code Playgroud)

在执行期间我得到错误

-2147467259(80004005)引发(对象'_VBComponent'的方法'属性'失败)

虽然用户表单已正确导入 - 我可以在公式窗口中看到它.

如果我使用对象检查器检查新导入的组件,我可以看到属性树,在完成此操作后,代码可以继续!奇怪的.

有人有任何建议可以避免这个问题吗?

编辑:

这是一个完整的例子:

  • 创建一个新的Excel工作表
  • 插入用户表单
  • 执行以下代码:

Sub test()
    Dim FName As String
    With ThisWorkbook.VBProject.VBComponents ' save UserForm1
        With .Item("UserForm1")
            FName = Environ$("Temp") & "\" & .Name & ".frm"
            If (LenB(Dir(FName)) <> 0) Then
                Kill FName
            End If
            .Export Filename:=FName ' rename Form
            .Name = .Name & "_org"
        End With ' import
        With .Import(FName)
            Debug.Print FName; " has ", .Properties.Count; " properties"
        End With
    End With
End Sub 
Run Code Online (Sandbox Code Playgroud)

Ahm*_* AU 2

这实际上并不是问题的答案,而是一些观察,并且可能是模糊的结论。我修改了测试代码并将Debug Print \xe2\x80\xa6语句放在后面With .Import放在块后面,有一个模糊的想法是 \xe2\x80\x98 让 VBE 第一个完成导入,并在查询其属性 \xe2\x80\x99 之前让它位于 VBComponents 集合中。它奏效了。

\n\n
Sub test()\n    Dim FName As String\n    With ThisWorkbook.VBProject.VBComponents \' save UserForm1\n    Debug.Print "UserForm1 has " & .Item("UserForm1").Properties.Count & " properties before"\n        With .Item("UserForm1")\n        \'Debug.Print "UserForm1 has " & .Properties.Count & " properties"\n            FName = Environ$("Temp") & "\\" & .Name & ".frm"\n            If (LenB(Dir(FName)) <> 0) Then\n                Kill FName\n            End If\n            .Export Filename:=FName \' rename Form\n            .Name = .Name & "_org"\n        End With \' import\n        With .Import(FName)\n        \'Debug.Print FName & " has " & .Properties.Count & " properties"\n        End With\n        Debug.Print "Userform_org has " & .Item("UserForm1_org").Properties.Count & " properties"\n    End With\nEnd Sub\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还有另一个观察。我还尝试在导出之前计算 userform1\xe2\x80\x99s 属性。我发现只有当 Userform1 属性窗口在运行代码的实例中处于活动状态时它才有效。否则,同样的错误会出现。我使用的是 Excel 2007。可能是 VBE 中的某种错误。

\n\n

Edit2:关于我的问题的第二部分,我进一步观察到使用 . Activate特定的 VBComponent 项目可以防止错误。并且它的属性可以很容易地访问。尝试下面的简单循环,无论有没有Vbc.Activate在包含多个用户表单和模块的任何 Excel 文件中

\n\n
Dim Vbc As VBComponent\n    For Each Vbc In ThisWorkbook.VBProject.VBComponents\n    If Vbc.Type <> 100 Then   \xe2\x80\x98 to exclude worksheets\n    Vbc.Activate                        \xe2\x80\x98  Try with or Without this line \n    Debug.Print Vbc.Name & " has " & Vbc.Properties.Count & " Properties"\n    End If\n    Next Vbc     \n
Run Code Online (Sandbox Code Playgroud)\n