如何将函数的结果传递给子调用?

我有以下代码的麻烦。 在逐步完成时,使用不带参数括号的子名称和带括号的Call都具有相同的行为。 同样,删除ByRef也没有区别。

Vba进入SetRange,将返回值设置为一个Range,然后结束,但是下一步不会进入ColumnToUpper。 也就是说,当它碰到ColumnToUpper的调用块时,它只是进入SetRange一堆,但从不进入任何ColumnToUpper Subs。

'Beginning of main Sub ColumnToUpper SetRange(data, "Last Name") Call ColumnToUpper(SetRange(data, "First Name")) 'more calls End Sub Sub ColumnToUpper(ByRef rng As Range) For i = 1 To rng.Count rng(i) = UCase(rng(i)) Next i End Sub Function SetRange(tbl As ListObject, hdr As String) As Range SetRange = Range(tbl.Name + "[" + hdr + "]") End Function 

当然,我可以设置一个Rangevariables,并在每次调用另一个函数之间进行设置,但我更喜欢更优雅的方法。 请注意,我不仅仅是将已知列的大块设置为上限(因为我可以使用一个大范围),但是我缩小了它的范围,使其易于消化,并且仍然是失败的例子!

  1. 你想用&连接而不是+
  2. 你需要设置对象:

Set SetRange ...

所以:

 Function SetRange(tbl As ListObject, hdr As String) As Range Set SetRange = tbl.Parent.Range(tbl.Name & "[" & hdr & "]") End Function 

事实上,你没有得到一个指向Set问题的错误意味着你有错误的处理。 最有可能你有代码中的On Error Resume Next地方,它绕过了错误,什么都不返回。