- ベストアンサー
Excel2010VBAでエラーが出る相対パス指定
- Excel2010で相対パス指定するとエラーが発生する問題について
- ExcelVBAで相対パス指定するとExcel2010では「ファイルが見つからない」エラーが発生するが、Excel2007やExcel2013では問題なく動作する
- 絶対パスに変更すればExcel2010でも問題なく動作するが、原因がわからないため原因を教えて欲しい
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2の回答者です。 質問者さんは、もう論理的な対処をしたり、回答者の書いた内容の確認もないようです。そこで、後の人のためにまとめておこうと思い立ちました。 ---------------- [.dll] は、[.ocx]に読み替えても可 (1)一般的な.dll (ダイナミックリンク・ライブラリ)は、一般的には、実行ファイル(.exe)や WindowsのSystem32 フォルダに入れる。 基本はこの通り http://www.forest.impress.co.jp/info/knowledge/2-5-3xp.html (2).dllは、パスの通った所に置く。 - Shellコマンド(SET PATH)や外部オブジェクト(FileSystemObjectのBuildPath)で、パスは通せる。 (3).dllを絶対パスにする。 (4) Excel 等のOfficeの場合は、設定で、[オプション]-[保存]-[規定のファイル] で、Current Folder を決め、そこに置く。 要 Excelの再起動。 (非推奨-ファイルと同じ場所に置くことは、ユーザーによる削除したり移動したりするトラブルが想定されるから。) (5)相対パスは、基本的にはお勧めできない。 過去には、このような例もある。ただし、質問者のExcel VBAの技術としてはかなり低い。 通常、ユーザーが作成したライブラリであっても、当時はMS Officeのディベロッパのユーティリティや現在でも流通しているフリーのインストーラーを使うのが基本だから、そのような問題は本来は発生しない。単なる手続き上の手抜きによるトラブル。 http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=5215;id=excel ChDrive ActiveWorkbook.Path ChDir ActiveWorkbook.Path が可能と書いてあるが、私自身は、Win32 APIのSetCurrentDirectory をお勧めする。 --------------------- と、以上が、32ビットでの一般的な対処法です。他にも、Excelの特殊なツールによって、設定を変える方法はあるかとは思いますが、基本的なことは変わらないと信じます。自作で、Excel用のライブラリを作れるレベルなら、このような質問はしないはずです。いたずらに、長く話を伸ばしてもしかたがないので、これで終わりにします。
その他の回答 (3)
- kittensillabub
- ベストアンサー率60% (6/10)
いっその事、絶対パス指定にしてしまうとか Private Declare Function LoadTT Lib ThisWorkbook.Path & "\○○.dll" _ () As Integer # ちゃんと Scripting.FileSystemObjectの BuildPath()使ったほうが良いですが w
お礼
kittensillabub 様 ありがとうございます. う~ん,そうですね. 指定が長くはなりますが,ファイルのプロパティからパスをコピーすれば,誤記の心配も少なく楽に済むので,絶対パスでも良いのですが.....,癪に障ります. ==
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 外部の自作のライブラリを使う場合に、相対パスにする作法などは、一般的ではないと思います。 ライブラリなどは、予めパスを通しておくか、絶対パスを指定します。 パスの確認: Set WshShellEnv = CreateObject("WScript.Shell").Environment("Process") MsgBox WshShellEnv("PATH") ここで、パスの通っている所に入れれば、そのまま、ライブラリのファイル名だけでよいことになります。 また、Excelのデフォルトのファイル・パスというのは、新規ファイルで、デフォルトで開けた時の場所です。たぶん、今回は、Excel2010のオプションの[保存]の[規定のファイル]の場所の位置が違っていることが、結果に現れているのだろうと思います。 Application.DefaultFilePath そうでないなら、つまり力技での場合ですが、 >ChDir ThisWorkbook.Path これはVBAの中だけの事で、外部ツールの参照先は、ChDirでは変わりません。 フォルダを変更する場合、Win32 APIのSetCurrentDirectoryで変えます。
お礼
WindFaller 様 ご教示,ありがとうございます. デスクトップ上に置いたフォルダーの中に,ExcelVBAの.xlsmと.dllファイルを入れますので, 相対パスで問題ないと思うのですが....,どうもうまく見つけてくれません. もうしばらく悩んでみます. ==
- hantoM
- ベストアンサー率60% (6/10)
2010のバグかもしれませんね または相対パスより絶対パスが優先するとか 私自身は2010を使用したことがないので何ともいえませんが http://needtec.exblog.jp/19041682/ 参考になるかもしれません
お礼
hantoM 様 情報,ありがうございました. Excel2003を卒業して2007に慣れだしたところなので,Excel2010にはまだ移りたいないところです. これまでの ExcleVBAのプログラム資産を動作を再チェックして,一気にExcle2013に移ってしまうかも含めて,検討し直します. いずれにしまして,情報ありがとうございました. ==
お礼
WindFaller 様 レスポンスの遅れ,大変申し訳ありません. 父が入院し安心できない状態が続いているため, 最悪の場合に備えて,葬儀の行い方やその後の種々の手続き等の予備知識のために時間も気も取られている次第です.失礼をお許し下さい. ネットでの情報収集も今までの分野と違うことになりそうですので, 思い付きで行ったテストとその結果,そしてとりあえずの自分なりの結論をまとめてみました. ―――――――――― デスクトップ上に,ファイル○○を作って,その中にVBAソース.xls およびVBAから呼び出して実行させる○○.exe を入れて,問題となっているExcel2010 VBAにて, プログラム中での .exeファイルの絶対パス指定を相対パスに替えて実行してみました. つまり,ファイルの種類によるのか,パス指定(絶対/相対)だけのことか,を調べたいということです. そこで, "C:\Users\△△\Desktop\○○\○○.exe" を ".\○○.exe" に替えてみました. 結果は,エラーが出て,動作しません. 念のため, 同じことを, これまで上手く動いている Excel2007 VBAでも試してみました. 結果は,相対パス指定ではエラーが出ました. さらに, 実行時,いわゆるメイン的な動作の最初のプロシージャの前に, 以下を実行すると, (同じファイル内に入れてますので) Excel2010,2007,いずれも上手く動作しました. ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path (なお,Excel2013では試せてませんが,同じことになると思います.) 以上をまとめますと, .dll以外のファイルのパス指定でも相対パスでエラーが出ます. しかし,その原因はというと, VBA実行時に,相対パス指定の前提となるカレントパスが上手く指定されていなかった,ということです. 何だ,大山鳴動...?と思いきや, 元々の問題に関しては, Private Declare Function Load△△ Lib ".\○○.dll" _() As Integer として,宣言文の中でパス指定をしていますので, .exeファイル指定の場合と同じには出来ません (宣言文の前には実行できない?)ので, 依然として未解決です. 回答者の皆様のご指摘はその解決策なのだとは思いますが,充分に試せてはいません. ということで, 理解ができた範囲でのこれまでの回答者の皆様のご指摘を踏まえての結論としましては, 種々の都合で .dll や他のファイルをどこに置いたとしても, 「要は,相対パスにせずに絶対パス指定にする」, というのが,バージョンに振り回されずに普遍的,シンプル,かつ現実的である,というのが私のレベルでの必要にして十分な問題解決策,いや回避策なのかと思っております. 以上,他の方々への有効な知識にはなり得ませんが,取り急ぎの結論です. 貴重なお時間を割いてご教示頂いたWindFaller 様,hantoM 様に再度感謝申し上げます.有難うございました. ==