如何防止MS Access VBA将对象转换为字符串?

时间:2015-01-12 23:10:25

标签: vba oop ms-access access-vba

我正在尝试在VBA模块中传递一组Folder对象,但它始终执行对象的隐式转换为String类型

Function GetFolderFiles(ByRef dir As Object) As Collection
Dim files As Collection
Set files = New Collection
For Each file In dir.files
    Debug.Print TypeName(file)
    files.Add (file)
Next frile
For Each subfolder In dir.SubFolders
    Dim sf As Object
    Set sf = subfolder
    Debug.Print TypeName(sf)
    Dim tmpfiles As Collection
    Set tmpfiles = GetFolderFiles(sf)
    For Each File In tmpfiles
        files.Add (File)
    Next File
Next subfolder
Set GetFolderFiles = files
End Function

这是我的测试代码:

Function TestGetFiles()
Dim fso As Object
Dim d As Object
Dim files As Collection

Set fso = CreateObject("Scripting.FileSystemObject")
Set d = fso.GetFolder("C:\Users\X\Documents\My Web Sites")
Set files = GetFolderFiles(d)
For Each f In files
    Debug.Print TypeName(f)
Next f
End Function

如您所见,我打印出TypeName()调用的结果。当我单步执行这些函数时,我在GetFolderFiles中得到了预期的类型“File”,但是当我遍历返回的集合时,对象的类型是“String”。

1)如何从我的函数中获取File对象的集合?

2)更一般地说,如何防止将对象隐式转换为字符串?

1 个答案:

答案 0 :(得分:1)

f(f)之间存在差异,如下面的代码所示:

Function TestGetFiles()

Dim fso As Object
Dim d As Object, f As Object

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set d = fso.GetFolder("C:\_Stuff\test")

    For Each f In d.files
        Debug.Print TypeName(f), TypeName((f)) '>> File     String
    Next f

End Function

f是文件本身,但在括号中包裹f会导致表达式被评估(产生一个字符串:我猜测默认属性File的{​​{1}}是Name) 评估结果是添加到您的收藏中的内容。

修正:不要使用

files.Add (File)

files.Add File

提示:任何时候VB编辑器在打开(之前放置一个空格意味着你需要确定你打算使用那些parens。除非您使用Call关键字,否则在方法调用中使用parens时要特别小心。