• ベストアンサー

VBAから.NET DLLを任意フォルダから呼ぶ

VBAからRegistration-Freeで.NETベースのDLLを、任意のフォルダに置いて呼ぶ方法を教えてください。 https://www.ka-net.org/blog/?p=6198 このサイトではDLLをVBAの実行元(ExcelならEXCEL.EXE)と同じフォルダに置くと動くのですが、任意のフォルダに置いて動かす方法が分かりません。 何卒、ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.1

Private Declare PtrSafe Function AddDllDirectory Lib "kernel32.dll" (ByVal fileName As String) As LongPtr 宣言をしておいてAddDllDirectoryで任意のフォルダをdll検索パスに追加してから呼んでみるとどうでしょう。

shakamandara
質問者

お礼

以下のように宣言してdllのパスを指定したのですがダメでした。 Private Declare PtrSafe Function AddDllDirectory Lib "kernel32.dll" (ByVal fileName As String) As LongPtr Private Sub Workbook_Open() AddDllDirectory ("C:\system") End Sub お忙しい中、貴重なアドバイスありがとうございました。

その他の回答 (1)

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

任意だと、パスを指定しないとダメです。 https://qiita.com/mmYYmmdd/items/fc1d3cce6a39771c0f36

shakamandara
質問者

お礼

C++で作成したDLLの場合にはDeclareの任意のパス指定でOKでした 今回はC#で作成したDLLをレジストリ登録なし(RegAsm行わない)で任意の場所からActCtxなどを介してVBAで呼びたかったのですがダメでした。 お忙しい中、貴重なアドバイスありがとうございました

関連するQ&A

  • x64ネイティブコードのDLLはVBAから呼びだせない?DLLが見つからない?

    VC+2005でx64ネイティブコードを出力し、DLLを作成したのですが C:\WindowsフォルダにそのDLLを入れて、いつもどおりVBAから呼びだそうとすると、該当するDLLがありません。と表示されます。 同じように置いているのに無いというメッセージが理解できないです。 x86(32bit)で生成したDLLなら問題なく動作するのですが・・・ 何か違いでもあるのでしょうか? Declareとかでは呼べないのでしょうか? ちなみにVBAはExcel2003です。 DLLでなくMFCアプリで完全ネィテイブ.EXEを作らないとx64の環境は生かせないのでしょうか?

  • 「カレントフォルダ以外にあるDLLをコールする方法」をご教授願います。

    現在、DLLとEXEを開発しているのですが、DLLとEXEのプロジェクト(dsp)のフォルダを別々にしています。 DLLのテストの為、EXEビルドして実行したら、「必要なDLLファイル****.DLLが見つかりませんでした。」のメッセージが出ます。 (作ったDLLをEXEを同じフォルダへコピーすると実行は正常にされます。) 「カレントフォルダ以外にあるDLLをコールする方法」を知っている方がいましたら、ご教授願います。 よろしくお願い致します。 開発言語:VC++ Ver6 SP5 使用OS:Win98

  • VBAでフォルダを開く

    Excel2003で、VBAで指定フォルダを開く場合に myFol = "D:\aaa" Shell "C:\Windows\Explorer.exe " & myFol, vbNormalFocus これで開きますが、環境変数HOMEを指定することはできないでしょうか?

  • エクセルVBA実行時のエラー:DLLファイルが見つ

    タイトル:エクセルVBA実行時のエラー:DLLファイルが見つかりません  質問させていただきます。どうぞよろしくお願いいたします。 環境:PC1~3の全てが、Excel2010、Win7になります。 初めてVBAから読み込むためのDLLファイルを作成いたしました。    PC1上で動作確認できている2つのファイル(Test4.dll(VC++2013にて作成)と それを呼び出すVBAのついたエクセルファイル)を、 PC2とPC3に移動し、VBAを実行しましたところ 何故かPC3でのみ下記エラーが発生いたします。 >実行時エラー'53' >ファイルが見つかりません。Test4.dll ・2つのファイルは同じフォルダ内で実行しております。 ・VBAのカレントパスは   ChDrive Left(ThisWorkbook.Path, 1)   ChDir ThisWorkbook.Path で変更しております。  試しにC:\Windows\System32と C:\Windows\SysWow64にも Test4.dllをコピペしてみましたが、同じエラーが出てまいります。 ・PC3のみ違うところを探してみましたが、思いつくのは下記くらいでございます。   1.VSが入っておりませんでした。(必要なのでしょうか??)   2.実行しているパスが違います。     PC1とPC2の実行パス:      D:\Users\Administrator\Documents\VBA_TEST     PC3の実行パス:      D:\Documents\VBA_TEST              もし何か原因として思いつかれる事がございましたらお教えいただけないでしょうか。 お詳しい方がいらっしゃいましたら何卒よろしくお願いいたします。

  • 行番号はコピーしない方法はありますか?

    http://www.ka-net.org/blog/?p=2864 上記コードをコピペすると、行番号まで貼り付けられちゃうのですが、 行番号はコピーしない方法はありますか?

  • VBAからDLLをCALLしたいのですが

    仕事上今まで蓄積されているFortranプログラムを効率よく使いたくDLL,VB,VBAにチャレンジしていますが, Intel(R) Fortran Compiler9.0で作成したDLLをEXCELのVBAからCALLしたところ 実行時エラー'49' DLLが正しく呼び出せません のエラーが表示されました。 このDLLはVisual Basic .NETで作成したVBからは正しくCALLできています。 色々原因を調べているのですがVBAからDLLの呼び出しとDLL内の計算は正しく行われておりDLLからVBAに戻るときにエラーになっているようです。 テストを行っているFortranとVBAのソースは以下です。VBAでDLLをCALL出来るように解決いたしたくご教授願お願いいたします。 (1)---- Fortran ソース --------------------------- subroutine DLL1(Q,QQ,QQQ) ! Expose subroutine DLL1 to users of this DLL ! !DEC$ ATTRIBUTES DLLEXPORT::DLL1 !DEC$ ATTRIBUTES ALIAS:'DLL1'::DLL1 ! Variables ! Body of DLL1 real*4 Q,QQ,QQQ QQ = Q*2 QQQ = Q**3 end subroutine DLL1 (2)----------- VBA ソース -------------------- Private Q As Single Private QQ As Single Private QQQ As Single Declare Sub DLL1 Lib "DLL1.dll" (ByRef Q As Single, ByRef QQ As Single, ByRef QQQ As Single) Sub Macro1() ChDrive ActiveWorkbook.Path ChDir ActiveWorkbook.Path Q = 2# Call DLL1(Q, QQ, QQQ) Cells(5, 2) = Format(Q, "#####.#0") Cells(6, 2) = Format(QQ, "#####.#0") Cells(7, 2) = Format(QQQ, "#####.#0") End Sub

  • VBAで呼び出したVBのDLLのデバッグ方法

    VB2010で、COM相互運用機能を使って作成したDLLを VBAから呼び出すことはできるのですが この状態でこのDLLをデバッグすることはできないでしょうか。 本来ならば、DLLをデバッグするテストプログラムを VB2010のVB.NETのWindowsフォームアプリケーションか ConsoleApplication1で作成して、 同じソリューションの中に DLLとテストプログラムのプロジェクトを配置して 参照の追加でDLLを参照設定して 両者をデバッグをすると思われますが、 テストプログラムを作るのがかなり大変なのと、 今回作成したDLLは、元々はVBAの中のひとつのプロシージャ―で、 事情があって、このプロシージャ―だけをVBのDLLにしたものです。 このプロシージャ―は元々はVBAの中で正しく動作していたものです。 VBに書き直した時に何らかの不具合が起きていると思われます。 テストプログラムを作らずに、既存のVBAから呼び出して、 DLLの部分の動作だけを(できればVB2010で)デバッグできないでしょうか。 よろしくお願いします。 (WindowsXP SP3 , Excel2003のVBA , Visual Studio 2010)

  • DLLインポートについて

    A.exe ⇒ B.dllの関数 ⇒ C.dllの関数 の順で関数をコールするのですが、C.dllの関数をコールする際に DllNotFoundExceptionが出てしまいます(「'C.dll' を読み込めませんでした。」) また、上記エラーはPCによって発生しない場合もあるのですが、 原因として何が考えられるでしょうか。 動作確認したPCのフォルダ構成は同じで下記のようになっており、 EXEとDLLはすべて同じフォルダ内に存在しているため原因がよくわかりません。 BIN ├A.exe VB.net ├B.dll VB.net └C.dll C言語

  • 同一フォルダの別ブックへのデータ貼り付け(VBA)

    Excel2007・VBAにより、マクロ実行ブック(「親」)の≪Sheet1≫シートにおけるP10:P54に入力されている数値を、「親」と同一フォルダにある複数の別ブック(「子」)の≪Sheet1≫シートのP10:P54に貼り付けたいです。 なお、同一フォルダには「子」とは別に本処理対象としない≪Sheet1≫シートが存在しない他のブックも存在しています。 考えたり幾度か検索したりしたのですが、希望に合った内容が出てきませんでした。 宜しくお願い致します。

  • Excel 2016で塗分けマップは可能?

    https://www.ka-net.org/blog/?p=7757 にありますようにExcel 2016でも塗分けマップ機能が使えるようです。 しかし私のExcel 2016では、Bing mapというのは入っているものの、塗分けマップはありません。Office更新プログラムを実施しても、アドインには「塗分け」や「マップ」は見当たりません。 Excel365を買うしかないのでしょうか?