2016-09-14 28 views
0

当我叫子pFileName我得到下面的代码的“所需的对象”错误:传递的,每个对象在VBA子或函数

Sub test() 
Dim fs As Object 
Dim csv As Object 
Dim oFolder As Object 

Set fs = CreateObject("Scripting.FileSystemObject") 
Set oFolder = fs.getfolder(Application.CurrentProject.Path) 

For Each csv In oFolder.files 
    Debug.Print csv.Name 
    pFname (csv) 
Next csv 
End Sub 

Sub pFname(ByVal csv As Object) 
    Debug.Print (csv.Name) 
End Sub 

我不知道为什么CSV ISN不认为是一个对象 - 子调用之前Debug.Print语句没有证明它是一个对象吗?

+1

删除括号。 'pFname csv'。 – vacip

回答

2

您需要删除该线路上的括号:pFname (csv)

把周围的参数强制它传递ByVal括号,你不能这样做,与Object,因为Object基本上一个参考。这工作得很好:

Sub test() 
Dim fs As Object 
Dim csv As Object 
Dim oFolder As Object 

Set fs = CreateObject("Scripting.FileSystemObject") 
Set oFolder = fs.getfolder(Application.CurrentProject.Path) 

For Each csv In oFolder.files 
    Debug.Print csv.Name 
    pFname csv '<----- 
Next csv 
End Sub 

Sub pFname(ByVal csv As Object) 
    Debug.Print csv.Name 
End Sub 
+0

太棒了!即使我在函数定义中指定了“ByVal”,那也是有效的。我删除了“ByVal”,它仍然有效。我会保持这种方式,但我只是添加了“ByVal”,因为我在某处看到了一个例子。 –

+1

@BrendanRafferty - 'ByVal'和'ByRef'对象的工作方式相同,只不过它传递的是对象引用''ByVal''或'ByRef'。即,如果将一个对象作为ByVal参数传递并将其设置为该过程中的新对象,则它不会影响调用过程中的变量。如果将一个对象作为ByRef参数传递并将其设置为新对象,则调用过程中的变量也将指向新对象。 – Comintern

+0

@BrendanRafferty参数默认在VBA中传递'ByRef',但在绝大多数情况下,它是'ByVal',这更有意义;默认情况下,VB.NET和其他语言按值传递参数是有原因的。 –