プロが教えるわが家の防犯対策術!

 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で特に何か設定したということは無いので気持ち悪く,
原因と思われることでご存じ方がいらしたらご教示を頂けると助かります.

 どうぞよろしくお願い致します.

==

A 回答 (4件)

#2の回答者です。



質問者さんは、もう論理的な対処をしたり、回答者の書いた内容の確認もないようです。そこで、後の人のためにまとめておこうと思い立ちました。

----------------
 [.dll] は、[.ocx]に読み替えても可

(1)一般的な.dll (ダイナミックリンク・ライブラリ)は、一般的には、実行ファイル(.exe)や WindowsのSystem32 フォルダに入れる。
 基本はこの通り
 http://www.forest.impress.co.jp/info/knowledge/2 …

(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; …

 ChDrive ActiveWorkbook.Path
 ChDir ActiveWorkbook.Path
が可能と書いてあるが、私自身は、Win32 APIのSetCurrentDirectory をお勧めする。
---------------------

と、以上が、32ビットでの一般的な対処法です。他にも、Excelの特殊なツールによって、設定を変える方法はあるかとは思いますが、基本的なことは変わらないと信じます。自作で、Excel用のライブラリを作れるレベルなら、このような質問はしないはずです。いたずらに、長く話を伸ばしてもしかたがないので、これで終わりにします。
    • good
    • 0
この回答へのお礼

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

==

お礼日時:2014/10/31 19:45

いっその事、絶対パス指定にしてしまうとか



Private Declare Function LoadTT Lib ThisWorkbook.Path & "\○○.dll" _
() As Integer

# ちゃんと Scripting.FileSystemObjectの BuildPath()使ったほうが良いですが w
    • good
    • 0
この回答へのお礼

kittensillabub 様

 ありがとうございます.

 う~ん,そうですね.

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

==

お礼日時:2014/10/26 22:54

こんにちは。



外部の自作のライブラリを使う場合に、相対パスにする作法などは、一般的ではないと思います。
ライブラリなどは、予めパスを通しておくか、絶対パスを指定します。

パスの確認:
 Set WshShellEnv = CreateObject("WScript.Shell").Environment("Process")
 MsgBox WshShellEnv("PATH")

ここで、パスの通っている所に入れれば、そのまま、ライブラリのファイル名だけでよいことになります。

また、Excelのデフォルトのファイル・パスというのは、新規ファイルで、デフォルトで開けた時の場所です。たぶん、今回は、Excel2010のオプションの[保存]の[規定のファイル]の場所の位置が違っていることが、結果に現れているのだろうと思います。

 Application.DefaultFilePath

そうでないなら、つまり力技での場合ですが、

>ChDir ThisWorkbook.Path

これはVBAの中だけの事で、外部ツールの参照先は、ChDirでは変わりません。
フォルダを変更する場合、Win32 APIのSetCurrentDirectoryで変えます。
    • good
    • 0
この回答へのお礼

WindFaller 様

 ご教示,ありがとうございます.

 デスクトップ上に置いたフォルダーの中に,ExcelVBAの.xlsmと.dllファイルを入れますので,
相対パスで問題ないと思うのですが....,どうもうまく見つけてくれません.

 もうしばらく悩んでみます.

==

お礼日時:2014/10/26 22:45

2010のバグかもしれませんね


または相対パスより絶対パスが優先するとか

私自身は2010を使用したことがないので何ともいえませんが

http://needtec.exblog.jp/19041682/

参考になるかもしれません

参考URL:http://needtec.exblog.jp/19041682/
    • good
    • 0
この回答へのお礼

hantoM 様

 情報,ありがうございました.

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

 いずれにしまして,情報ありがとうございました.

==

お礼日時:2014/10/26 15:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!