如何防止 MS Access VBA 将对象转换为字符串?
How do I prevent MS Access VBA from converting objects to strings?
我正在尝试在 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)更一般地说,如何防止对象隐式转换为字符串?
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
的默认 属性 是它的 Name
)
评估的结果就是添加到您的 collection 中的内容。
修复:不要使用
files.Add (File)
但是
files.Add File
提示:任何时候 VB 编辑器在您打开 (
之前放置一个 space 意味着您需要确定您打算使用那些 parens。在方法调用中使用 parens 时基本上要小心,除非您使用 Call
关键字。
我正在尝试在 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)更一般地说,如何防止对象隐式转换为字符串?
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
的默认 属性 是它的 Name
)
评估的结果就是添加到您的 collection 中的内容。
修复:不要使用
files.Add (File)
但是
files.Add File
提示:任何时候 VB 编辑器在您打开 (
之前放置一个 space 意味着您需要确定您打算使用那些 parens。在方法调用中使用 parens 时基本上要小心,除非您使用 Call
关键字。