ワークブックのあるフォルダのファイルを操作したい

「このエクセルファイル(ブック)のあるパスはわからないものか」ということは多い。
これはThisWorkbook.Pathで知ることができる。
ファイルオープンの例で言えば

Open ThisWorkbook.Path & "\foo.txt" For Output As #1

みたいに書けば良い。

また、デスクトップやマイドキュメント等のフォルダへ操作したいことも多い。
この場合はEnviron関数によって環境変数を取得すると良い。

Open Environ(“HOMEDRIVE”) & Environ(“HOMEPATH”) _
 & “\Desktop” & "\foo.txt" For Output As #1

みたいに書ける。HOMEPATHというのはデスクトップやマイドキュメントのあるフォルダを指す。
これはドライブ名はついていないのでHOMEDRIVEでドライブ名(コロン付き)を取得する。
HOMEPATHに続くのは、デスクトップはDesktop、マイドキュメントはDocuments、ピクチャはPicturesとなる。

また、一時ファイルを置くフォルダを探しているのならTEMPを使うと良いだろう(これはドライブ名付き)。

このようにパスを取得して指定すればそのExcelファイルがあるフォルダに書き出しができる。

問題のある事例としてVBAを使ってファイルに書き出す、ようなときに、ついやりがちなのが

Open "foo.txt" For Output As #1

というような記述だ。

こうすると一言で言えばどこのフォルダに書かれるか分からない。不定状態ということになる。

ソフト的に「不定」というのはあまり適切な表現ではない。
正確に言えばユーザーのファイル操作などによって最後に操作したフォルダである。

一度も操作していなければシステムかExcelのバージョンに依存して決まる。
ともあれ、これはプログラムからすれば不定であるとも言える。

一般常識ではVBAを記述したエクセルファイルのあるフォルダ(開いたフォルダ)に書き出されるように思えるが、エクセルには基本的に「フォルダ」という概念はないようだ。

このことの事例として、例えばフォルダAのtest.xlsを開いた後にフォルダBのtest.xlsを開くと「既に開かれています」というメッセージが出る。
フォルダが違うのに、同じファイルであるという認識をするのだ。
これはフォルダ(パス)を意識してファイルの区別をしていないということである。

蛇足だが、Excelではシート名やファイル名等に角括弧([])を使うとファイル操作の時におかしな動作(場合によっては見慣れないエラー)を起こす。

-