【问题标题】:Find all controls on msform from c#从 c# 中查找 msform 上的所有控件
【发布时间】:2009-07-29 14:16:29
【问题描述】:

我正在尝试使用 VBA 可扩展互操作从 c# 中查找 msform 上的所有控件。

我可以使用 :

找到所有表格
using System;
using Microsoft.Office.Interop.Excel
using  Microsoft.Vbe.Interop;
using  Microsoft.Vbe.Interop.Forms;
.....

 foreach (Microsoft.Vbe.Interop.VBComponent mycom in wb.VBProject.VBComponents)
        {

                 if (mycom.Type == Editor.vbext_ComponentType.vbext_ct_MSForm)

.....

但我在该表单上找不到控件。

我认为它应该看起来像:

....
  foreach (Microsoft.Vbe.Interop.Forms.Control ctrl in Microsoft.Vbe.Interop.VBComponent.Designer.Controls)
....

但无法识别 Controls 集合。

有什么想法吗?


此线程提供了有关我面临的问题的更多信息:

http://groups.google.co.uk/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/e2fe6e6b6335780e/6c17add3bfa50b4e?hl=en&ie=UTF-8&q=msform+designer+c%23#6c17add3bfa50b4e

【问题讨论】:

  • 我认为这个问题归结为继承和互操作。 “通用”设计器对象应从表单互操作中继承控件对象。似乎 vb.net 会自动进行此转换...但我不知道如何!!!

标签: c# excel vba


【解决方案1】:

这段代码应该可以工作:

using System;
using Microsoft.Office.Interop.Excel
using VBA = Microsoft.Vbe.Interop;

...

VBA.Forms.UserForm form;
VBA.Forms.Control c;

foreach (VBA.VBComponent mod in wb.VBProject.VBComponents)
{
    // Use only VBA Forms
    if (!(mod.Designer is VBA.Forms.UserForm)) continue;

    form = (VBA.Forms.UserForm) mod.Designer;

    for (int i = 1; i < form.Controls.Count; i++)
    {
        c = (VBA.Forms.Control)form.Controls.Item(i);
        ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2021-03-02
    • 2011-10-07
    • 2012-09-16
    相关资源
    最近更新 更多