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