2015-06-27 82 views
3

考慮到被調用的過程實際上設置了傳遞的Range對象ByRef,我期望對象引用在調用過程中可用。但它仍然沒有。vba byref參數引用不可用

什麼是修復?

調用

Private Sub Specs_TryGetRangeFromDefinedName_CanFindGlobalName() 

Dim Specs As New SpecSuite 
Dim rngResult As Excel.range 
Dim bResult As Boolean 

bResult = TryGetRangeFromDefinedName(rngResult, "LongTermTaxRate", ThisWorkbook.Name) 
With Specs.It("should return refersTo range when the name is global") 
    .Expect(bResult).ToEqual True 
    .Expect(rngResult.address).ToEqual "$B$2" ** FAIL (object is Nothing)2 
End With 

SpecRunner.RunSuite Specs 

End Sub 

稱爲

Public Function TryGetRangeFromDefinedName(ByRef aRange As Excel.range, _ 
             ByRef aName As String, _ 
             ByRef aWkbName As String, _ 
           Optional ByRef aSheetName As String = vbNullString) As Boolean 

Dim rngResult As Excel.range 

If IsValued(aName) And IsValued(aWkbName) Then 
    On Error Resume Next 
    If IsValued(aSheetName) Then 
     ' local name (presumably) 
     Set rngResult = Workbooks(aWkbName).Worksheets(aSheetName).range(aName) 
    Else 
     ' global name (presumably) 
     Set rngResult = Workbooks(aWkbName).Names(aName).RefersToRange 
    End If 
    TryGetRangeFromDefinedName = (err.Number = 0) 
    On Error GoTo 0 
End If 

End Function 

回答

4

參數aRange從未使用過,並且rngResult分配,但從來沒有被引用。取而代之的是rngResult並指定aRange

另外,如果String參數已通過ByVal,則您的方法的意圖會更清晰,因爲它們未分配。


這些意見都是Rubberduck代碼檢查結果(聲明:我與人共同擁有這個項目)。

+0

我*知道*這是令人難以置信的愚蠢。謝謝 :) – Berryl