2009-07-29 17 views
1

我想從c#使用VBA可擴展互操作找到msform上的所有控件。找到msform上的所有控件從c#

我可以用查找所有形式:

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

+0

我覺得這個問題是到傳承與互操作。 '通用'Designer對象應該從窗體互操作中繼承控件對象。看來vb.net會自動執行此轉換...但我不知道如何! – jedd 2009-08-04 10:44:22

回答

4

此代碼應工作:

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); 
     ... 
    } 
}