I apologize if this question was answered previously on this board. My searches didn't turn up what I'm looking for. I am a VBA novice and would like to know if there is a way to populate a userform combobox with the names of all subdirectories contained within a predefined directory (I need the list to be updated every time the userform is launched). I've seen some code that does this on other websites but they were for earlier versions of Excel and I could not get them to work. I am using Excel 2007. I appreciate any help you may be able to provide.
質問する
7995 次
1 に答える
1
Option Explicit
Private Sub UserForm_Initialize()
Dim name
For Each name In ListDirectory(Path:="C:\", AttrInclude:=vbDirectory, AttrExclude:=vbSystem Or vbHidden)
Me.ComboBox1.AddItem name
Next name
End Sub
Function ListDirectory(Path As String, AttrInclude As VbFileAttribute, Optional AttrExclude As VbFileAttribute = False) As Collection
Dim Filename As String
Dim Attribs As VbFileAttribute
Set ListDirectory = New Collection
' first call to Dir() initializes the list
Filename = Dir(Path, AttrInclude)
While Filename <> ""
Attribs = GetAttr(Path & Filename)
' to be added, a file must have the right set of attributes
If Attribs And AttrInclude And Not (Attribs And AttrExclude) Then
ListDirectory.Add Filename, Path & Filename
End If
' fetch next filename
Filename = Dir
Wend
End Function
VBA の経験がほとんどないとおっしゃっていたので、いくつかの注意事項があります。
- 常に
Option Explicit
有効です。言い訳しない。 Dir()
VB でファイルを一覧表示するために使用されます。- コレクションは、VBA の配列よりもはるかに便利です。
- 関数呼び出し ( で使用できる名前付きパラメーターがあります
name:=value)
。それらを使用する必要はありませんが、長い引数リストを理解するのに役立ちます。名前付きパラメーターを使用する場合、引数の順序は関係ありません。ただし、名前付きパラメーターと名前なしパラメーターを混在させることはできません。 - オプションの引数にデフォルト値を指定できます。
ListDirectory
関数名 (この場合) に代入すると、関数の結果が設定されることに注意してください。したがって、関数名をその関数内の変数として直接使用できます。- すべての種類のファイルを返す場合は、に設定
AttrInclude
し-1
ます。便利なことに、-1
は の数値True
、つまりListDirectory("C:\", True)
です。 - どのファイルも除外しない場合に設定
AttrExclude
し0
ます。便利なことに、0
は . の数値ですFalse
。つまりListDirectory("C:\", True, False)
、これはデフォルトでもあります。 - VB 6.0 のすべての論理演算子はビット単位であるため、以下を使用してファイルがディレクトリであるかどうかを確認できます。
If Attribs And VbDirectory Then ...
Or
複数のビット値をと組み合わせることができますvbSystem Or vbHidden
。- したがって、単純なビット単位のロジック チェックでディレクトリをフィルタリングできます。
- オブジェクト ブラウザ (F2 キーを押す) を使用して、
VbFileAttribute
列挙型の定数など、使用可能な関数、型、および定数を調べます。
于 2012-07-26T16:12:48.460 に答える