2017-10-12 74 views
2

我遇到以下代码有问题。在逐步完成它时,使用不带参数括号的子名称和使用带括号的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 

当然,我可以设置一个范围变量,并将其设置每次调用其他功能之间,但我宁愿一个更优雅的方式。请注意,我不只是将大量已知列设置为较高(因为我可以使用一个大范围),但是我缩小了它的范围,使其易于消化,并且仍然是失败的示例!

回答

3
  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,它绕过错误而且什么都不返回。

+0

为什么你需要使用'&'而不是'+'来连接?根据我的经验,它们可以互换使用。 – GibralterTop

+1

这与总是将父对象声明为任何Range对象相同。这是很好的做法。如果你想连接使用'&',如果你想总结使用'+'这样的方式,当用户把数字放在两个单元格中,并且你想连接这些单元格而不是添加时,你不会混淆它们。当用户做出愚蠢的事情时,它会为你节省头痛。 –

+0

啊,我明白了。感谢您的澄清,只要确保没有任何性能考虑因素,我可能会错过良好的'$'。 – GibralterTop

相关问题