Excel-DNA で XLL をつくる(その3)

 前回まで、.dna ファイルに 自作関数を直接記述して、Excel から利用する方法について試してみたわけですが、今回は自作のライブラリを マネージDLL として作成し、これを Excel から利用する方法をやってみます。
IDE として、VisualStudio2010 を使って説明していきます(フリーの VisualStudio2010 Express でも可)。

 なにを作るかというと、サイトで配布している 多倍長整数演算アドインの XLL 版です ⇒ BigInt ダウンロード

 ダウンロードして解凍したら、BigInt(xll).xls を開いてみてください。計算結果に #NAME? エラーが表示されていると思います。次に、同じフォルダにある BigInt.xll をドラグ&ドロップして、アドインを有効にしてみましょう。
(Excel(x64) の場合は、BigInt.dna を BigInt64.dna とリネームしてください。)
F9 ボタンを押して再計算すると、正しく計算されて結果が表示されるはずです。

では、さっそく作っていきましょう。

 VisualStudio2010(以下VS) を立ち上げ、「ファイル」メニューの「新規作成」から、「プロジェクト」をクリックします。
(こんな感じ↓) 今回は C# で書いていきますが、VB.NET でも同じです。
プロジェクトの新規作成

作るのは、クラスライブラリですので、クラスライブラリテンプレートを選択します。
(※このとき、今回使用する .NetFramework 4 を選択しておいてください。)
(こんな感じ↓) 
クラスライブラリテンプレートを選択

これで、空っぽのプロジェクトが作成されました。
(こんな感じ↓)

 まず、これから作成するライブラリの名前空間(namespace)を設定しなおしましょう。いま、ClassLibrary1 と表示されている部分にカーソルをおいて右クリックし、「リファクター」から「名前の変更」をクリックして名前を BigIntXLL に変更します。同じように、Class1 となっているクラス名を、BigIntCalc に変更します。
どんな名前でもいいのですが、今回はBigInt(XLL).xlsのシートを作成してあるので上記の名前としてください。
(こんな感じ↓)
namespace と Class名 を変更する

 次に、System.Numerics を参照設定します。ソリューションエクスプローラの「参照設定」から「参照の追加」をクリックします。
(こんな感じ↓)
System.Numerics を参照設定する

 .Net タブから System.Numerics を選択します。
(こんな感じ↓)
System.Numerics を選択して追加する

 参照設定したので、using 句を追加します。using System.n と入力すると、Intellisence が働いて、Numerics が一覧に表示されます。
(こんな感じ↓)
using 句 を追加する

 これで、コーディングの準備が整いました。
前回、.dna ファイルに記述した加算メソッドを書きます。

        public static string xllAddition(string strX, string strY)
        {
            BigInteger x = BigInteger.Parse(strX);
            BigInteger y = BigInteger.Parse(strY);
            BigInteger ans = BigInteger.Add(x, y);
            return ans.ToString();
        }

このまま記述します。
(こんな感じ↓)
xllAddition メソッドを記述

 もう一つ、xllAddition のオーバーロードメソッドを書いてみましょう。先ほどのコードでは2つの引数に string (文字列)をとっています。でも、Excel のセルには、int (整数) が入っているかもしれません。VBA から呼ばれるときも同様にいろいろな変数が利用できた方が便利です。なので、int (整数)が渡された場合も正常に動作するように、オーバーロードを記述しておきます。

       public static string xllAddition(int intX, int intY)
        {
            BigInteger x = new BigInteger(intX);
            BigInteger y = new BigInteger(intY);
            BigInteger ans = x + y;
            return ans.ToString();
        }

IDE 上で、 BigInteger x = new BigInteger( と入力すると、BigInteger 構造体に実装されているオーバーロードが表示されますので、使い慣れないクラスを利用するときでもわかりやすいですね♪
(こんな感じ↓) この場合9個のオーバーロードがあり、6番目のオーバーロードが引数に int をとることがわかります。
BigInteger コンストラクタのオーバーロード

こんな感じでメソッドを実装してゆくのですが、長くなるので割愛します(笑)
BigInteger 構造体のプロパティー・メソッドなどをヘルプで参照しながら実装していってみると楽しいです^^
面倒な方は、プロジェクトを圧縮したのでダウンロードしてご利用ください。⇒ プロジェクトフォルダのダウンロード
このプロジェクトでは、上記の手順に加え、配布する ファイルをプロジェクトに追加して、ビルド時にコピーされるようにしてあります。
ビルドすると、実行ファイルが bin > release フォルダに生成されます(ページの最初にダウンロードしたのと同じです)。

 最後に、ビルドした BigIntXLL.dll の使い方について。
前回までの方法ですと、メソッド自体を .dna ファイルに記述していましたが、今回は DLL を使います。BigInt.dna ファイルをテキストエディタで開いてみましょう。このように記述されています。

<DnaLibrary RuntimeVersion="v4.0">
<ExternalLibrary Path="BigIntXLL.dll" /> 
</DnaLibrary>

外部のライブラリとして、BigIntXLL.dll を使いますよ。 って宣言してるだけです!これだけ
ですので、配布するときも、BigInt.xll 、BigInt.dna 、 BigIntXLL.dll の3個のファイルを一つのフォルダに入れて配布すれば動作します。(Excel(x64) で動作させたい場合は、BigInt.dna ファイルを BigInt64.dna と名前変更して、BigInt64.xll と一緒に配布します。)

今回は、.NetFramework 4 の機能を使うライブラリを作成して Excel から利用してみました。
わかりにくいところがあれば、コメントしてください。わかる範囲で説明します♪

次回(その4)は、WebAPI を手軽に Excel から利用する方法について書いてみようと思ってます^^
今のところ・・・セルに入力された文字列を、 Google Translate を使って翻訳する関数を作ってみようかと♪

では、また(笑)

This entry was posted in Excel, .NetFramework and tagged . Bookmark the permalink.

14 Responses to Excel-DNA で XLL をつくる(その3)

  1. kinuasa says:

    こんばんは。

    .NET製DLLがこうも簡単に呼べるのは良いですね~。
    セットアッププロジェクト?何それ??なんてレベルになってしまいます(^^)
    DNAすごい!!

    > 今のところ・・・セルに入力された文字列を、 Google Translate を使って翻訳する関数を作ってみようかと♪

    そういえば前にMicrosoft Translator APIで翻訳するVBAコードを書いた記憶があります。
    .NETだと大分コードも短くなるんだろうなぁ~、なんて(^^)

  2. supermab says:

    >こんばんは。

    師匠~♪
    こんばんは! blog リンクありがとうございます!
    コメントでリンクするのも失礼なので、あらためて記事でご紹介させていただきますね♪

    >そういえば前にMicrosoft Translator APIで翻訳するVBAコードを書いた記憶があります。

    ふつうは・・・
    少なくとも、わたしには・・・無理(笑)

    >.NETだと大分コードも短くなるんだろうなぁ~、なんて(^^)

    日本語→英語 とか一方的な翻訳だと・・・
    メソッドの記述としては・・・
    ズルしてますが・・・

    3行です(笑)

  3. y sakuda says:

    一通り眺めてやっと分かった^^
    しかし不思議な代物ですねーー
    ところで、勝手にEWの仲間の所nLinkさせてもらいました。
    http://www16.plala.or.jp/ysakuda/ystop.htm

  4. supermab says:

    >しかし不思議な代物ですねーー

    ですね~。
    どうなってんだ?って感じですよね♪

    >ところで、勝手にEWの仲間の所nLinkさせてもらいました。

    光栄です!
    こちらにもはらせていただきます♪

  5. piza says:

    はじめまして。
    Excel DNAをぜひ使用しようと思っています。(環境:studio2010)
    サンプルを参考に、C#では簡単な関数が作成できたのですが、VB.NETだと
    うまくいきませんでした。(Excelの分類に表示されず)
    C#と同じようにクラスライブラリを作成し、NameSpaceやInterFaceを追加しても(しなくても)だめでした。。
    VB.NETの場合の何か必要なルールなどはあるのでしょうか?(日頃VB.NETばかり使用しているもので)

    • supermab says:

      pizaさん、はじめまして^^

      CS でも VB でも同じはずなんですが、おかしいですね…
      CharpDeverop という IDE があるので使ってみてはいかがでしょう?
      CS ⇔ VB のコードが相互変換できますので、この投稿のプロジェクトを
      ダウンロードして、VB に変換し動作するかどうか?確認してみてください。

      動作すれば、プロジェクトから不要なコードを削除したり、
      必要な処理を記述していくことで目的の処理を記述できると思います♪

      • piza says:

        素早いご返答ありがとうございました。
        早速sharpDeveropをインストールして、C#→VB.NETにコンバートして
        ソースを確認したところ、違いに気付いて修正したところ作動しました。
        修正内容はpublic 関数名 → public shared 関数名
        という感じでした(レベルが低い&dnaと関係ないところでつまづいておりました。。プロのプログラマーではないもので。。)

        DNAを使用する目的は、社内で使用しているVBAで作成したワークシート関数を移植&機能追加することです。
        二度とVBAで作りこみ(というほど大作ではないですが)をしたくないのものでトライしているという感じです。
        VSTOやCOM実装した.NETのdllではパフォーマンスが出なかったので
        (作りの問題かもしれませんが)

        ようやく入口に入れた段階ですが、これからも参考にさせていただきます。
        ありがとうございました。

  6. Piza says:

    おかげさまで作成したい関数のうちの1つが無事完成しました
    パフォーマンスの方もVBAよりもかなり良くて感動しています。
    (これまでの作りが悪かった&処理の無駄を削除したというのもありますが、早いです)
    .NETでDLLを作るだけで良いので本当に助かります。配布も簡単ですし。
    本当に感謝です。今後とも参考にさせていただきます

  7. piza says:

    旧年中はお世話になりました

    >でも、わたしは勝手にレポートしてるだけですから^^
    このサイトがなければ確実に挫折してましたので(というか使うことがなかった)多謝の限りです。
    そうですね、作者にも挨拶すべきですが英作文が全然だめなのでハードルが高いです。。。

    今回の当初の目的はワークシート関数の作成だったのですが、他にも以下のことができましたので
    とりあえず項目だけ紹介いたします。(活用はこれからですが)
    ・.NETで作成したフォームをExcelブックをオーナーにして表示する
    ・Excelのイベント(例えばシートオブジェクトのSelectionChange)に応じた処理を実装する
    (こういったUI作りはvstoでも良いのかもしれませんが)

    ExcelのApplication(とそれ以下)クラスの機能が使用なんでもできるのが
    素晴らしいです。vstoとの使い分けが悩むところですが。。。

  8. Shingo says:

    Excel-DNAに興味があって、さっそくいろいろと実験してます。
    【環境】
    Win7 64bit
    Excel (32bit)
    VS 2010
    Excel-DNA 0.29

    Sampleのdnaとxllを使った実験(このブログのその1とその2に相当)は問題ありませんでした。
    その3に至ってうまく行かなくなりました。
    まずは当記事にあるダウンロードリンクから、サンプルプロジェクトをダウンロードした場合です。
    ClassLibrary1フォルダにある.dnaファイルのExternalLibrary 設定がおかしいと思いましたので修正
    Before) BigIntXll.dll (このファイルはこのフォルダに無い)
    After) BigInt.xll
    エクセルを開いて、BigInt.xllをドラッグ、「アドインを有効」
    すると、
    External library could not be registered – Path: BigInt.xll
    Error: Could not load file or assembly ‘file:///E:\Documents\Works\Dev\vba\Scenario\ClassLibrary1\BigInt.xll’ or one of its dependencies. The module was expected to contain an assembly manifest.
    というエラーが出ます。

    ビルドしなおしたりして、いろいろやってますが未だエラーが出ます。
    ビルド => dllをxllとリネーム => エクセルにドラッグ => 形式が違うというエラー

    まだゴタゴタしている最中で、系統的にエラーの発生状況がまとめられていませんが、もし何かヒントでもあればよろしくお願いします。

    • Shingo says:

      【自己解決】
      解決しました。
      xllとdllの関係を混同していました。
      お騒がせしました

    • supermab says:

      Shingo さん、はじめまして^^

      BigIntXll.dll が無いというのが変ですね~。ビルドは正常に終わっていますか?

      えーと、プロジェクトが正常にビルドされると、以下のファイルが生成されるはずです。

      BigInt(xll).xls
      BigInt.dna
      BigInt.xll
      BigInt64.xll
      BigIntXLL.dll
      (BigIntXLL.pdb)

      で、BigInt(xll).xls を開いて、BigInt.xll をドラッグすると動作します。
      (Excel が64bit の場合は、BigInt64.xll を BigInt.xll と名前変更)

      どうでしょう?

Leave a Reply

Your email address will not be published. Required fields are marked *