2015-06-27 4 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

Смежные вопросы