【本日のミッション】
Dir関数でフォルダ名を取得しようとした時に出てきた「.」「..」のナゾを解明せよ(Excel VBA)
ミッションの概要
Dir関数でフォルダ名を取得しようとしたら、変な文字「.」「..」まで取得されてしまいました。
このナゾを解き、「.」「..」を除外する方法を見つけましょう。
ファイルの準備とプロシージャ
Excelマクロ有効ブック(.xlsm)のファイルを新規作成します。
そのファイルのシートに下記の通り、フォルダのパスを入力するセル(A3)、取得したフォルダ名を書き出すセル(6行目1列目)を準備します。
フォルダパスには、フォルダ名を取得したいフォルダのフルパスを入力します。
このシートをアクティブにした状態で、Alt+F11でVsual Basic Editerを起動します。
[挿入]-[標準モジュール]で新規モジュールを作成し、下記の通りコードを記入します。
Sub 指定したフォルダ内のフォルダ名を全て取得() '【変数】 Dim fd As String 'フォルダ名 Dim t_row As Long '処理ターゲット行 Dim pt As String '処理対象パス '■変数セット pt = Range("A3") '変数ptにセルA3のパスをセット t_row = 6 '変数t_rowにフォルダ名を書き出す初めのセルの行番号をセット fd = Dir(pt & "\" , vbDirectory) '変数fdに1個目のフォルダ名を格納 Do While fd <> "" 'fdが空になるまでDo While内の処理を続ける If GetAttr(pt & "\" & fd) And vbDirectory Then '標準ファイルを取得しないために必要 If fd <> "." And fd <> ".." Then '「.」と「..」を取得しないために必要 Cells(t_row, 1) = fd 'Cells(t_row, 1)にフォルダ名を書き出し t_row = t_row + 1 'フォルダ名を書き出すセルの行番号+1(一つ下の行番号) End If End If fd = Dir() '変数fdに次のフォルダ名を格納(対象データが無い場合は空欄になる) Loop End Sub
記入したプロシージャ(Sub~End Subまで)のどこかにカーソルを置いてF5キーをクリックしてください。
Excelのシートを見てください。
フォルダ名を書き出すセルは6行目の1列目から下に順に書き出すようなコードにしています。
このコードにすると「.」「..」を除外し、フォルダ名のみ取得ができますね♪
標準ファイルを取得しない方法は下記を参照ください。
参照:Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
Dir関数で取得したいフォルダ属性を指定するだけでは足りない
Dir関数は、第1引数に指定したファイル・フォルダが存在する場合、パスを除いたファイル名・フォルダ名を返します。存在しない場合は長さ0の文字列 ”” (空欄)を返します。
Dir(ファイル・フォルダのパス,ファイル・フォルダの属性)
第2引数に下記定数(値)を指定することで、特定の属性のオブジェクトのみを取得の対象とすることができます。
定数 | 値 | 属性 |
vbNormal (既定) | 0 | 標準ファイル |
vbReadOnly | 1 | 読み取り専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システム ファイル |
vbVolume | 8 | ボリューム ラベル。この値を指定すると、すべての属性は無効になります。 |
vbDirectory | 16 | フォルダ |
vbAlias | 64 | エイリアスファイル |
フォルダ名を取り出したい場合、
fd = Dir(pt & "\" , vbDirectory)
の記述だけで十分って思ってしまいますよね。
この記述だけだと
フォルダ名以外に、なぜか標準ファイルと、謎の「.」と「..」という文字を取得してしまっています。
標準ファイルを取得しない方法は下記をご参照ください。
参照:Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
「.」と「..」の正体
この「.」と「..」ってナニ???何かの暗号???ウイルス????
「.」とは自分自身のいるカレントフォルダ、「..」はカレントフォルダの一つ上の階層のフォルダのことを指しています。
今回の処理では
fd = Dir(pt & "\", vbDirectory)
「pt=C:\VBA\第1階層」としているので
「.」は・・・ 「C:\VBA\第1階層」自分自身のフォルダ
「..」は・・・「C:\VBA」 一つ上の階層のフォルダ
となります。
「.」や「..」フォルダを除外したいので、下記条件式を追加ます。
If fd <> "." And fd <> ".." Then End if
【参考】
指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)