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

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

ただいまの
回答率

87.48%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 13K+

score 55

前提・実現したいこと

エクセル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ビット

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/21 14:47 編集

    そのライブラリの依存関係に依るものかもしれません。
    依存関係にあるものが無い場合でも、FileNotFoundは発生するようです。

    そのものではないですが、依存関係の調査方法について書かれています。
    http://www.atmarkit.co.jp/fdotnet/dotnettips/866depends/depends.html

    その外部DLLのインストール手順で再度確認するのが近道だと思います。
    DLLの提供元で更新されているかもしれませんので、確認されては如何でしょうか?
    最悪、その環境では使用できない可能性もありますが。

    キャンセル

  • 2017/08/21 15:08

    回答と指導 ありがとうございます。
    DLLの内容確認をしました。
    VS2012 x86 Native Tools をつかいました。
    手順 コマンドプロンプト起動→フォルダー移動→ dumpbin /exports aaaa.dll を実行
    Dumpリストが出ました。 42のファンクションと名前がありました。
    必要な HidSmbus_GetNumDevices も含まれていました。

    調査が追い付いていないので 依存関係の調査方法 はまたよく読んで調べてみます

    キャンセル

  • 2017/08/22 08:54

    回答と指導ありがとうございます。
    結果 成功です。

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

    また Dependency Walker は未使用なので一度使ってみます。

    長い間指導戴きありがとうございました。感謝です。

    キャンセル

0

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

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

WOW64 - Wikipedia

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/22 08:39

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

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る