Office関連

VBAから扱えるDLLをC#で書いてみる。

以前書いた記事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のパスや出力先、ソースコードの場所は環境に応じて変更してください。

csharp_vba_dll_01

コンパイルが終わると、下図のようにDLLファイルが作成されます。

csharp_vba_dll_02

上記コードでは、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

使用手順は下記のようになります。

  1. コマンド プロンプトを管理者権限で起動します。
  2. 下記コマンドを実行し、DLLファイルの登録を行います。
  3. ※ RegAsm.exeのパスや出力先、DLLファイルの場所は環境に応じて変更してください。

  4. 厳密な名前付きアセンブリではないので警告は表示されますが、登録自体は無事に終わります(registered successfully)。
  5. csharp_vba_dll_03

逆にDLLファイルの登録を解除する場合は、下記のように「/u」(/unregister)オプションを付けてRegAsm.exeを実行します。

csharp_vba_dll_04

この面倒な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で登録したライブラリが表示されるのが確認できます。

csharp_vba_dll_05

関数もちゃんと表示され、

csharp_vba_dll_06

インテリセンスも効きます。

csharp_vba_dll_07

csharp_vba_dll_08

もちろん、下図のようにレイトバインディングで呼び出すこともできます。

csharp_vba_dll_09

コンパイルやレジストリへの登録といった、多少の手間は掛かりますが、.NETの巨大なライブラリが使えるようになるメリットは非常に大きく、VBAで書くと煩雑になる処理も.NETで書けばほんの数行で終わる!・・・こともありますので、VBAで長々とコードを書くのが苦手な方は一度試してみてはいかがでしょうか。

参考Webサイト

関連記事

  1. Office関連

    日本語の文法上の誤りを列挙して修正候補をコメントとして追加するWordマクロ

    前回の記事の関連で、今度は日本語の文法上の誤りを列挙して修正候補をコメ…

  2. リボン関連

    「クイックアクセスツールバーからPowerPointマクロを実行するアドイン」のコード

    2年ほど前に書いたPowerPointマクロの記事「クイックアクセスツ…

  3. Office関連

    Excel 2016でマップグラフを作成する。

    12月6日、Office Insider向けに、Office 2016…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP