C#でマクロ(VBA)を実行したい。【C#】

目次

経緯

VBAをC#に移植していたのですが、VBAのコードが複雑かつ長文で萎えていました。

「なんなら、C#でVBAを実行すればいいんじゃね?」と思い、

今回勉強しました。

「xlApp.Run(“マクロ名”);」を使用する

まず、プログラムの流れを説明します。

  1. ボタン1を押す
  2. ダイアログが出てきて、マクロを実行したいExcelファイルを選ぶ
  3. macroが実行されて保存される。

という流れです。下が中身です。

private void btn_1_Click(object sender, EventArgs e)
        {

            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                Filter = "Excelファイル (*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|すべてのファイル (*.*)|*.*",
                Title = "Excelファイルを選択してください"
            };

            if (openFileDialog.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            string filePath = openFileDialog.FileName;

            Excel.Application xlApp = new Excel.Application();

            try
            {
                // ダイアログで選択されたワークブックを開く
                Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(filePath);

                // マクロが保存されているワークブックを開く
                Excel.Workbook macroWorkbook = xlApp.Workbooks.Open(@"C:\Users\mori\OneDrive \デスクトップ\macro.xlsm");

                // 選択したExcelファイルをmacro.xlsmのワークシートとしてコピーする
                Excel.Worksheet sourceWorksheet = xlWorkbook.Worksheets[1];
                sourceWorksheet.Copy(After: macroWorkbook.Worksheets[macroWorkbook.Worksheets.Count]);

                // コピーしたワークシートをアクティブにする
                Excel.Worksheet copiedWorksheet = macroWorkbook.Worksheets[macroWorkbook.Worksheets.Count];
                copiedWorksheet.Activate();

                try
                {
                    // マクロを実行
                    xlApp.Run("macro1");
                    
                    // マクロの実行後、コピーしたワークシートを元のワークブックに戻す
                    copiedWorksheet.Copy(After: xlWorkbook.Worksheets[xlWorkbook.Worksheets.Count]);
                    Excel.Worksheet newWorksheet = xlWorkbook.Worksheets[xlWorkbook.Worksheets.Count];

                    // 元のワークシートを削除する
                    sourceWorksheet.Delete();

                    MessageBox.Show("マクロが正常に実行されました。", "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"エラー: {ex.Message}", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    // コピーしたワークシートを削除する
                    copiedWorksheet.Delete();

                    // マクロが保存されているワークブックを閉じる
                    macroWorkbook.Close(false);

                    // 元のワークブックを保存する
                    xlWorkbook.Save();

                    // ダイアログで選択されたワークブックを閉じる
                    xlWorkbook.Close(false);

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

                    // COMオブジェクトをリリース
                    Marshal.ReleaseComObject(copiedWorksheet);
                    Marshal.ReleaseComObject(sourceWorksheet);
                    Marshal.ReleaseComObject(macroWorkbook);
                    Marshal.ReleaseComObject(xlWorkbook);
                    Marshal.ReleaseComObject(xlApp);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

長々書いていますが、大事なのは2点で一つ目が

// マクロが保存されているワークブックを開く 
Excel.Workbook macroWorkbook = xlApp.Workbooks.Open(@"C:\Users\mori\OneDrive \デスクトップ\macro.xlsm"); 

の部分です。ここは、実行したいマクロが入っている.xlsmファイルのパスを()内に入れてください。

もう一つは、

// マクロを実行 
xlApp.Run("macro1");                    

です。()内に実行したいマクロの名前を書いてください。(Subと書いて、名前を記入しているあれです。)

私はこんな感じでうまくいきました。

参考になれば、幸いです。

ここまで読んでいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次