質問: 私のやりたいことは、Excelのあるbookにあるマクロを、他のbookのマクロ記述部分に移植することを自動ですることです。 Excelでc#(VB.NET)からの多言語からアクセスできるのはせいぜい「セル」ぐらいであることは知っているのですが、 vbaをc#(VB.NET)から実行できるということを聞き(https://webbibouroku.com/Blog/Article/run-macro)、 じゃあvbaからなら「.dll」等を経由して(https://www.ka-net.org/blog/?p=5464)(こちらの事例はエクセルが不要?と書いてあるが不明 http://nami-it.net/archives/5750154.html) 他のbook内に組こまれているvbaを参照できるのではないかと単純に思い、探してみましたがないので、質問しました。 vbaを他言語からのバッチ処理として動作させる上で、実行できる範囲について教えてください。 (ここでいう実行できる範囲というのはvbaを使って、他のbookのvbaをテキストのごとく持ってきて貼り付けられることができたりするのかとか、それとも間接的に移植が可能であるような機能があるのかとかです。) 宜しくお願いします。 他参考にしたもの (https://stackoverflow.com/questions/40956465/vba-to-copy-module-from-one-excel-workbook-to-another-workbook)(一応マクロを別のワークブックにコピーするということで書かれているが、全く処理の内容が把握できない。これで別言語から呼び出して、別のエクセルにマクロが適用できるのか?)
回答: Excelに対するCOM操作で、 * モジュール内のコードを文字列として取得・設定 * モジュールのインポート・エクスポート などを行うことはできます。 質問に記載されている や Zuishinさんの回答にある Excelマクロ抽出スクリプト - Qiita がCOM経由での操作の例になります。 該当の処理を行うためのオブジェクト群のタイプライブラリはExcelとは別となっており `Microsoft Visual Basic for Applications Extensibility 5.3`のライブラリを参照する必要があります。 制限 === COM経由で操作する場合は予め * Excelのセキュリティ設定の変更 * VBAのプロジェクトにパスワードが設定されている場合パスワードの解除 をしておく必要があります。 上記Excelマクロ抽出スクリプト - Qiitaの記事内では Excelのセキュリティ設定の変更の方法および、パスワード解除の自動化も記載されています。 #### 参考 以下PowerShellのコードですがおおよそのイメージは掴めるかと思います。 ``` # Excel取得 # Excel.Application $xl = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application') # Excel.Workbook $wb = $xl.ActiveWorkbook # 以降セキュリティの制限の解除が必要 # VBIDE = Microsoft Visual Basic for Applications Extensibility 5.3 # VBIDE.VBProject $project = $wb.VBProject # VBIDE.VBComponent = モジュール $module1 = $project.VBComponents.Item('Module1') # VBIDE.CodeModule = モジュールのコード部分 $codeModule = $module1.CodeModule # System.String 全行を文字列として取得 $codeTxt = $codeModule.Lines(1, $codeModule.CountOfLines) Write-Output $codeTxt ```