2013-04-04 140 views
3

我有一个朋友在Excel中使用VBA项目。这个项目有很多表单弹出,并在电子表格被使用时执行各种功能。其中一些有复杂的Form_Initialize方法依赖于其他已经存在的东西(当项目按预期使用时,这不是问题)。访问没有窗体实例的VBA用户窗体控件

我们试图在应用程序内的每个表单上打印出每个控件的名称。我们的问题是VBA.UserForms集合只包含已经实例化的表单,我们不能在没有执行它们的Form_Initialize方法的情况下实例化所有表单。

例如:

For Each f In VBA.UserForms 
    Debug.Print f.Name 
    Debug.Print "----------------------" 

    For Each c In f.Controls 
     Debug.Print c.Name 
    Next c 
Next f 

什么都不做,如果没有形式已经使用/加载。此代码:

For Each c in frmConfig.Controls 
    Debug.Print c.Name 
Next c 

首先执行frmConfig.Form_Initialize(),然后通过形式印刷自己的名字上的控制回路。这个崩溃,因为在这个表单可用之前需要发生的事情还没有发生。

是否有可能获得窗体上的控件的名称没有实例化窗体(避免执行frmConfig.Form_Initialize())?

任何帮助非常感谢!

+1

+ 1美丽的问题..迫使我思考了一段时间:) – 2013-04-04 11:39:58

+0

你有没有想过具有第二(可选)构造函数初始化? – 2013-04-04 11:40:20

+0

@mehow:是的,这已经被考虑过了,但是这是我们想要做的一次性工作,将ctor逻辑转换为不同的函数几乎与在设计视图中打开表单并记下所有控件名称一样耗时手动... – 2013-04-04 11:48:44

回答

2

这是你正在尝试?

Option Explicit 

Sub FindObjects() 
    Dim vbc As VBIDE.VBComponent 
    Dim frm As Object 
    Dim Ctrl As MSForms.Control 

    For Each vbc In ThisWorkbook.VBProject.VBComponents 
     If vbc.Type = vbext_ct_MSForm Then 
      With VBA.UserForms 
       On Error Resume Next 
       Set frm = .Add(vbc.Name) 
       Debug.Print "Found userform :" & vbc.Name 
       If Err.Number = 0 Then 
        For Each Ctrl In frm.Controls 
         Debug.Print "Controls in Userform " & vbc.Name & _ 
         " - " & Ctrl.Name 
        Next Ctrl 
       End If 
       On Error Go To 0 
      End With 
     End If 
    Next vbc 
End Sub 

IMP

  1. 设置参考到Microsoft Visual Basic for Applications扩展
  2. 在Excel选项中,设置 “信任对VBA项目对象模型”

屏幕截图

enter image description here

随访

由于这是一次性的事情,这样做

  1. 打开VBA项目
  2. CTRL + ˚F
  3. 做如图所示在下面的屏幕截图中,然后运行码。
  4. 关闭文件不保存,一旦你已经得到了你所需要的

enter image description here

+0

添加一个'Private Sub UserForm_Initialize'方法,其中包含'Debug.Print“Hello”'给你的一个表单,你会发现它出现在你的输出中:(但是,无论如何感谢!! – 2013-04-04 11:47:18

+0

I只是注意到你在上面提到这是一次性的事情,这是否正确?如果是,那么我可能会为你解决一个问题... – 2013-04-04 11:58:37

+0

是啊 - 当然是... – 2013-04-04 12:02:42