2013-12-18 5 views
4

Я недавно пытался переопределить функцию доступа Nz(Value, [ValueIfNull]) в Excel, потому что я нахожу ее довольно полезной, но она отсутствует в Excel (поскольку я нашел мое разочарование при перемещении нескольких полезных функций) , Функция доступа Nz проверяет Value - если это значение равно null, оно возвращает ValueIfNull (в противном случае оно возвращает Value). В Access это полезно для проверки значения поля ввода (среди нескольких других вещей):Определить функцию, которая может принимать нулевой параметр

If Nz(myTextBox.Value, "") = "" Then 
    MsgBox "You need to enter something!" 
End If 

прокатного собственные Nz функции не кажется сложным:

Public Function Nz(value As Variant, Optional valueIfNull As Variant = "") As Variant 
    If IsNull(value) Then 
     Nz = valueIfNull 
    Else 
     Nz = value 
    End If 
End Function 

Но как только я пытаюсь назовите его тем, что на самом деле является нулевым, Excel жалуется на него в вызывающей строке (Run-time error '91': Object variable or With block not set, что, как я понимаю, примерно эквивалентно NullReferenceException на других языках), прежде чем попасть в тело функции Nz. Например, Nz(someObj.Value, "") будет работать только в том случае, если someObj.Value не является нулевым (функция полностью отключается).

Я пропустил некоторые детали VBA здесь? Исходя из таких языков, как VB.NET, это кажется очень запутанным - я понимаю, что ссылки на объекты просто адресованы реальному объекту, находящемуся в памяти, и поэтому обход ссылки (а не объекта) не должен вызывать проблемы (пока вы не попытаетесь на самом деле что-то делать с несуществующим объектом, конечно). Например, для:

Dim myObj As SomeObject 
SomeMethod(myObj) 'the call itself is fine 

Public Sub SomeMethod(SomeObject obj) 
    myObj.DoSomething() 'but *here* it would crash 
End Sub 

Как вы можете создавать субтитры и функции в VBA, которые будут принимать нулевой параметр?

+0

Краткое примечание: учитывая, что я могу более или менее реплицировать 'Nz' в Excel с помощью' Iif' вместо этого, но вопрос о определении функций, которые принимают нулевые параметры в целом, а не в качестве исправления для этого конкретного случая - это просто полезный сценарий – Kai

+0

вы хотите работать с вариантами или объектами? –

ответ

8

см this и that если что-то до сих пор неясно, и попробовать

Sub Main() 

    Dim obj As Range 
    Debug.Print Nz(obj) 

    Dim v As Variant 
    v = Null 
    Debug.Print Nz(v) 

End Sub 

Public Function Nz(value As Variant, Optional valueIfNull As Variant = "") As Variant 

    ' deal with an object data type, vbObject = 9 
    If VarType(value) = vbObject Then 
     If value Is Nothing Then 
      Nz = valueIfNull 
     Else 
      Nz = value 
     End If 

    ' deal with variant set to null, vbNull is a Variant set to null 
    ElseIf VarType(value) = vbNull Then 
     If IsNull(value) Then 
      Nz = valueIfNull 
     Else 
      Nz = value 
     End If 
    End If 
End Function 
+1

Просто нашел 'is Nothing', а :) :) Поймите меня, но это должен быть ответ :) – oerkelens

+1

+ 1 Ты сегодня в огне :) –

+1

Отличный ответ, очень полезные ссылки тоже. Благодаря! – Kai

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