welcome to tetsuyanbo web site!!

tetsuyanbo

C# VBA

C#メモ Excelファイルの標準モジュールに作ったSubプロシージャやらFunctionプロシージャを呼び出してみる

更新日:

野暮用で試したので。

ポイントはこんな感じ。

  • ExcelのVBAでSubプロシージャやFunctionプロシージャはC#から呼び出されるための特別な書き方をしなくてOK
  • Visual Studioのプロジェクト参照設定で"Microsoft Excel X.X Object Library"ってのを追加しておく
    ※X.Xは数値でPCにインストールしてあるExcelのバージョン
  • Microsoft.Office.Interop.Excel.Application.Runメソッドで取り扱うExcelのパスと必要に応じてVBAに渡す引数を指定する
  • C#側でExcelに関係するオブジェクトはSystem.Runtime.InteropServices.Marshal.ReleaseComObjectメソッドで明示的に解放する

準備したサンプルのExcel VBAマクロはこんな感じ。
マクロの動きとしては単にダイアログを表示するだけ。
SubプロシージャとFunctionプロシージャでそれぞれ引数ありなし、それとは別にFunctionプロシージャは戻り値ありを定義。

んで、実際にVBAマクロを呼び出すC#のコードはこんな感じ。

で、実行してみるとこんな感じ。
まずは、動作としてはこんな感じでダイアログが順番に表示される。

  1. 引数なしのSubプロシージャを呼び出したときに表示されるダイアログはこんな感じ。
    Subプロシージャが呼び出されとる。
  2. 引数ありのSubプロシージャを呼び出したときに表示されるダイアログはこんな感じ。
    C#側から渡した引数はVBA側で受け取れているみたい。
  3. 引数なしのFunctionプロシージャを呼び出したときに表示されるダイアログはこんな感じ。
    Functionプロシージャが呼び出されとる。
  4. 引数ありのFunctionプロシージャを呼び出したときに表示されるダイアログはこんな感じ。
    Subプロシージャと同じくC#側から渡した引数はVBA側で受け取れているみたい。
  5. 戻り値ありのFunctionプロシージャを呼び出したときに表示されるダイアログはこんな感じ。
    戻り値云々のメッセージを表示しているけど実際に戻り値がC#側で受け取れたかは呼び出し側で確認することになるので、ここでは戻り値がどんなものかの確認まで。

コンソールはこんな感じで表示される。
VBAのFunctionプロシージャで返した戻り値もちゃんとC#側で受け取れとる(5行目)みたい。

ちなみに、C#側でSubなりFunctionのプロシージャの定義と合わなかったりする(引数の指定がないとか)と、こんな感じのメッセージでC#側で例外が発生するので注意。

今回のコードだと確認用に表示してるからダイアログを閉じないと処理が進まない(C#側に状態遷移しない)けど、VBA側で表示するダイアログがいらんかったらMicrosoft.Office.Interop.Excel.Application.DisplayAlertsプロパティをfalseに設定して抑制するんかなぁ?

そんなこんなで、明日への自分へのメモってことで。

CSharp(CallExcelMethodOnGeneralModule)

adsense 336 x 280

adsense 336 x 280

-C#, VBA
-, , , , , , , , , , , ,

Copyright© tetsuyanbo , 2019 All Rights Reserved Powered by STINGER.