今回は、.NetFramework を使った関数を .dna ファイルに記述して、Excek-DNA で XLL にしてみたいと思います。
利用する .NetFramework のバージョンは v4 を使います。v4 にはいくつか新しい機能が追加されていて、今回はその中から System.Numerics 名前空間にある、BigInteger 構造体を利用します。この構造体は任意の桁数の整数データを表すことが出来るので、多倍長整数演算機能を簡単に実装することが出来ます。これをVBAのコードで実現するのはちょっと骨が折れますね?
では、早速やってみましょう。
Excel-DNA に必要な2つのファイル(ExcelDna.xll と ExcelDna.dna)を任意の場所にコピーして、ファイル名をそれぞれ、BigICS.xll と BigCS.dna に変更します(VB.net で書きたい方は BigVB.xll と BigVB.dna)。 .dna ファイルをエディターで開いて以下のコードを記述します(オリジナルのコードは全て削除して以下のコードに置き換えてください)。
今回は、同じ内容の処理を C# と VB.net の2種類のコードで記述してみました。
C# で記述した場合↓
<DnaLibrary RuntimeVersion="v4.0" Name="BigInteger" Language="CS"> <Reference Name="System.Numerics" /> <![CDATA[ using System; using System.Numerics; public class MyAddIn { public static string BigAdd(string strX,string strY) { BigInteger x = BigInteger.Parse(strX); BigInteger y = BigInteger.Parse(strY); BigInteger ans = BigInteger.Add(x, y); return ans.ToString(); } } ]]> </DnaLibrary>
VB.net で記述した場合↓
<DnaLibrary RuntimeVersion="v4.0" Name="BigInteger" Language="VB"> <Reference Name="System.Numerics" /> <![CDATA[ Imports System Imports System.Numerics Public Class MyAddIn Public Shared Function BigAdd(strX As String, strY As String) As String Dim x As BigInteger = BigInteger.Parse(strX) Dim y As BigInteger = BigInteger.Parse(strY) Dim ans As BigInteger = BigInteger.Add(x, y) Return ans.ToString() End Function End Class ]]> </DnaLibrary>
簡単に解説しますと・・・
1行目で、
ランタイムバージョンはv4を使うよ。このアドインの名前はBigInteger だよ。言語はCS (VB)だよ。と宣言しています。
2行目で、
System.Numerics を参照設定しています。
5行目以降で、
BigAdd 関数を定義しています。
これだけです(笑)
さっそくテストしてみましょう。
わたしは、BigIntTest というフォルダを作って、そこに C# で書いたものと VB で書いたものを保存しました。
(こんな感じ↓)
Excel を開いて、BigVB.xll をドラグ&ドロップし、アドインを有効にすると、BigAdd 関数が使用できるようになっていて、大きな桁数の足し算が出来るようになっています。(BigCS.xll でも同じです)
(こんな感じ↓)
大きな桁の整数を文字列として入力しておくと、ちゃんと計算されるのが確認できますね♪
(こんな感じ↓)
このように、Excel-DNA を使うと、簡単に .NetFramework のクラスを利用することが出来ます。
このコードに減算・乗算・除算など追加して遊んでみてください♪ 遊んでみると、BigInteger 構造体にどんなプロパティーやメソッドが実装されているか、インテリセンスで表示される IDE を使ってコーディングしたくなりますよね?
次回は、VisualStudio のような IDE を使って自作関数の DLL を作成し、作成した DLL を Excel-DNA によって XLL 化する方法について書いてみたいと思います。
では、また(笑)
C# などで dll を作らずとも、ソースを直接実行してくれるんですね。
今までは、C や C++ のままでもいいやと思っていましたが、こりゃ真剣にC# を勉強しなくては。
次回はインテリセンスで表示される IDE を使ってコーディングですね。
ワクワク・・・・・・。
>今までは、C や C++ のままでもいいやと思っていましたが、こりゃ真剣にC# を勉強しなくては。・・・
C++/CLR で.NetFramework を利用するって方法もありますね。
その場合、DLL を作ってそれを利用するのが手っ取り早いかもしれません。
やはり、使い慣れた言語のほうがしっくりきますよね♪