VBA プロジェクト
VBA プロジェクト
このガイドでは、Aspose.Words FOSS for .NET を使用して、マクロ有効ドキュメントに埋め込まれた VBA プロジェクトを検査および変更する方法を示します。Aspose.Words FOSS for .NET は、マクロ有効ドキュメント (.docm) に埋め込まれた VBA プロジェクト(そのモジュール、ソースコード、ライブラリ参照)を Document.VbaProject と VbaProject/VbaModule オブジェクトモデルを通じて検査および変更できます。これはプロジェクトの検査と編集であり、マクロの実行ではありません:Aspose.Words は商用製品でもこの FOSS エディションでも VBA ランタイムを一度も含んでいないため、VBA コードはデータとして読み取り・変更され、実行されません。
ドキュメントの VBA プロジェクトへのアクセス
Document.VbaProject は VbaProject を返します。ドキュメントに VBA プロジェクトがない場合は null が返ります。Document.HasMacros は、先に VbaProject にアクセスすることなく VBA プロジェクトの有無を報告します。VbaProject.Name、CodePage、IsSigned、および IsProtected はプロジェクト自体を説明します。
モジュールの読み取りと編集
VbaProject.Modules は VbaModuleCollection を返します。名前でインデックスして特定のモジュール(例: modules["ModuleName"])を検索するか、コレクション全体を列挙できます。各 VbaModule はその Name、Type(VbaModuleType: DocumentModule、ProceduralModule、ClassModule、または DesignerModule のいずれか)、そして重要なことに、書き込み可能な文字列プロパティとして SourceCode を公開します。これによりモジュールのソースをプログラムで読み取り、書き換えることが可能です。VbaModuleCollection.Add(vbaModule) と Remove(module) はプロジェクトからモジュールを追加または削除します。
ライブラリ参照
VbaProject.References は VbaReference オブジェクトの VbaReferenceCollection を返します — マクロコードが依存する Automation タイプ ライブラリやその他の VBA プロジェクトです。VbaReference.Type は VbaReferenceType(Registered、Project、Original、または Control)を報告し、LibId は参照されているライブラリを識別します。VbaReferenceCollection.Remove(item) / RemoveAt(index) は参照を削除します。
VBA プロジェクトの削除
Document.RemoveMacros() はドキュメントから VBA プロジェクトを完全に除去します — 元々マクロ付きで配布されたドキュメントのマクロなしコピーを作成するのに便利です。
ヒントとベストプラクティス
- マクロが一度も存在しなかったドキュメントでの null 処理を回避するため、
Document.VbaProjectに手を加える前にDocument.HasMacrosを確認してください。 VbaModule.SourceCodeをプレーンテキストとして扱ってください — VBA ランタイムが存在しないため、編集してもコードの検証は行われません。構文が壊れた VBA でもラウンドトリップは可能ですが、修正されるまで Word で正しく実行されません。- モジュールを変更しようとする前に、署名済みまたは保護されたプロジェクトを検出するために
VbaProject.IsSigned/IsProtectedを使用してください。 Document.RemoveMacros()は、各モジュールを手動でクリアする代わりに、“クリーン” な配布コピー用にマクロを除去する最も簡単な方法です。
一般的な問題
| 問題 | 原因 | 修正 |
|---|---|---|
Document.VbaProject は null です | このドキュメントには VBA プロジェクトがありません | Document.HasMacros を先に確認し、VbaProject のメンバーにアクセスしてください |
SourceCode を編集した後にマクロが実行されることを期待しています | Aspose.Words には VBA 実行エンジンがありません | このAPIを使用してマクロのソースと構造のみを読み取り/変更してください;結果として得られるドキュメントは、Microsoft Word のような VBA ランタイムがある環境で実行し、コードを実行します |
名前でVbaModuleCollectionをインデックスすると何も返されません | モジュール名が一致しません(大文字小文字または正確な綴り) | 正確なモジュール名を確認するためにVbaProject.Modulesを列挙してください |
FAQ
Aspose.Words の .NET 用 FOSS は、ドキュメント内で VBA マクロを実行できますか?
いいえ。このエディションも商用の Aspose.Words 製品も、VBA 実行エンジンを含んでいません — VBA プロジェクトはデータとして読み取り・変更されます(モジュールのソース、参照、プロジェクトメタデータ)、実行はされません。
マクロのソースコードはどのように読み取りますか?
名前で VbaProject.Modules をインデックス付けしてモジュールを取得し(例: modules["ModuleName"])、その SourceCode プロパティを読み取ります。
ドキュメントに全く新しい VBA モジュールを追加できますか?
はい — VbaModule を作成し、Add(vbaModule) を通じてプロジェクトの VbaModuleCollection に追加します。
処理する前に、ドキュメントにマクロがあるかどうかを確認するにはどうすればよいですか?
まず Document.VbaProject にアクセスせずに、Document.HasMacros を読み取ります。ドキュメントが VBA プロジェクトを含んでいる場合は true です。
ドキュメントからすべてのマクロを除去するにはどうすればよいですか?
Document.RemoveMacros() を呼び出す。
API Reference 概要
| クラス / メソッド | 説明 |
|---|---|
Document.VbaProject | ドキュメントのVbaProject、またはマクロがない場合はnull |
Document.HasMacros | VBA プロジェクトが存在するかどうか |
VbaProject | Name, Modules, References, CodePage, IsSigned, IsProtected |
VbaModule | 1つのモジュール: Name, Type (VbaModuleType), 書き込み可能 SourceCode |
VbaModuleCollection | Add(), 名前でインデックス付け, Remove(), Count |
VbaReference / VbaReferenceCollection | 参照されている型ライブラリ: Type (VbaReferenceType), LibId |
Document.RemoveMacros() | 文書から VBA プロジェクトを削除します |