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'的方法'属性'失败)
虽然用户表单已正确导入 - 我可以在公式窗口中看到它.
如果我使用对象检查器检查新导入的组件,我可以看到属性树,在完成此操作后,代码可以继续!奇怪的.
有人有任何建议可以避免这个问题吗?
编辑:
这是一个完整的例子:
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)
这实际上并不是问题的答案,而是一些观察,并且可能是模糊的结论。我修改了测试代码并将Debug Print \xe2\x80\xa6语句放在后面With .Import放在块后面,有一个模糊的想法是 \xe2\x80\x98 让 VBE 第一个完成导入,并在查询其属性 \xe2\x80\x99 之前让它位于 VBComponents 集合中。它奏效了。
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\nRun Code Online (Sandbox Code Playgroud)\n\n我还有另一个观察。我还尝试在导出之前计算 userform1\xe2\x80\x99s 属性。我发现只有当 Userform1 属性窗口在运行代码的实例中处于活动状态时它才有效。否则,同样的错误会出现。我使用的是 Excel 2007。可能是 VBE 中的某种错误。
\n\nEdit2:关于我的问题的第二部分,我进一步观察到使用 . Activate特定的 VBComponent 项目可以防止错误。并且它的属性可以很容易地访问。尝试下面的简单循环,无论有没有Vbc.Activate在包含多个用户表单和模块的任何 Excel 文件中
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 \nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |