2017-10-12 65 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

相關問題