人生のプチ美学を教えてください!!

「マクロの記録」のボタンをクリックして以下の作業のマクロ構文をPCに自動記述させた場合
「ChDirステートメント」で必ずカレントフォルダが変更される一文が記述されます

 1.別ファイルを起動させた場合
 2.「名前を付けて保存」の処理を実行させた場合

そのため、今までは「カレントフォルダ」を変更しないことには他のファイルやブックを使用できない
とばかり思っていましたが、下記ホームページを拝見したところフルパス名を使用するのであれば
特に「カレントフォルダ」を変更する必要はなさそうであることが分かりました。

http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …

これって、他のファイルやブックを使用する際に「ファイルを開く」などの操作で「ファイルの場所」を
特定したその作業をPCがマクロ処理として構文を自動作成してしまっただけの「ChDir」であって、
実際のファイル起動などのマクロ構文をフルパス名で記述するのであれば、「ChDirステートメント」
でのカレントフォルダ変更は特に必要ないという認識で正しいのでしょうか?

このことについては何となく理解できたのですが、下記4点について詳しく知りたいので宜しく
お願いします。

 1.「ChDrive」、「ChDir」を省略した方がファイルが軽くなるのか(処理が早くなるのか)
 2.「ChDrive」、「ChDir」を記述した方がファイルが軽くなるのか(処理が早くなるのか)
 3.FSOなどでファイルやフォルダを新たに作成する場合は「ChDir」の記述をした方が良いのか
 4.常にフルパス名でマクロ処理することによるデメリットはあるのか

以上です。宜しくお願いします。

A 回答 (2件)

1.2.環境及びプログラムの書き方によって異なります。


自分で処理時間を計るテストプログラムを作って確認して
ください。
一般には人間が識別できるほどの差は出ません。
(複数回実行した誤差の範囲に含まれてしまうと思います)
3.フルパスで指定するなら必要ありません。
4.http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
> でもマクロ上では「相対パス」で指定して利用したい。
なのでは?
> また、逆に、「カレントフォルダ」を使わないと他のファイル
> やブックを扱うことができないと思っている人もいるようですが、
> ほとんどの場合でそのようなことはなく、フルパスでファイル名を
> 指定すれば良いはずです。
とも書いてありますね。

「マクロの記録」は機械的に操作を細切れで記録します。
> Range("B5").Select
> Selection.NumberFormatLocal = "0_ "
これは、機械的な記録法としては仕方のない事です。
命令の前後関係まで考え出すと処理パターンがどんどん増えて
しまいますので。

しかし、実行時はこの Select 系及び、Active 系の命令が曲者で、
2つの命令の間のコンマ数秒にユーザーの操作が加わって
Select されたオブジェクトが変わっていることがあるわけです。
ですから直接エクセルオブジェクトに命令します。
 Range("B5").NumberFormatLocal = "0_ "

「マクロの記録」をそのまま使うと実に不安定なプログラムと
なります。職業プログラマは処理の意味を理解して安定した
プログラムに書き直します。「マクロの記録」は参考にする
ためのものでしかありません。

「カレントフォルダ」をプログラムで使う事は稀です。
リンク先の説明にあった通り、まず信用できないからです。
フォルダを操作したい場合は、FileSystemObject のフォルダ
オブジェクトをフルパス指定で取得すれば、その後、その
フォルダのみに命令を繰り返す事も簡単に出来ます。
「カレントフォルダ」が他のアプリケーションによって変化
しても影響を受けないプログラムを書けます。

逆に利用する場合は、ユーザの操作を把握する場合や
反映する場合。パスを通していないライブラリの操作を
する場合くらいかなぁ。DOS コマンドとかのレベルなら
カレントフォルダを基準に処理するので使うかもしれない
ですね。
    • good
    • 0
この回答へのお礼

ご丁寧な回答を頂き、誠にありがとうございます。
「カレントフォルダ」を使用せずに、常にフルパス名で使用をした処理を
心がけていこうと思います。また、「マクロの記録」に頼らずにマクロ処理の
意味を理解して安定したシステムを構築していこうと思います。
おかげ様で疑問に思っていたことが全て解決しました。

お礼日時:2011/08/02 12:18

> しかし、実行時はこの Select 系及び、Active 系の命令が曲者で、


> 2つの命令の間のコンマ数秒にユーザーの操作が加わって
> Select されたオブジェクトが変わっていることがあるわけです。
あー、シングルスレッドだから一般的には無いか。
デバッグとか頻繁にしてる人で無いとここに困る事って少ない
かもしれませんね。むしろありがちなのが、Select 出来ない状態
で Select 命令を出して失敗した時(基本的にフォーカスを受け取れ
ない状態=非表示で処理とかプロテクト掛けてたりすると失敗します)
の方が多いでしょうね。

訂正します。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考になりました。

お礼日時:2011/08/02 12:18

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