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

时间:2017-04-30 06:32:19

标签: excel-vba userform vba excel

我尝试使用以下内容导入Userform

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

执行期间我收到错误

  

-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 

1 个答案:

答案 0 :(得分:2)

这实际上不是问题的答案,而是一些观察&可能含糊其词。我修改了测试代码,并在java_binary块后放置了Debug Print …语句,并带有一个模糊的想法:“让VBE 1st完成导入,并在查询其属性之前将其放入VBComponents集合中”。而且有效。

With  .Import

我还有另外一个发现。我还尝试在导出前计算userform1的属性。我发现只有在运行代码的情况下Userform1属性窗口处于活动状态时,它才起作用。否则,会出现相同的错误。我正在使用Excel2007。可能是VBE中的某种错误。

Edit2 :问题的第二部分,我进一步观察到对特定的VBComponent项目使用Sub test() Dim FName As String With ThisWorkbook.VBProject.VBComponents ' save UserForm1 Debug.Print "UserForm1 has " & .Item("UserForm1").Properties.Count & " properties before" With .Item("UserForm1") 'Debug.Print "UserForm1 has " & .Properties.Count & " properties" 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 Debug.Print "Userform_org has " & .Item("UserForm1_org").Properties.Count & " properties" End With End Sub 可以防止错误。而且其属性可以轻松访问。尝试在包含多个userForms和模块的任何excel文件中在有无. Activate行的情况下进行简单循环演示。

Vbc.Activate