【C#】C#からExcelVBAのマクロを呼び出すには

この記事では、C#からExcelVBAのマクロを呼び出す方法についてご説明します。

【動画】C#からExcelVBAのマクロを呼び出す実際の動き

本題に入る前に、まずは次の動画をご覧ください。


Excelアプリケーションのインスタンスを生成し、Excelファイルを開きます。

Excelファイルを開いたらマクロを実行しています。

コードの流れ

STEP.1
Excelインスタンスを生成する
Excelインスタンスを生成します。
STEP.2
マクロが含まれるExcelファイルのフルパス、モジュール名、サブルーチン名を取得する
マクロが含まれるExcelファイルのフルパス、モジュール名、サブルーチン名を取得します。
STEP.3
マクロを実行する
マクロを実行します。
STEP.4
Excelを閉じる
Excelを閉じます。
STEP.5
COMオブジェクトへの参照を解放する
COMオブジェクトへの参照を解放します。

ExcelファイルのマクロとC#のフォームの例

Excelファイルのマクロ

今回は下のExcelファイルのマクロを用意しました。

Option Explicit

Sub test()

    MsgBox "テスト"

End Sub

Sheet1のシートモジュールにあるtestサブルーチン内にメッセージボックスを表示させるコードが存在しています。

C#のフォーム

今回は下のC#のフォームを用意しました。

フォーム上には、マクロが含まれるExcelファイルのフルパス、モジュール名、サブルーチン名を入力するテキストボックスが設置されています。

実行ボタンをクリックすると、マクロが含まれるExcelファイルが開き、モジュール名とサブルーチン名を参照してコードを実行します。

今回はSheet1のシートモジュールにあるtestサブルーチンを実行するため、以下の通りにシートモジュール名とサブルーチン名を入力しました。

実行ボタンをクリックすると、以下の通りにメッセージボックスが出力されました。

C#のコード(例)

注意
今回のコードはCOMオブジェクトを扱うので、コードが終了した後にExcelのプロセスが残っていないか確認・テストを行ってから自己責任でご参照・利用ください。
using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace wfcs_0064
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Excelアプリケーションのインスタンスを生成する
            Excel.Application excelApp = new Excel.Application();

            try
            {
                // Excelファイルのフルパスを取得する
                string excelFile = txb_excelFilePath.Text;

                // モジュール名を取得する
                string mdlNM = txb_mdlNM.Text;

                // サブルーチン名を取得する
                string sbrNM = txb_sbrNM.Text;

                // マクロが含まれるExcelファイルを開く
                Excel.Workbook workbook = excelApp.Workbooks.Open(excelFile);

                // マクロを実行する
                excelApp.Run(mdlNM + "." + sbrNM);

            }
            catch (Exception ex)
            {
                // エラーが発生した場合にエラーメッセージを表示させる
                MessageBox.Show("エラーが発生しました: " + ex.Message);
            }
            finally
            {
                // Excelアプリケーションを閉じる
                excelApp.Quit();

                // COMオブジェクトへの参照を解放する
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

                // ガベージコレクションを実行する
                GC.Collect();

                // ガベージコレクションが完了するまで待機する
                GC.WaitForPendingFinalizers();
            }
        }
    }
}

注目すべきコード①

最初に見て頂きたいのは3行目です。

using Excel = Microsoft.Office.Interop.Excel;

コードの説明

以上のコードは、C#プログラム内でMicrosoft.Office.Interop.Excel名前空間を短い形式で参照できるようにするコードです。

コード内で毎回「Microsoft.Office.Interop.Excel」と書くとコードが長くなるので、「Microsoft.Office.Interop.Excel」を「Excel」の文字列に置き換えることができ、コードが読みやすくなります。

注目すべきコード②

次に見て頂きたいのは17行目です。

            // Excelアプリケーションのインスタンスを生成する
            Excel.Application excelApp = new Excel.Application();

コードの説明

以上のコードは、Excelアプリケーションのインスタンスを生成するコードです。

このインスタンスを生成することでExcelファイルを開いたり、マクロを閉じるなどの操作が可能になります。

注目すべきコード③

次に見て頂きたいのは22行目から28行目です。

                // Excelファイルのフルパスを取得する
                string excelFile = txb_excelFilePath.Text;

                // モジュール名を取得する
                string mdlNM = txb_mdlNM.Text;

                // サブルーチン名を取得する
                string sbrNM = txb_sbrNM.Text;

コードの説明

以上のコードは、マクロが含まれるExcelファイルのフルパス、モジュール名、サブルーチン名を取得する処理のコードです。

注目すべきコード④

次に見て頂きたいのは31行目です。

                // マクロが含まれるExcelファイルを開く
                Excel.Workbook workbook = excelApp.Workbooks.Open(excelFile);

コードの説明

以上のコードは、Excelファイルを開く処理のコードです。

OpenメソッドにExcelファイルのフルパスを指定して実行するとExcelファイルが開きます。

注目すべきコード⑤

次に見て頂きたいのは34行目です。

                // マクロを実行する
                excelApp.Run(mdlNM + "." + sbrNM);

コードの説明

以上のコードは、マクロを実行する処理のコードです。

Runメソッドの引数に「モジュール名」+「.」+「サブルーチン名」(例:Sheet1.test)のとおりに指定して実行することでマクロが実行されます。

注目すべきコード⑥

次に見て頂きたいのは37行目から41行目です。

            catch (Exception ex)
            {
                // エラーが発生した場合にエラーメッセージを表示させる
                MessageBox.Show("エラーが発生しました: " + ex.Message);
            }

コードの説明

以上のコードは、エラーが発生した場合のハンドリングを行う処理のコードです。

今回はエラーが発生した場合に40行目でエラーメッセージを出力しています。

注目すべきコード⑦

次に見て頂きたいのは45行目から48行目です。

                // Excelアプリケーションを閉じる
                excelApp.Quit();

コードの説明

以上のコードは、Excelアプリケーションを閉じる処理のコードです。

注目すべきコード⑧

次に見て頂きたいのは48行目です。

                // COMオブジェクトへの参照を解放する
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

コードの説明

以上のコードは、COMオブジェクトへの参照を解放(Accessのプロセスの終了)する処理のコードです。

ReleaseComObjectメソッドの引数にExcelアプリケーションのインスタンスを指定して実行することで、COMオブジェクトへの参照が解放されます。

注目すべきコード⑨

次に見て頂きたいのは51行目から54行目です。

                // ガベージコレクションを実行する
                GC.Collect();

                // ガベージコレクションが完了するまで待機する
                GC.WaitForPendingFinalizers();

コードの説明

以上のコードは、.NETのガベージコレクタに対して、利用可能なメモリを解放するように指示するコードです。

また、ファイナライザが呼び出されるのを待つようにガベージコレクタに指示します。

以上のコードにより、オブジェクトが使用していたリソースを適切に解放することができます。

EXCELのプロセスが残ってしまうのを以上のコードで回避します。

ただし、以上のコードを頻繁に呼び出すとパフォーマンスに影響を及ぼす可能性があります。

動作確認

ExcelファイルのマクロとC#のフォームの例」をご覧ください。

最後に

この記事では、C#からExcelVBAのマクロを呼び出す方法についてご説明します。

C#からExcelVBAのマクロを呼び出したい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら