0

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.

4

1 に答える 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)です。
  • どのファイルも除外しない場合に設定AttrExclude0ます。便利なことに、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 に答える