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

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

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

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

Q&A

解決済

2回答

21264閲覧

エクセル2010のVBAで実行時エラー53 (DLL)ファイルが見つかりません。

RED_CAT

総合スコア59

VBA

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

0グッド

0クリップ

投稿2017/08/21 02:25

###前提・実現したいこと
エクセルVBAのプログラムを2003(環境B)から2010(環境A)に移行したい
環境Bではまったく問題なく動作していますが、移行したら DLLを参照する部分で
エラーが発生します。
環境Aのエクセル2010でVBAを動作させたいので ご教授お願いします。

###発生している問題・エラーメッセージ

エクセル2010のVBAで実行時エラー53 (DLL)ファイルが見つかりません。

###該当のソースコード

DLLの記述部 Public Declare Function HidSmbus_GetNumDevices Lib "aaaa.dll" (ByRef numDevices As Long, ByVal vid As Integer, ByVal pid As Integer) As Long 該当のコード部分 Dim numDevices As Long Dim vid As Integer Dim pid As Integer Dim retA As Long '初期化 numDevices = -1 connectedDevice = -1 vid = 1234: pid = &HEA** retA = HidSmbus_GetNumDevices(numDevices, vid, pid) ←エラー発生

###試したこと
過去ログから調べて調査1、調査2、調査3、調査4 と色々と調べてみましたが
解決に至りませんでした。
DLLはメーカ製の過去品のため更新されていません

調査1 DLLファイルが正しく配置されアクセス可能か →どれも変わらずNG
C:\Windows\System32 及びエクセルファイルのあるフォルダーに aaaa.dll を配置し
ファイル名だけ または フルパス指定して読み出しをトライ。
aaaa.dll ファイルのプロパティ/セキュリティを確認し どのユーザからも
フルコントロール扱いにした

調査2 環境Aの時、「互換モード」( .xls)となっていたので新規に2010で
作成し( .xlsm)してみた →変わらずにNG
VBA作成は互換モードで起動したものからエクスポートして新規の方に
インポートした

調査3 参照設定について 環境Aと環境Bでは参照できないDLLファイルでした
その他の参照設定は最小の5つだけで同じでした。 → 環境による差はなかった
もちろんエクセルのバージョンによる番号の違いはあります

調査4 セキュリティ関連の確認(環境A)
すべてのマクロを有効にする(選択済)
VBAプロジェクトオブジェクトモデルへのアクセスを信頼する(チェック済)

###補足情報(言語/FW/ツール等のバージョンなど)
環境A
エクセル2010 バージョン: 14.0.7184.5000 32ビット
OS win7 64ビット

環境B
エクセル2003 SP3 バージョン: 11.8169.8172
OS XP SP3 32ビット

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

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

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

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

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

guest

回答2

0

C:\Windows\System32 及びエクセルファイルのあるフォルダーに aaaa.dll を配置し

System32 は64ビットプログラム用のフォルダーです。
32ビットは、
C:\Windows\SysWOW64
に置くことになってます。
WOW64 は、Windows 32-bit On Windows 64-bit のことらしいです。

WOW64 - Wikipedia

投稿2017/08/21 07:08

hatena19

総合スコア33620

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

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

RED_CAT

2017/08/21 23:39

回答ありがとうございます。 SysWOW64 の意味は知りませんでした。ファイルを移動しプロパティ/セキュリティを変更して 動作確認しましたが 結果は変わらずNGです。(指定はファイル名のみ) その後の評価ではフォルダの不適切を無くすため フルパスで指定するようにしています。
guest

0

ベストアンサー

こんにちは。
64bit と32bit ではlong型のデータサイズが異なるため、それに応じた対応が必要です。
こちら(VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 – Office 2010,2013)や、こちら(64 ビット Visual Basic for Applications の概要)が参考になるでしょう。

投稿2017/08/21 02:40

sazi

総合スコア25138

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

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

RED_CAT

2017/08/21 04:44

回答ありがとうございます。 32bitと64bitの区別ができるようにしてみました。 #If VBA7 And Win64 Then '64bit Public Declare PtrSafe Function。。。 #Else '32bit Public Declare Function。。。 #End If しかしながらエラーの状況は変わりません。 OSは64bitですがエクセルは32bit版なので宣言は変わらないと思います。 32か64bitか確認のため Dim XXX as LongLong とするとコンパイルが通りません。 この状況で 宣言部の後方を変更する(間違いがある?)必要があるのでしょうか? Lib "aaaa.dll" (ByRef numDevices As Long, ByVal vid As Integer, ByVal pid As Integer) As Long
sazi

2017/08/21 05:28 編集

失礼しました。32bit版を使用されているのですね。 であれば、データ型は関係無いので、HidSmbus_GetNumDevicesが含まれるdllの名称とパスが誤っているのではないでしょうか? "aaaa.dll"というのは実際の名称でしょうか? 参照設定できないというのも気になります。(あ、レジストリ登録は行っていなんですよね?)
RED_CAT

2017/08/21 05:40

回答ありがとうございます。 念のためもう一度確認しました。ファイルのプロパティからフルコピーしてみましたが変わらずNGです。
sazi

2017/08/21 05:54 編集

そのライブラリの依存関係に依るものかもしれません。 依存関係にあるものが無い場合でも、FileNotFoundは発生するようです。 そのものではないですが、依存関係の調査方法について書かれています。 http://www.atmarkit.co.jp/fdotnet/dotnettips/866depends/depends.html その外部DLLのインストール手順で再度確認するのが近道だと思います。 DLLの提供元で更新されているかもしれませんので、確認されては如何でしょうか? 最悪、その環境では使用できない可能性もありますが。
RED_CAT

2017/08/21 06:08

回答と指導 ありがとうございます。 DLLの内容確認をしました。 VS2012 x86 Native Tools をつかいました。 手順 コマンドプロンプト起動→フォルダー移動→ dumpbin /exports aaaa.dll を実行 Dumpリストが出ました。 42のファンクションと名前がありました。 必要な HidSmbus_GetNumDevices も含まれていました。 調査が追い付いていないので 依存関係の調査方法 はまたよく読んで調べてみます
RED_CAT

2017/08/21 23:54

回答と指導ありがとうございます。 結果 成功です。 依存関係の調査方法を読みました。 「すべての必要なDLLファイルがそろっていない環境で、このようなライブラリを利用する.NETのアプリケーションを実行した際には、FileNotFoundException(ファイルが見つからない)という例外が発生する。しかし、このメッセージだけでは、DLLファイルの依存関係に原因があることに気付きにくい。」 直接のエラーメッセージだけで対応していたため、もうひつと必要なDLLファイルがありました。 宣言部の Public Declare xxxxx には登場してこないため見落としていました。 また Dependency Walker は未使用なので一度使ってみます。 長い間指導戴きありがとうございました。感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問