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サイト

Excel 2016 PreviewではPower Queryが標準機能になりました。前のページ

文書が互換モードかどうかを判定するWordマクロ次のページ

関連記事

  1. Excel

    UI Automationの参考資料

    VBAからUI Automationを扱う際に参考になりそうな資料への…

  2. Office関連

    Microsoft Graph SDK for PHPを使ったAPIの呼び出しサンプル

    知らない間に(恐らくBuild 2017のタイミングに合わせて)Mic…

  3. Office関連

    ExcelとPowerPointに自動保存機能が追加されました。

    Excel 2016を使っていて、ふと気が付いたのが画面左上にある「自…

  4. Office関連

    蛍光ペンでマークした部分の文字数をカウントするWordマクロ

    Twitterでたまたま下記のツイートを見つけたので、簡単な処理を考え…

  5. Office関連

    “元に戻す”履歴に文字列をセットするPowerPointマクロ

    PowerPointマクロでは、Presentationオブジェクトの…

  6. Office関連

    マクロで実行したいコマンドのIDを調べる簡単な方法

    MSDN フォーラムに下記質問がありました。・Excel-VB…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP