0

如果此问题之前已在此板上回答,我深表歉意。我的搜索没有找到我要找的东西。我是 VBA 新手,想知道是否有办法使用预定义目录中包含的所有子目录的名称填充用户表单组合框(我需要在每次启动用户表单时更新列表)。我在其他网站上看到过一些执行此操作的代码,但它们适用于早期版本的 Excel,我无法让它们工作。我正在使用 Excel 2007。感谢您提供的任何帮助。

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)
  • 如果您不想排除任何文件,请设置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 回答