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

时间:2017-10-12 17:11:31

标签: excel vba

我遇到以下代码时遇到问题。单步执行它时,使用不带参数括号的子名称和使用带括号的调用都具有相同的行为。同样,删除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

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

1 个答案:

答案 0 :(得分:3)

  1. 您希望使用&进行连接而不是+
  2. 您需要设置对象:
  3.   

    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并且它绕过了错误而没有返回任何内容。