
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 …
(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用のライブラリを作れるレベルなら、このような質問はしないはずです。いたずらに、長く話を伸ばしてもしかたがないので、これで終わりにします。
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 様に再度感謝申し上げます.有難うございました.
==
No.3
- 回答日時:
いっその事、絶対パス指定にしてしまうとか
Private Declare Function LoadTT Lib ThisWorkbook.Path & "\○○.dll" _
() As Integer
# ちゃんと Scripting.FileSystemObjectの BuildPath()使ったほうが良いですが w
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で変えます。
WindFaller 様
ご教示,ありがとうございます.
デスクトップ上に置いたフォルダーの中に,ExcelVBAの.xlsmと.dllファイルを入れますので,
相対パスで問題ないと思うのですが....,どうもうまく見つけてくれません.
もうしばらく悩んでみます.
==
No.1
- 回答日時:
2010のバグかもしれませんね
または相対パスより絶対パスが優先するとか
私自身は2010を使用したことがないので何ともいえませんが
http://needtec.exblog.jp/19041682/
参考になるかもしれません
参考URL:http://needtec.exblog.jp/19041682/
hantoM 様
情報,ありがうございました.
Excel2003を卒業して2007に慣れだしたところなので,Excel2010にはまだ移りたいないところです.
これまでの
ExcleVBAのプログラム資産を動作を再チェックして,一気にExcle2013に移ってしまうかも含めて,検討し直します.
いずれにしまして,情報ありがとうございました.
==
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Excel(エクセル) [クイックアクセスツールバー]の設定ファイルの格納場所について、 5 2023/04/21 14:43
- Excel(エクセル) Excel起動時にエラーダイアログが表示される 3 2022/07/28 19:52
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Visual Basic(VBA) VBSで作成した相対パスのショートカットが他者と共有できません。 1 2022/09/05 11:20
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
エクセルVBAで一つ上の階層...
-
実行ファイルのパスを取得したい
-
VBAでパワーシェルを実行したい...
-
Excel 相対パス
-
xcopyコマンドの進行状況を表示...
-
C#でのProcess.Startと変数path
-
初心者powershellのPS1ファイル...
-
コマンドプロンプトのコピー関...
-
ExcelVBAの使い方 ¥の使い方...
-
【VB.NET】App.configにファイ...
-
Dosバッチでファイルパスからフ...
-
MPLABの使い方をご教示下さい。
-
phpに関わる所での、form actio...
-
パスワード保護されたExcelファ...
-
ユーザディレクトリのパス指定
-
Accessで「ファイルを開く」ダ...
-
【VBA】複数のtxtファイルから...
-
outlook開けない
-
EXCEL(VBA)で指定フォルダ内の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
エクセルVBAで一つ上の階層...
-
xcopyコマンドの進行状況を表示...
-
Excel 相対パス
-
実行ファイルのパスを取得したい
-
コマンドプロンプトのコピー関...
-
【VB.NET】App.configにファイ...
-
エクセルのマクロで特定フォル...
-
VBA★PDFをPDFアプリで印刷し...
-
ExcelVBAの使い方 ¥の使い方...
-
fopenでのパス指定
-
ExcelのVBAで上書き保存を確...
-
EXCEL(VBA)で指定フォルダ内の...
-
C#でのProcess.Startと変数path
-
【VBA】ExcelマクロでCSVファイ...
-
VBAでパワーシェルを実行したい...
-
A列に記載されているフォルダ...
-
初心者powershellのPS1ファイル...
-
Eclipse
-
VBAとロングファイル名
おすすめ情報