質問: Nothing End Sub ``` ### 試したこと 参照設定を行わずにCreateObject("Npgsql.NpgsqlConnection")することも試してみたのですが、CreateObjectからは「Variant/NpgsqlConnection」型の<変数なし>の値が返ってきてしまいました。 ### 補足情報(言語/FW/ツール等のバージョンなど) Microsoft Excel 2010 Windows 7 professional
回答: ### Npgsqlを呼び出せない理由 Excel VBA から Npgsql を呼び出せない理由ですが、Excel VBA は **AvtiveX(COM)**、Npgsql は **.Net マネージDLL**という、**異なった実行環境(API、またはフレームワーク)を前提にしている**からです。 VBA 等のActiveXの世界から呼び出されることを前提にしている .Net マネージDLLを開発する場合、そのDLLに含まれている .Net オブジェクトがActiveXに対してCOMというインターフェースを通じて機能を公開する、という宣言を含める必要があります。しかし、Npgsqlはそのようになっていない、というのが原因だと思います。 ### 代替案1: ODBC/OLE DBによる接続 Excel VBAからPostgreSQLへのアクセスは、ODBCやOLE DBによって行うこともできます。 * PostgreSQL 9.2にクライアントから接続する PostgreSQL ODBC Driverのインストールと接続確認 * PostgreSQL > PgOleDB で Excel VBA から接続 * Works データベース接続あれこれ / 接続文字列(PostgreSQL: OLE DB) * Works データベース接続あれこれ / 接続文字列(PostgreSQL: ODBC) ### 代替案2: COMラッパーによるNpgsqlの利用 もう一つの代替案として、NpgsqlとExcelVBA(.NetとActiveX)を仲介するために、独自のCOMラッパーDLLを開発する方法があります。 簡単に言うと、NpgsqlがCOM公開インターフェースを持っていない(.Net専用)なら、Npgsqlの機能にアクセスする .Net マネージDLLを自分で開発して、そいつにCOM公開インターフェースを持たせればいいじゃない!という方法になります。 COMラッパーはActiveX時代のアプリケーションと.Netの世界を橋渡しする方法として、マイクロソフトも推奨している正しい戦略です。COMラッパーの仕組みと実装方法の詳細は、以下のサイトが参考になると思います。 * MSDN: COM 呼び出し可能ラッパー.aspx) * MSDN: 方法: COM ラッパーを作成する.aspx) ご参考になれば。