Excel

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関連

    段落内改行を一括置換するOutlookマクロ

    「段落内改行 置換 Outlook マクロ」といったキーワードでのアク…

  2. Excel

    「印刷の向き」の変更を検知するExcelマクロ

    MSDNフォーラムに「「印刷の向き」の「縦」「横」ボタンがクリックされ…

  3. Office関連

    Office 365 APIをVBAから呼び出す(2)

    前回の記事ではOffice 365とAzure ADの紐づけを行いまし…

  4. Office関連

    [Excel Services ECMAScript]アクティブセルが変更されたときのイベントを利用…

    埋め込んだExcelワークブックの、アクティブセルが変更されたときのイ…

  5. Excel

    Wikipediaの検索予測キーワードの一覧を取得するVBAマクロ

    Wikipediaのサーチボックスにキーワードを入力すると、入力したキ…

  6. Excel

    Acrobatを利用してPDFファイルのページ数を取得するVBAマクロ

    前回の記事ではPowerShell+iTextSharp、前々回の記事…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP