gpt4 book ai didi

excel - 将用户表单导入 VBComponents 后,无法读取属性

转载 作者:行者123 更新时间:2023-12-02 06:37:05 25 4
gpt4 key购买 nike

我尝试导入用户表单:

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

在执行过程中出现错误

-2147467259 (80004005) raises (method 'properties' for the object '_VBComponent' has failed)

尽管用户表单已正确导入 - 我可以在公式窗口中看到它。

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

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

编辑:

这是一个完整的示例:

  • 创建一个新的 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

最佳答案

这实际上并不是问题的答案,而是一些观察,并且可能是模糊的结论。我修改了测试代码并放置了 Debug Print … With .Import 之后的声明 block 有一个模糊的想法“让 VBE 首先完成导入并在查询其属性之前让它位于 VBComponents 集合中”。它奏效了。

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

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

编辑2:关于我的问题的第二部分,我进一步观察到使用 . Activate对于特定的 VBComponent 项,可以防止出现错误。而且它的属性可以很容易地访问。尝试使用和不使用 Vbc.Activate 下面的简单循环任何包含多个用户表单和模块的 Excel 文件中的一行都可以演示它。

Dim Vbc As VBComponent
For Each Vbc In ThisWorkbook.VBProject.VBComponents
If Vbc.Type <> 100 Then ‘ to exclude worksheets
Vbc.Activate ‘ Try with or Without this line
Debug.Print Vbc.Name & " has " & Vbc.Properties.Count & " Properties"
End If
Next Vbc

关于excel - 将用户表单导入 VBComponents 后,无法读取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43703642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com