Excel2010VBAでエラーが出る相対パス指定

このQ&Aのポイント
  • Excel2010で相対パス指定するとエラーが発生する問題について
  • ExcelVBAで相対パス指定するとExcel2010では「ファイルが見つからない」エラーが発生するが、Excel2007やExcel2013では問題なく動作する
  • 絶対パスに変更すればExcel2010でも問題なく動作するが、原因がわからないため原因を教えて欲しい
回答を見る
  • ベストアンサー

Excel2010VBAでエラーが出る相対パス指定

 ExcelVBAで,Excel2007と2013で問題無いのに, Excel2010ではエラーが出る相対パス指定について, ご教示を頂けると助かります.  ExcelVBAにて, ○○.dll ファイルを 以下のように宣言して使っています. Private Declare Function LoadTT Lib ".\○○.dll" _ () As Integer  プログラムの中で, ret = LoadTT() を実行すると, Excel 2007では相対パスでの指定で問題無く動作しますが, Excel 2010では相対パスでの指定ではエラー(ファイルが見つからない)"48"が出ます. そこで,相対パス指定をやめて絶対パスに変更すると問題無く動作します.  念のため Excel2013でも試したところ, 2007と同様に,相対パス指定でも問題なく動作しました.  なお,ExcelVBAのファイル「○.xlsm」と「○○.dll」は同じフォルダーに入れています.  また, ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path の実行によるカレントフォルダーの確認も,どのバージョンでも同じに正しく確認出来ています.    因みに,バージョンの違う各Excelは別々のPCでの動作ですが,使用OSは Windows7 Professional 32bit で同じです.  以上のように Excel2010だけ動作が異なります.  とりあえずは絶対パス指定にすれば問題は解消するのですが, Excel2010で特に何か設定したということは無いので気持ち悪く, 原因と思われることでご存じ方がいらしたらご教示を頂けると助かります.  どうぞよろしくお願い致します. ==

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

  • ベストアンサー
回答No.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用のライブラリを作れるレベルなら、このような質問はしないはずです。いたずらに、長く話を伸ばしてもしかたがないので、これで終わりにします。

shantom
質問者

お礼

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 様に再度感謝申し上げます.有難うございました. ==

その他の回答 (3)

回答No.3

いっその事、絶対パス指定にしてしまうとか Private Declare Function LoadTT Lib ThisWorkbook.Path & "\○○.dll" _ () As Integer # ちゃんと Scripting.FileSystemObjectの BuildPath()使ったほうが良いですが w

shantom
質問者

お礼

kittensillabub 様  ありがとうございます.  う~ん,そうですね.  指定が長くはなりますが,ファイルのプロパティからパスをコピーすれば,誤記の心配も少なく楽に済むので,絶対パスでも良いのですが.....,癪に障ります. ==

回答No.2

こんにちは。 外部の自作のライブラリを使う場合に、相対パスにする作法などは、一般的ではないと思います。 ライブラリなどは、予めパスを通しておくか、絶対パスを指定します。 パスの確認:  Set WshShellEnv = CreateObject("WScript.Shell").Environment("Process")  MsgBox WshShellEnv("PATH") ここで、パスの通っている所に入れれば、そのまま、ライブラリのファイル名だけでよいことになります。 また、Excelのデフォルトのファイル・パスというのは、新規ファイルで、デフォルトで開けた時の場所です。たぶん、今回は、Excel2010のオプションの[保存]の[規定のファイル]の場所の位置が違っていることが、結果に現れているのだろうと思います。  Application.DefaultFilePath そうでないなら、つまり力技での場合ですが、 >ChDir ThisWorkbook.Path これはVBAの中だけの事で、外部ツールの参照先は、ChDirでは変わりません。 フォルダを変更する場合、Win32 APIのSetCurrentDirectoryで変えます。

shantom
質問者

お礼

WindFaller 様  ご教示,ありがとうございます.  デスクトップ上に置いたフォルダーの中に,ExcelVBAの.xlsmと.dllファイルを入れますので, 相対パスで問題ないと思うのですが....,どうもうまく見つけてくれません.  もうしばらく悩んでみます. ==

  • hantoM
  • ベストアンサー率60% (6/10)
回答No.1

2010のバグかもしれませんね または相対パスより絶対パスが優先するとか 私自身は2010を使用したことがないので何ともいえませんが http://needtec.exblog.jp/19041682/ 参考になるかもしれません

参考URL:
http://needtec.exblog.jp/19041682/
shantom
質問者

お礼

hantoM 様  情報,ありがうございました.  Excel2003を卒業して2007に慣れだしたところなので,Excel2010にはまだ移りたいないところです.  これまでの ExcleVBAのプログラム資産を動作を再チェックして,一気にExcle2013に移ってしまうかも含めて,検討し直します.  いずれにしまして,情報ありがとうございました. ==

関連するQ&A

  • 相対パスの指定

    FindFirstFile(), remove(), OPENFILENAME などのファイルやフォルダのパスを扱うものについて、例えば 実行ファイルと同じディレクトリに有るdat.datというファイルを「dat.dat」とだけ書いて相対指定したつもりが、実行ファイルと同じディレクトリにdat.datが無かった場合にWindowsフォルダなどの特殊なフォルダや、AUTOEXEC.BATに書いてあるフォルダを使ってdat.datが検索されて適用されたりすることはあるのでしょうか? いろいろな関数や構造体が有りますが、相対パスが指定されたとき、絶対パスを作るために使用されるフォルダパスが、GetCurrentDirectory()以外のものが使われることってあるんでしょうか?

  • エクセル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              もし何か原因として思いつかれる事がございましたらお教えいただけないでしょうか。 お詳しい方がいらっしゃいましたら何卒よろしくお願いいたします。

  • 相対パスが使えない

    EXCELのファイルを呼び出したいのですが,絶対パスで e:\vb6.0\book1.xls と指定するとファイルが開くのですが, 相対パスで .\book1.xls と指定するとファイルが開けません。 なぜでしょうか? EXCELのファイルとvbのファイルは同じフォルダ内にあります.

  • 【Excel VBA】選択フォルダへの相対パス

    色々なサイトを参考に、Excel VBAにて以下の様なロジックを作りました。 -------------- Dim SHELL, MYPATH Dim TARGETDIR As String Set SHELL = CreateObject("Shell.Application") Set MYPATH = SHELL.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, ThisWorkbook.Path) If MYPATH Is Nothing Then End TARGETDIR = MYPATH.items.Item.Path Set SHELL = Nothing Set MYPATH = Nothing -------------- ブックのあるパス配下のフォルダを選択して、フルパスを"TARGETDIR"に格納します。 質問は2つです。 (1)"~.items.Item.Path"の構文の意味を教えて下さい。 (2)フルパスではなく"ブックのあるパスから見た、選択したフォルダへの相対パス"を知る方法を教えて下さい。 よろしくお願いします。

  • #pragma commentの相対パス指定

    #pragma commentの相対パス指定について、希望の動作をしないません。 状況は以下の通りです。 libというフォルダの中にlibA、libBの二つのフォルダがあり、それぞれのフォルダの中には、lib_a.lib、mylib_b.libというファイルがあるとします。 lib -libA -lib_a.lib -libB -lib_b.lib またライブラリディレクトリにはlibのパスのみが指定されていたとします。 この状況で#pragma comment(lib,"libA\\lib_a.lib")とすると、 「LINK : fatal error LNK1104: ファイル 'libA\lib_a.lib' を開くことができません。」 と出てしまいます。 #pragma commentの中では、相対パスは使えるはずなのですが、なぜこの場合はリンクが出来ないのでしょうか? ちなみに絶対パスで指定した場合はエラーは出ません。 できればフォルダで分割してライブラリを管理したいと考えているので、何か解決方法をご存知の方がいれば、ご教授ください。 環境は ・OS:Windows7 ・使用ソフト:Visual C++ 2010 Express ・言語:C++ です。

  • 絶対パス・相対パス・ディレクトリ・について

    HTMLでホームページを作ろうとしている初心者です、教えてください 自分のホームページのフォルダの中ににリンクするパスの指定方法を相対パスというのはわかりましたが、画像を表示するためのパスの指定方法も相対パスでいいのでしょうか、それともディレクトリというんでしょうか?

  • VB6.0でエクセル保存する時の保存場所の指定。

    VB6.0からデータをエクセルに保存させようとしています。 保存する方法は、エクセルを開くのではなく、 ボタンを押したらそのまま自動で保存させるようにしています。 そしてその名前をつけて保存をさせる処理で、ファイルの保存場所を示す パスの指定で少々困っております。 EXEファイルがある位置をカレントとして同一フォルダ内にあるtestフォルダに 全てデータは保存したいと考えています。 絶対パスを固定で指定すればそこに保存できますが、それだと違うPC上で実行すると 動作しない危険性がありますので、相対パスで指定したいと思っています。 ですが、実行ファイルから"./test/test.xls"と指定してもパスのエラーとなり 保存できません。 しかし絶対パスの固定でフォルダを指定すると保存できます。 ws.Name = "C:\vb_test\test\test.xls" これをEXEファイルのある位置からの相対パスで指定するにはどうすればいいでしょうか?

  • 相対パス

    CFile::Rename(".\\inbox\\mdata05.bin",".\\inbox\\mdata04.bin"); としてサブフォルダー inbox にあるファイルmdata05.binの名前をmdata04.bin にしたいのですが .\\inbox\\mdata05.binには無効なパスが含まれています。 とメッセージが出ます。 相対パスの指定はどのようにすればよいのでしょうか? OSはVista、コンパイラはVC++2005 を使っています。 よろしくお願いします。

  • VBAで「ファイルを開く」ダイアログボックスにパスは指定できますか?

    エクセルVBAでプログラミングをしています。 「ファイルを開く」ダイアログボックスを開くときに、パスを指定して開くことは可能でしょうか? ご存じの方、教えてください。 エクセルは、Excel2000、Excel98などを使用しています。

  • VBAでユーザーにフォルダを指定させたい

     Win2000でEXCEL97を使ってます。  ExcelVBAでダイアログボックスなどによりユーザーにフォルダを指定させたいのです。  ファイルを指定させるには、GetOpenFileNameメソッドを使えば出来ることは分かったのですが、フォルダを指定させるような方法が分からないのです。  本で読んだところでは、Excel2002ではFileDialogプロパティで可能なようなのですが、Excel97では出来ないようで…  97でも可能な方法があればご教授下さい。  よろしくお願いします。

専門家に質問してみよう