最初は簡単です - VBComponents.Add
はVBComponent
を返します。あなただけの.Name
プロパティを調べることができます。
var module = excelFile.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
Debug.WriteLine(module.Name);
秒1は少しトリッキーです。すべてのVBComponentsをループし、Workbookオブジェクトに固有の2つのものをテストする必要があります。これは、デフォルトではその.Properties
コレクション内.Type
vbext_ct_Document
のと134の特性を持っています:
VBComponent thisWorkbook;
foreach (var module in excelFile.VBProject.VBComponents)
{
var test = module as VBComponent;
if (test.Type == vbext_ComponentType.vbext_ct_Document &&
test.Properties.Count == 134)
{
thisWorkbook = test;
Debug.WriteLine(thisWorkbook.Name);
break;
}
}
EDIT: LINQのソリューションは、このように見えますが、それはあなたがこのようダングリング相互運用機能の参照を残す可能性があります。あなたはそれを試してみたい場合は、それは傷つけることはできません - しかし、Excelが正常にシャットダウンしない場合、それは私が見たい最初の場所のようになります。
var thisWorkbook =
(excelFile.VBProject.VBComponents).Cast<VBComponent>()
.First(x => x.Type == vbext_ComponentType.vbext_ct_Document &&
x.Properties.Count == 134);
EDIT2:としては@Matによって指摘'sMugのコメントでは、プロパティの数はバージョンに固有です。上記の値はおそらくExcel 2013に固有の値です。新しいワークブックの場合、ThisWorkbookモジュールは最も高いプロパティカウントを持つモジュールになります。これは、すべてのバージョンで動作するはずです:
VBComponent thisWorkbook = null;
foreach (var component in excelFile.VBProject.VBComponents.Cast<VBComponent>())
{
if (thisWorkbook == null || component.Properties.Count > thisWorkbook.Properties.Count)
{
thisWorkbook = component;
}
}
Debug.WriteLine(thisWorkbook.Name);
のLINQ:
var thisWorkbook =
excelFile.VBProject.VBComponents.Cast<VBComponent>()
.Aggregate((p, x) => (p.Properties.Count > x.Properties.Count ? p : x));
どのようなオブジェクトタイプ "はThisWorkbook" とは?ワークブックまたはモジュール?編集:また、インデックスでアクセスできませんか?インデックス番号は変わるでしょうか? – Innat3
@ Innat3現在のVBAプロジェクトのコードを含むホスト文書を表すグローバルな「Workbook」インスタンスです。 –
それは意味を成しません、ホスト文書はすでに変数 "excelFile"、私は信じて、あなたが "ThisWorkbook"という名前でモジュールを検索しようとしている – Innat3