2015-01-12 63 views
0

我想傳遞一個VBA模塊中的文件夾中對象的集合,但它一貫執行的對象爲String類型如何防止MS Access VBA將對象轉換爲字符串?

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

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) 並且評估的結果是添加到您的收藏中的內容。

修復:不使用

files.Add (File) 

files.Add File 

提示:你的開場(之前的任何時間的VB編輯器把一個空間意味着你需要確保你的意思是使用那些括號。在方法調用中使用parens時基本要小心,除非您使用關鍵字Call

+0

謝謝蒂姆,這解決了它。我感謝幫助! – egalitarianeric