前提・実現したいこと
.net側でMYSQLよりデータを取得し、Excel側でデータ加工を行いたい。(メモリ上のやり取り)
.net側でDLLを作成し、戻り値としてDataTable型を使いました。
Excel側でDLLを呼び出し、Excel側のDataTable型に格納しようとしたところ、
エラーになってしまいました。
該当のソースコード
クラスライブラリ(COM登録)・・DLL_TEST2 - Class1
ここで、MYSQL接続情報をすべて埋め込み。
VBnet
1 Public Function dll_call() As DataTable 2 Dim dt As New DataTable 3 Dim sMysqlConnect As New MySqlConnection 4 Dim sMysqlAdapter As New MySqlDataAdapter 5 Dim sMysqlCommamnd As New MySqlCommand 6 7 sMysqlConnect.ConnectionString = DBInfo("STG") 8 sMysqlCommamnd.Connection = sMysqlConnect 9 sMysqlCommamnd.CommandText = "select * from AAA" 10 11 sMysqlAdapter.SelectCommand = sMysqlCommamnd 12 sMysqlAdapter.Fill(dt) 13 14 Return dt 15 End Function
ILMerge(DLL統合)を使って、DLL_TEST3.dllに 先ほど作ったDLL_TEST2とMYSQLを統合。
統合したDLL_TEST3をアセンブリ登録。
DOS
1ILMerge.exe /targetplatform:v4,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5" /out:DLL_TEST3.dll DLL_TEST2.dll MySql.Data.dll 2 3RegAsmSetting.exe DLL_TEST3.dll /tlb /codebase
DLL_TEST3(内部的にはDLL_TEST2)を呼び出ししたところ
【実行時エラー91 オブジェクト変数または Withブロック変数が設定されていません。】と表示されました。
VBA
1 Dim obj As Object 2 Set obj = CreateObject("DLL_TEST2.Class1") 3 Dim dt obj.dll_call
試したこと
.net内で、クラスライブラリを呼び出し、取得できたことを確認。
また、Excel側でのMYSQL接続からの戻りがNGかどうかを確認するために
DataTableのrows.countを使ってIntegerを戻りにしたところ、正しく取得。
知りたいこと
DataTableの型が異なるのか、利用できなそうな気がしてきたので、代替案があればと考えています。
元々考えていたの以下の2案でした。
案1 .net側でCSV出力して、Excel側で取込。
案2 Excel側でMYSQL接続(ODBC設定込み)を行い、データ取得。
ただ、ODBC設定は敷居が少し高くNGがでたため、案1を考えていましたが、、
わざわざCSV出力して取込処理をするとなると処理負担になると考えて、別案を考えていました。
補足情報(FW/ツールのバージョンなど)
Windows 10 x64
Excel 2016 x86
Visual Studio 2013
MYSQL5.6
ILMerge 2.12
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。