質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

2回答

3205閲覧

Excel .netのデータやり取り

Lemon_Drop

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/08/06 10:10

前提・実現したいこと

.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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

.NETとCOMの相互運用はあまり詳しくありませんが……

DataTable クラス (System.Data)にはComVisibleAttributeが付与されていないので、COMから使えないのではないかと思われます。

参考
ArrayList クラス (System.Collections)(VBAからよく使われる.NETのクラス)

対策としては

ComVisibleAttributeを設定したDataTableのラッパークラス(参照設定で入力補完を使うなら+インターフェイス)を作成する。

DataTableの機能は不要で、データだけが欲しいなら
ComVisibleAttributeを設定した、行を示すクラス(DTO)を作成して、そのクラスの配列を返す。

シートへの出力だけであればObject(,)配列にする。

などはどうでしょうか?

投稿2018/08/06 14:45

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DLLと連携できるかどうかはわからないので置いておきますが、下記のコードは明らかにおかしいです。

Dim dt obj.dll_call

dtのあとに=がない。
またVBAでオブジェクトを代入するのであればSetを使う必要があります。

VBA

1Dim dt ' dtは何型にしたらよいのかわからないので、Variantにしておきました 2Set dt = obj.dll_call

投稿2018/08/07 01:15

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lemon_Drop

2018/08/07 01:23

すみません。転記ミスと記載ミスが重なっていました。 ご指摘ありがとうございます。
ttyp03

2018/08/07 01:25

Setは使っていたということですか?
Lemon_Drop

2018/08/07 01:36

DataTable型で定義して、そのまま dt = obj.dll_callで入れていました。(Addはなかったので) 。Setで実施したところ、型が一致しないとでたので、そもそも違っていたようでした。 試しにVariantで定義してセットしてみましたが、こちらはエラーにはならず値は取得しないようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問