【问题标题】:Passing a for-each object to a sub or function in vba将for-each对象传递给vba中的子​​或函数
【发布时间】:2016-09-14 17:28:49
【问题描述】:

当我调用 sub pFileName 时,我收到“需要对象”错误,代码如下:

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 视为对象 - 子调用之前的 Debug.Print 语句是否证明它是一个对象?

【问题讨论】:

  • 删除括号。 pFname csv.

标签: vba object foreach


【解决方案1】:

您需要删除此行的括号: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

【讨论】:

  • 太棒了!这有效......即使我在函数定义中指定了“ByVal”。我删除了“ByVal”,它仍然有效。我会保持这种方式,但我只添加了“ByVal”,因为我在某处看到了它的一个例子。
  • @BrendanRafferty - ByValByRef 对对象的工作方式相同,只是它传递对象 reference ByValByRef。即,如果您将对象作为ByVal 参数传递并将其设置为过程中的新对象,则不会影响调用过程中的变量。如果将对象作为ByRef 参数传递并将其设置为新对象,则调用过程中的变量也将指向新对象。
  • @BrendanRafferty 参数在 VBA 中默认传递 ByRef,但在绝大多数情况下,ByVal 更有意义; VB.NET 和其他语言默认按值传递参数是有原因的。
猜你喜欢
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多