2016-12-16 4 views
1

Dir()を使用して、現在のディレクトリ(つまり、使用しているブックと同じディレクトリ)にファイルが存在するかどうかを調べる練習を行っています。コード与えられた - と明らかにビデオの例で作業が - このようなものです:私はこのコードを実行するとExcelのVBAディレクトリ()のデフォルトパスは?

IsThere = (Dir("SomeFile.xlsx") <> "") 

、IsThereはFalseを返します。私が使用して、それを回避することができます。

IsThere = (Dir(ActiveWorkbook.Path & "\SomeFile.xlsx") <> "") 

が、私は予想通りdirは現在のディレクトリにデフォルトでは見ていない理由を知りたいです。

私はこれに関する適切なアドバイスを見つけるのに苦労しています。私がDir()を使う方法の例のほとんどは、指定されたファイルパスを持っているので、私の問題で本当に光るものではありません。私が見つけた最も近いと言うthis (obsolete) MSDN reference次のとおりです。

が正しく実行するには、Dir関数は、FileIOPermissionの読み取りとPathDiscoveryフラグが実行コードに付与することが必要です。

トラブルがあり、私は本当にthisは、おそらく私の問題に最も近い、StackOverflowのためとして1

にPathDiscoveryを設定する方法についてはそこにリンクされアドバイスを理解していない - これは、指定を使用していますが、ネットワークの場所を参照しているではなく、です。 の回答this questionは、Dir()が期待通りの方法で動作するはずです(完全な指定パスではなく単純なファイル名で動作するはずです)。

+0

ここでの答えは、特定の場所のファイルをテストしてから、 'Dir()'の呼び出しにパスを含める場合です - 例えば 'Dir(" test.xlsx ")' –

答えて

1

これは、ホストアプリケーションがディレクトリであると考えるものとは関係ありません。あなたはいつもCurDir関数を呼び出すことによって、どのディレクトリDirをデフォルトになります見つけることができます。

Debug.Print CurDir$ 

あなたはそれを変更する必要がある場合は、ChDirを呼び出す:コマンドプロンプトで座ってのような、それの

Debug.Print CurDir$ 
Debug.Print Dir$("*.*") 
ChDir "C:\" 
Debug.Print CurDir$ 
Debug.Print Dir$("*.*") 

だと思うがdirまたはcdと入力すると、まったく同じことが実行されます。現在のディレクトリは、マクロ実行の間の状態を保持しているため、デフォルトの場所に依存することはできません。

開いているワークブックに相対的なパスが必要な場合は、デフォルトパスに相対的なパスが必要な場合はWorkbook.Pathを、使用する場合はApplication.Pathを使用します。ファイルの存在をテストする必要がある場合は、Dirをまったく使用しないでください。代わりにScripting.FileSystemObjectを使用してください。レガシーファイルの機能を非難されたものとして考え始めるなら、あなたは大きな好意を持っています。

+1

FSOについて - コードをMacで実行する必要がない限り問題ありませんが、実際には 'Dir()'には何も問題ありません。確かに "遺産"ではない... –

+0

@TimWilliams - その独特の性質に慣れてしまうと、本質的に「Dir」には何も問題はありませんが、FSOははるかに頑強です。たぶん「遺産」は最善の言葉ではないかもしれません - 私は、「もっと良い選択肢が利用できるようになってからずっと前に、長い間存在していた」という意味で使っています。 – Comintern

+0

本当に明確で包括的な答え - 魅力のように働く - ありがとう! –

0

デフォルト設定を確認するには、[Excelオプション] - > [保存] - > [デフォルトファイルの場所]を確認します。ファイルが保存されている場所は、デフォルトでは使用されません。

関連する問題