以前書いた記事でSharpDevelopを使ってExcel用のCOMアドインを作成する方法について説明しましたが、最近のWindows PCには標準でC#のコンパイラが入っているので(環境によっては入っていませんが、ここではそういった環境は横に置いておきます)、わざわざ重いIDEを使わなくても、メモ帳などの軽いテキストエディタだけで、VBAから扱えるマネージドなDLLを作成することができます。
C#コンパイラ(csc.exe)の場所
C#のコンパイラの実体は「csc.exe」で、私の環境(Windows 7 32ビット版)だと下記フォルダにファイルがありました。
- C:\Windows\Microsoft.NET\Framework\v2.0.50727
- C:\Windows\Microsoft.NET\Framework\v3.5
- C:\Windows\Microsoft.NET\Framework\v4.0.30319
インストールされている.NET Frameworkのバージョンや、32ビット/64ビットの違いで場所が異なる場合がありますが、ファイルの場所が分からない場合には、ファイル名「csc.exe」で端末内のファイルを検索すると良いでしょう。
簡単なコードを書いてみる。
コンパイラの場所を確認したところで、次は実際にコードを書いてみます。
using System; using System.Web; using System.Text; using System.ComponentModel; using System.Runtime.InteropServices; namespace EncodeAddIn { [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("8b54658b-feba-4b47-aab7-e0ad5b5b75fa")] public interface IEncode { [Description("指定した文字列をURLエンコードします。")] string EncodeUrl(string target, string enc); } [ClassInterface(ClassInterfaceType.None), ProgId("Encode.AddIn"), Guid("6c261343-a165-4b5d-bd6d-c59e2d4d1ad5")] public class Encode:IEncode { /// <summary> /// 指定した文字列をURLエンコードします。 /// <param name="target">対象となる文字列です。</param> /// <param name="enc">エンコード方式を文字列で指定します。</param> /// </summary> public string EncodeUrl(string target, string enc) { try { return HttpUtility.UrlEncode(target, Encoding.GetEncoding(enc)); } catch (Exception e) { return e.Message; } } } }
指定した文字列を指定したエンコード方式でURLエンコードするだけの、簡単なプログラムです。
上記コードをテキストエディタに貼り付けた後、UTF-8形式で保存します(保存先はとりあえず C:\Test\cs\EncodeAddIn.cs ファイル)。
VBAから呼び出すために、ComVisibleやClassInterfaceといった属性を指定していますが、詳しくはsupermab氏のブログ記事「Excel から使うマネージDLL を作る。」をご参照ください。
必要な説明が大体載っています。
また、上記コード中にあるGuid属性の値は「Generate GUIDs online」等のサービスやツールを使って生成したものをお使いください。
ソースコードのコンパイル
プログラムが書けたら、次はコンパイル作業を行います。
コマンド プロンプトを起動し、下記コマンドを実行します。
※ csc.exeのパスや出力先、ソースコードの場所は環境に応じて変更してください。
コンパイルが終わると、下図のようにDLLファイルが作成されます。
上記コードでは、targetやoutといったオプションを指定していますが、csc.exeのオプションについては「C# コンパイラ オプションの一覧」をご参照ください。
RegAsm.exe(アセンブリ登録ツール)によるDLLの登録
作成したDLLファイルはRegAsm.exe (アセンブリ登録ツール)を使ってレジストリに登録する必要があります。
RegAsm.exeは、私の環境(Windows 7 32ビット版)だと下記フォルダにファイルがありました。
- C:\Windows\Microsoft.NET\Framework\v2.0.50727
- C:\Windows\Microsoft.NET\Framework\v4.0.30319
使用手順は下記のようになります。
- コマンド プロンプトを管理者権限で起動します。
- 下記コマンドを実行し、DLLファイルの登録を行います。
- 厳密な名前付きアセンブリではないので警告は表示されますが、登録自体は無事に終わります(registered successfully)。
※ RegAsm.exeのパスや出力先、DLLファイルの場所は環境に応じて変更してください。
逆にDLLファイルの登録を解除する場合は、下記のように「/u」(/unregister)オプションを付けてRegAsm.exeを実行します。
この面倒なRegAsm.exeによる登録・解除作業をドラッグ&ドロップで行うスクリプトを以前書いたことがあるので、興味がある方は下記ページのスクリプトもお試しください。
・ドラッグされたマネージドDLLをRegAsmで登録するスクリプト
https://kinuasa.wordpress.com/2011/04/07/%e3%83%89%e3%83%a9%e3%83%83%e3%82%b0%e3%81%95%e3%82%8c%e3%81%9f%e3%83%9e%e3%83%8d%e3%83%bc%e3%82%b8%e3%83%89dll%e3%82%92regasm%e3%81%a7%e7%99%bb%e9%8c%b2%e3%81%99%e3%82%8b%e3%82%b9%e3%82%af%e3%83%aa/
以上の作業で、C#で書いたDLLをVBAから呼び出せるようになります。
VBAからの呼び出し
VBEの参照設定を開くと、RegAsm.exeで登録したライブラリが表示されるのが確認できます。
関数もちゃんと表示され、
インテリセンスも効きます。
もちろん、下図のようにレイトバインディングで呼び出すこともできます。
コンパイルやレジストリへの登録といった、多少の手間は掛かりますが、.NETの巨大なライブラリが使えるようになるメリットは非常に大きく、VBAで書くと煩雑になる処理も.NETで書けばほんの数行で終わる!・・・こともありますので、VBAで長々とコードを書くのが苦手な方は一度試してみてはいかがでしょうか。
参考Webサイト
- Excel から使うマネージDLL を作る。 | supermab’s blog
- http://supermab.com/wp/excel-%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8dll-%E3%82%92%E4%BD%9C%E3%82%8B%E3%80%82/
- Windows 7 の csc.exe で遊んでみる | PaePoi
- http://palepoli.skr.jp/wp/2010/01/12/windows-7-%E3%81%AE-csc-exe-%E3%81%A7%E9%81%8A%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B/
- Visual Studioではなく、Windows付属のcsc.exe だけでC#実行ファイルを作る – Qiita
- http://qiita.com/toshirot/items/dcf7809007730d835cfc
- VBAまたはVBSからCOM経由で使用できる.NETのライブラリの作成方法 – Qiita
- http://qiita.com/mima_ita/items/efcd1a6ea86f09047984
この記事へのコメントはありません。