フォルダ内のファイル属性をGetAttr関数で取得する
フォルダ選択ダイアログからファイル属性を取得するVBAです。
・コマンドボタンのクリックイベント内に作成します。
・ファイル選択ダイアログについては、上記リンクのTipsのままです。
・ファイル選択ダイアログの返り値の最後に「¥」があるかどうか調べ、なければ「¥」を付けています。
・Dir関数をループし、フォルダ内のファイルを全て取り出しています。
・Dir関数の戻り値が"."か ".."の場合は親フォルダなので無視します。
・GetAttr(フォルダ名 + ファイル名)で属性を取得します。
・GetAttr関数の戻り値と定数でANDのBit演算を行い、その結果が定数と同じならば内容を保存しています。
・ファイル名と保存した結果をセルに表示します。
・表示セル位置はCELLS関数で下の行に移動させています。
Option Explicit
Function SelectFolder_FileDialog()
If Application.FileDialog(msoFileDialogFolderPicker).Show Then
SelectFolder_FileDialog = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
Else
SelectFolder_FileDialog = ""
End If
End Function
Private Sub CommandButton1_Click()
Dim sdir As String
Dim sr As String
Dim lr As Long
Dim lret As Long
Dim s1 As String
sdir = SelectFolder_FileDialog
sdir = "c:\test2"
If Right(sdir, 1) <> "\" Then
sdir = sdir + "\"
End If
Range("D3") = sdir
lr = 6
Range("B6:C2000").Clear
sr = Dir(sdir, vbReadOnly + vbHidden + vbDirectory)
Do Until sr = ""
Select Case sr
Case ".", ".."
Case Else
lret = GetAttr(sdir & sr)
s1 = ""
If (lret And vbNormal) = vbNormal Then
s1 = "通常ファイル"
End If
If (lret And vbReadOnly) = vbReadOnly Then
If s1 <> "" Then
s1 = s1 & "、"
End If
s1 = "読み取り専用ファイル"
End If
If (lret And vbHidden) = vbHidden Then
If s1 <> "" Then
s1 = s1 & "、"
End If
s1 = "隠しファイル"
End If
If (lret And vbSystem) = vbSystem Then
If s1 <> "" Then
s1 = s1 & "、"
End If
s1 = "システム ファイル"
End If
If (lret And vbDirectory) = vbDirectory Then
If s1 <> "" Then
s1 = s1 & "、"
End If
s1 = s1 & "フォルダ"
End If
If (lret And vbArchive) = vbArchive Then
If s1 <> "" Then
s1 = s1 & "、"
End If
s1 = s1 & "アーカイブ"
End If
If (lret And vbAlias) = vbAlias Then
If s1 <> "" Then
s1 = s1 & "、"
End If
s1 = s1 & "エイリアス ファイル"
End If
Cells(lr, 2) = sr
Cells(lr, 3) = s1
lr = lr + 1
End Select
sr = Dir
Loop
End Sub
実行結果
実行シートです。
リボンの[開発]~コントロール グループ[挿入]から、ActiveXのコマンドボタンを配置します。
ボタンのプロパティでキャプションを「フォルダ選択」にします。
デザインモードの状態で、ボタンをダブルクリックしVBAを入力します。
実行結果のシートです。
D3セルに対象フォルダ名が表示されています。
B列にファイル名、C列にその属性が表示されています。
6行目はフォルダ、10行目は読み取り専用、13行目は隠しファイルと正常に取得できています。