使用已定义目录中的子目录名称列表填充userform Combobox

时间:2012-07-26 14:44:53

标签: excel vba excel-vba combobox

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

1 个答案:

答案 0 :(得分: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生效。没有任何借口。
  • VB中使用
  • Dir()列出文件。
  • 集合比VBA中的数组更方便。
  • 函数调用中有可用的命名参数(name:=value)。你不必使用它们,但它们有助于理解长参数列表。如果使用命名参数,参数顺序无关紧要。你不能但是,混合了命名和未命名的参数。
  • 您可以使用默认值的可选参数。
  • 请注意,分配函数名称(在本例中为ListDirectory)会设置函数的结果。因此,您可以直接将函数名称用作该函数内的变量。
  • 如果要返回所有类型的文件,请将AttrInclude设置为-1。方便的是,-1True的数值,即ListDirectory("C:\", True)
  • 如果您不想排除任何文件,请将AttrExclude设置为0。方便的是,0False的数值,即ListDirectory("C:\", True, False),这也是默认值。
  • VB 6.0中的所有逻辑运算符都是按位的,因此您可以使用If Attribs And VbDirectory Then ...
  • 检查文件是否是目录
  • 您可以将多个位值与Or结合使用,例如vbSystem Or vbHidden
  • 因此,您可以使用简单的逐位逻辑检查来过滤目录。
  • 使用对象浏览器(点击F2)检查可用的函数,类型和常量,例如VbFileAttribute枚举中的常量。