我尝试使用以下内容导入Userform
With ownVBProj.VBComponents.Import(FileName:=FName)
Print #2, FName; " has ", .Properties.Count; " Properties"
End With
执行期间我收到错误
-2147467259(80004005)引发(对象'_VBComponent'的方法'属性'失败)
虽然已正确导入用户窗体 - 我可以在公式窗口中看到它。
如果我使用对象检查器检查新导入的组件,我可以看到属性树,在完成此操作后,代码可以继续!奇怪的。
有人有任何建议可以避免这个问题吗?
修改
这是一个完整的例子:
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
答案 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