Страницы: 1
RSS
Применение Application.InputBox("Notes", "Header", Type:=8)
 
В ходе дискуссии в топике "Примечания и их перемещение" ( http://www.planetaexcel.ru/forum.php?thread_id=14184 ) узнал о возможности использования Application.InputBox не только для ввода стрингов, но и при указании разных значений Type:  
Type:=0.............A formula  
Type:=1.............A number  
Type:=2.............Text (a string)  
Type:=4.............A logical value (True or False)  
Type:=8.............A cell reference, as a Range object  
Type:=16...........An error value, such as #N/A  
Type:=64...........An array of values  
 
В заинтересовавшем меня варианте, при Type:=8 данный метод во многих случаях с успехом заменяет создание форм с элементом RefEdit, что существенно упрощает код программы.  
 
Сейчас пытаюсь усовершенствовать один из своих макросов, выводивший на лист данные, начиная с ActiveCell (т.к. не хотелось делать UserForm с элементом RefEdit, при помощи которого задавалась бы начальная ячейка).  
Чтобы поменьше переделывать уже отлаженный макрос, решил просто активизировать ячейку, указанную в Application.InputBox("Notes", "Header", Type:=8), а дальше пусть старый макрос работает...  
НаписАл:  
 
Sub test_InputBox()  
  On Error GoTo Cancel_Input  
  With Application  
     .DisplayAlerts = False  
     Application.InputBox("Укажите ячейку", "Выбор ячейки", Type:=8).Activate  
     .DisplayAlerts = True: On Error GoTo 0  
  End With  
  MsgBox "Go My Macros!"  
  Exit Sub  
Cancel_Input:    MsgBox "Error " & Err.Number & " (" & Err.Description & ")"  
End Sub  
НА ТЕКУЩЕМ ЛИСТЕ работает. Указанная ячейка  активируется.  
Не пойму, как активизировать ячейку на другом листе. Вылетаю в ошибку "Error 1004 (Метод Activate из класса Range завершен неверно)"
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Я догадываюсь, что нужно использовать Parent чтобы обратиться к листу...  
Но это возможно только по отношению к Range, а как раз его-то я назначать и не хотел...  
Похоже, без назначения вспомогательного диапазона не обойтись...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Будьте добры.  
 
1) Получается, что (именно при "Type:=8") без 'On Error Resume Next'  
кнопка "Отмена" при любом варианте вызывает ошибку?  
 
если "да", то  
 
2)(при "обязательном" использовании 'On Error Resume Next')  
у полученного 'Range' еще каких-нибудь предсказуемых "подводных камней" не получиться?
 
On Error Resume Next  
Set myRange = Application.InputBox(prompt:="MySample", Type:=8)  
If Err Then Err.Clear: Exit Sub  
On Error GoTo 0
Я сам - дурнее всякого примера! ...
 
Лучше такие потенциальные места выделять в отдельную функцию, чтобы иметь возможность отлавливать другие ошибки в коде  
Public Function GetUserSelect() As Range  
On Error GoTo errHandle  
   Set GetUserSelect = Application.InputBox("Prompt", "Title", Type:=8)  
Exit Function  
errHandle:  
   Set GetUserSelect = Nothing  
End Function  
и анализировать результат  
Set rCell = GetUserSelect  
If Not rCell Is Nothing Then  
End If
 
Большое спасибо.
 
Доброго времени суток!  
Подниму тему. Как обработать три InputBox-а подряд. Все предложенные выше методы для одного рабатают без проблем.    
При "Отмене" на втором InputBox-е выскакивает ошибка типов, на третьем - "Объект занят".    
 
With Application  
   .DisplayAlerts = False  
   Set RnMain = .InputBox( _  
       prompt:="Выделите диапазон", Default:="график", Type:=8)  
   If Err Then Err.Clear: Exit Sub  
   On Error GoTo 0  
     
   Set Rn1 = .InputBox( _  
       prompt:="Выберите ячейку 1", Type:=8)  
   If Err Then Err.Clear: Exit Sub  
   On Error GoTo 0  
 
   Set Rn2 = .InputBox( _  
       prompt:="Выберите ячейку 2", Type:=8)  
   If Err Then Err.Clear: Exit Sub  
   On Error GoTo 0  
End With  
 
Спасибо!
 
А в чём проблема запросить подряд три InputBox? Если правильно понял:  
Sub TestCancel()  
Dim Rng1 As Range, Rng2 As Range, Rng3 As Range  
On Error Resume Next  
Set Rng1 = Application.InputBox("Prompt1", "Title1", Type:=8)  
   If Not Rng1 Is Nothing Then  
       MsgBox Rng1.Address  
   Else  
       MsgBox "Не выбрано 1"  
       Set Rng2 = Application.InputBox("Prompt2", "Title2", Type:=8)  
       If Not Rng2 Is Nothing Then  
           MsgBox Rng2.Address  
       Else  
           MsgBox "Не выбрано 2"  
           Set Rng3 = Application.InputBox("Prompt3", "Title3", Type:=8)  
           If Not Rng3 Is Nothing Then  
               MsgBox Rng3.Address  
           Else  
               MsgBox "Не выбрано 3"  
           End If  
       End If  
   End If  
End Sub
 
Спасибо. Нужно было так:  
 
Sub TestCancel()  
Dim Rng1 As Range, Rng2 As Range, Rng3 As Range  
On Error Resume Next  
Set Rng1 = Application.InputBox("Prompt1", "Title1", Type:=8)  
If Rng1 Is Nothing Then Exit Sub  
 
Set Rng2 = Application.InputBox("Prompt2", "Title2", Type:=8)  
If Rng2 Is Nothing Then Exit Sub  
 
Set Rng3 = Application.InputBox("Prompt3", "Title3", Type:=8)  
If Rng3 Is Nothing Then Exit Sub  
 
End Sub
 
Так вопрос закрыт?
 
Да. Спасибо
Страницы: 1
Читают тему
Наверх