ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュのEXCEL-DNA

  • mixiチェック
  • このエントリーをはてなブックマークに追加
.NET環境をエクセルから活用できるものです。
SQLiteを.NETから活用したいため入れてみました。

なかなか面白そうなので、トピック立ててみました。

EXCEL-DNAの説明など
http://wiki.clockahead.com/index.php?cmd=read&page=Coding%2F.NET%2FOffice%2FExcelDNA

SQLiteも使えるみたいなのですが、勉強中です。Using ExcelDNA and System.Data.SQLite
http://stackoverflow.com/questions/29520546/using-exceldna-and-system-data-sqlite

dnaファイルを編集して自作関数の追加などが簡単に出来ます。
さくらエデッター等で UTF-8 BOMなしで保存します。
コメント行は、VBAと同じシングルコーティション[ ' ]です。

コメント(33)

1 .NETの関数の一部はVBAからCreateObjectとかすれば、使えるみたいです。
Office Tanaka .NET Frameworkを使う http://officetanaka.net/excel/vba/tips/tips98.htm
2 マイナンバー時代(個人情報の管理)には、暗号化が求められるので、SQLiteをSystem.Data.Sqliteから使えるようにしたいです。(VBricheclient5を使えばVBAからとりあえず使えます。)
VBAからSQLiteにアクセスしたいお年頃 http://wiashia.blog.so-net.ne.jp/2014-04-02
3 簡単に出来ないかと、ちょこっと試したのですが、ダメでした。おそらくDLL作って、アドインに登録しないと
ダメみたいです。ハードルがかなり高そうです。Turbo-Cいらいしばらく触ってなかったので、C#でとりあえず、SQlite動くようにして、インターフェース文作って、クラスにして、DLLにすれば良いみたいです。サンデープログラマーなので、ボチボチやってみます。 Excel-DNAのSQLiteのサンプルあたりからやってみます。
EXCEL-DNAのSQLiteのサンプルなのですが
1 C#とかVB.NET使うために、Visual Stdio 2013 Community Editionを入れてみました。(PRO版相当無料)
https://www.microsoft.com/ja-jp/dev/products/community.aspx
2 Visual Stdio 2013ので、C#のクラスを選択して、メニューからiNuGetを起動して、Install-Package Excel-DNAとInstall-Package System.Data.SQLite.Coreと入れて、Northwind.dbのSQL文から、SQLiteのDBを作って、サンプルプログラム動けばOKらしいのですが...
やってみます。
VBAからCreateObjectできるには条件があるとのこと
http://tokidokidokin.com/2011/03/vba%E3%81%A7-net-framework%E3%81%AEarraylist%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8random%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%86/
レジストリのHKEY_CLASS_ROOTに登録されてて、呼び出し条件に合えば使えるらしい。
とりあえず、サンプルプログラム失敗したらと怖かったのですが、DLL作成までokでした。
(SQLITEは、SQLITE3 NorthWind.DBで起動して、.read でSQL文読んでokでした。しばらく掛かりました。)
失敗したかと思ったのですが、セルに=productname(1)といれたら、Chaiと表示されてokでした。
とりあえず、サンプルプログラムは実行OKでした。
ちなみにデータが77個あったので、=productname() 1から78までやってみました。
データのある77までokでした。データのない78は#NUMエラーが出ます。
PUPSQLITEから、データを漢字とかにしても出るかやってみます。

ダイソーの商品一覧入れてみました。
漢字もOKでした。
ただし。DBにデータ入れても自動更新はしません。
再度、エクセルの計算式を実行しないと更新しません。
次はパスワード掛けてとか試してみます。
まぁ、自動更新しないのはボタンとか作ってVBAから読み込んでセルに入れる分には問題ないし、
とか思ってます。
どうやってパスワード掛けるのかと悩んでたら。Pupsqliteで開いてかぎマークをクリックしてパスワード2回入力したらOKでした。
パスワード付でも問題なく動きました。
サンプル動いたところで、何をするかとネットで探していたら、Interfacing C# and VBA with Excel-DNA (no intellisense support)というページがあったので、早速やってみることに
http://mikejuniperhill.blogspot.jp/2014/03/interfacing-c-and-vba-with-exceldna-no.html
この方法なら、dllの登録とかいらないらしい。
C#でオブジェクト型というのがあるのですが、サンプルプログラムでセルに=productname(?)で代入できるのはすごいことだと思います。でも現実的な問題としてどう実装するか悩みます。
(汎用にして裏でVBA動かしてFunctionかなんかに登録すればOK?!)
とりあえず、サンプルプログラムと、Interfacing C# and VBA with Excel-DNA (no intellisense support)とを一緒にして少しずつSQLITEを使えるようにしていくか、system.data.sqlite.xmlって呼び出せそうなのでそっちもみてみます。
とりあえず、2個1にして実行したのですが
Option Explicit
Sub test()
Dim lib As Object
Set lib = CreateObject("CSharp_functionLibrary")
Debug.Print lib.Add(12, 13) 'ok
Debug.Print lib.productname(1) 'error
Set lib = Nothing
End Sub
add関数は呼び出しokで、productname関数はエラーになります。
なんか少し行き詰ったので、色々探すことに
NuGetしたExcel=dnaのreademe.txtに
--
C#
--

using ExcelDna.Integration;

public static class MyFunctions
{
[ExcelFunction(Description = "My first .NET function")]
public static string HelloDna(string name)
{
return "Hello " + name;
}
}
とすれば、セルに=HelloDna("your name")で表示できるとのこと
さっそくやってOKでした。

セルに表示させる場合と、VBAで使う場合の違いをもう少し調べてみます。
Application.RunでXLL関数実行できるとのこと
素数の実行時間は駆るものがあったのでやってみることに
LONG型の最大値 2147483647を素数判定するまでの時間です。
True:XLL time= 29.23047
True:VBA time= 118.3359

セルに表示させる場合と、VBAで使う場合の違いがわからなくて色々調べてます。
基本に帰るというところで。EXCEL FOR SQLITEのHPを見てみると、
https://sqliteforexcel.codeplex.com/
Sample Projectsというのがあり、SQLite for AccessなんてEXCEL-DNA NETからのプロジェクトなので試して見たいです。
SQLite for AccessはEXCEL FOR SQLITEを入れ込んだものでした。暗号化しないなら最強かも
セルに表示させる場合と、VBAで使う場合の違いがわからなくて色々調べてます。の続きですが、
google groupのexcel-dnaで同じような質問を作者にしています。
https://groups.google.com/forum/#!topic/exceldna/-5hz0w3TSWM

VBAから呼び出し(COM)とExcelからの呼び出し(UDF)と同じメソッドを使用することはできません。

.NET / COM / VBA相互運用UDFのエクセル-DNAの登録は静的メソッドのみを公開している間、インスタンスメソッドであることの機能を必要とします。

今のあなたは、(もちろん一実装は、内部だけで他を呼び出すことができますが、)二回の関数を定義する必要があります。

ExcelDna.Registrationプロジェクト(https://github.com/Excel-DNA/Registration)が開発中であり、自動的にインスタンスメソッドから静的メソッドを生成するために、あなたのヘルパーを提供します。しかし、今のところそれだけですべてがより高度なアプローチや余分なライブラリを見る前に、明示的に作業を取得するために最善となります。

機械翻訳なのでちょっと変ですが・・・
まぁ、別々のクラスから呼べとのことらしい
セルに表示させる場合と、VBAで使う場合の違いがわからなくて色々調べてます。の続きの続きですが、
Attributeが設定されているクラスのスコープを明示的に「public class」で指定しないと読み込まれません。後、あらゆるpublic staticなメソッドがUDFにされてしまうので不要なものは[ExcelFunction(IsHidden = true)]を指定してあげましょう。
http://outofmem.tumblr.com/post/62233308198/excel-dna-1
謎が解けました。
やっと出来ました。

Option Explicit
Sub test()
Dim lib As Object
Set lib = CreateObject("CSharp_functionLibrary")
Debug.Print lib.Add(12, 13) 'ok
Debug.Print lib.productname(1) 'ok
Set lib = Nothing
End Sub

[ExcelFunction(IsHidden = true)]をつけて、static属性を削除したらOKになりました。
attributeは、結構気になります。
ドキュメントが例によって見つからないので、色々探しました。
少しは、下のページに
http://mndrake.github.io/ExcelDnaDoc/index.html
隠しコマンド的なやつもあるみたい
Visual Stdio 2013 Community Edtionのobject BrowerでExceldna.IntegrationのExcelFuntionAttibuteを見て見ると、Category,descrition,ExplicitRegistretion,HelpTopic,isClusterSafe,IsHidden,IsMacroType,IsTheraedSafe,IsVolatile,Nameがあります。
ここら辺ちゃんと調べておきたいです。
先ほどの謎が解けた人のHPでかなりマニアックな使い方してました。
http://outofmem.tumblr.com/post/62320193878/excel-dna-2
使いたいのはCOMの方だけなので、EXCEL COMでクグルと
VB.NET から Excel の COM オブジェクトを操作する場合の注意点
http://blogs.timberlandchapel.com/blogs/timberlandchapel/articles/1149.aspx
なんだかよくわからないけどこれも調べないと
とりあえず、解放とかは出来てるかな
色々見てたら、ファイシャルのHPでexcel-dna使っているのがカッコ良すぎて、UDFsで作るかCOMで作るか心が動いてます。
サンプルとかリファレンスは、英文なのですがありました。
http://exceldna.codeplex.com/ ここから色々探せるようになってるみたいです。
https://sysmod.wordpress.com/2012/11/06/migrating-an-excel-vba-add-in-to-a-vb-net-xll-with-excel-dna-update/ VBA to VB.Net XLL add-ins with Excel-Dna 英文のガイド
http://exceldna.codeplex.com/documentation 英文のドキュメント
はぁ、英文ってしばらくやってないから、疲れます。
英文のドキュメントは、わからなすぎです。
ちょっと、現実逃避して、IronPython用のSQLite3用DLLとか使えないか試してみます。
IronPython用のDLLをダウンロードしてきて(MS-PLhttp://blogs.msdn.com/b/shintak/archive/2012/09/09/10347542.aspx)
https://bitbucket.org/jdhardy/ironpython.sqlite/downloads
DLLからXLLを作るの方法でやってみたところ
http://supermab.com/wp/excel-dna-%E3%81%A7-xll-%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%EF%BC%88%E3%81%9D%E3%81%AE%EF%BC%93%EF%BC%89/
とりあえず、UDF関数としては登録できたみたいです。

なんとかCOM関数に出来ないか、ソースもダウンロードして色々やってみます。
ダイナミックの関数から元々のスタイテックの関数をアンダーパーとか付けて呼べばいけるかも???

サンプルプログラムあたりから少しずつやって見ます。

うまくいけば、PythonのDB API2に準拠した形で呼べるのかな?

しかし、%sとか使えるのかとか思いっきり疑問があります。
C#でIMPORT DLLとかやったのですが、.NET DLLはできませんでした。
スタイテックで宣言しなければ、VBAから使えるのですが、時々PCの調子がおかしくなります。
スタイテックとか色々調べてみます。

ログインすると、残り6件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。