Хотя этот вопрос немного старше, я все же хочу показать правильный способ сделать это без ошибок. Вы можете сделать это либо с помощью функции, либо с помощью сабвуфера.
Ваша основная процедура выглядит примерно так:
Sub test()
Dim MyRange As Range
testSub Application.InputBox("dada", , , , , , , 8), MyRange 'doing via Sub
Set MyRange = testFunc(Application.InputBox("dada", , , , , , , 8)) ' doing via function
If MyRange Is Nothing Then
Debug.Print "The InputBox has been canceled."
Else
Debug.Print "The range " & MyRange.Address & " was selected."
End If
End Sub
способ Sub (забавный) будет таким:
Sub testSub(ByVal a As Variant, ByRef b As Range)
If TypeOf a Is Range Then Set b = a
End Sub
И функция будет выглядеть так:
Function testFunc(ByVal a As Variant) As Range
If TypeOf a Is Range Then Set testFunc = a
End Function
Теперь просто используйте так, как вам нравится, и удалите неиспользуемую строку.
При вызове подпрограммы или функции вам не нужно Set
параметр. Тем не менее, не имеет значения, возвращает ли InputBox
объект или нет. Все, что вам нужно сделать, это проверить, является ли параметр тем объектом, который вам нужен, а затем действовать в соответствии с ним.
ИЗМЕНИТЬ
Другой разумный способ — использовать такое же поведение с такой коллекцией:
Sub test()
Dim MyRange As Range
Dim MyCol As New Collection
MyCol.Add Application.InputBox("dada", , , , , , , 8)
If TypeOf MyCol(1) Is Range Then Set MyRange = MyCol(1)
Set MyCol = New Collection
If MyRange Is Nothing Then
Debug.Print "The inputbox has been canceled"
Else
Debug.Print "the range " & MyRange.Address & " was selected"
End If
End Sub
Если у вас еще остались вопросы, спрашивайте ;)
person
Dirk Reichel
schedule
31.05.2016