Страницы: 1
RSS
Проблемы с Application.InputBox (....., Type:=8) - не всякие значения хочет принимать
 
Помогите, пожалуйста, разобраться.  
 
При указании в ответ на запрос входного диапазона целиком строки (нескольких строк) или столбца (нескольких столбцов)    
Set inp_RNG = Application.InputBox("Где брать данные?", "Выбор диапазона", Type:=8)  
РАБОТАЕТ.  
При задании ограниченного диапазона или диапазона на другом листе (а уж тем более - книге) - ошибка 424 "Требуется объект"  
 
При указании в ответ на запрос выходного диапазона одной ячейки, целиком строки (нескольких строк) или столбца (нескольких столбцов)    
Set out_RNG = Application.InputBox("Куда выводить список уникальных значений?", "Выбор диапазона", Type:=8)  
РАБОТАЕТ.  
При задании ограниченного диапазона или диапазона на другом листе (а уж тем более - книге) - ошибка 424 "Требуется объект"
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
у меня ограниченный диапазон и другой лист работают
 
Alex_ST, проблема в вашем файле.  
 
Пока он открыт, простейший макрос из справки по VBA не работает ни в одном файле:  
 
Sub test()  
   Dim myCell As Range  
   Set myCell = Application.InputBox(prompt:="Select a cell", Type:=8)  
   MsgBox myCell.Address  
End Sub  
 
 
Как только ваш файл закрываем, макрос сразу начинает работать во всех файлах, выбирая диапазон с любого листа.  
 
Решение: удалите этот файл, и создайте новый.
 
EducatedFool,  
вы (как всегда) абсолютно правы.    
Пришёл домой. Качнул свой файл post_115832.zip на домашний комп. Глючит также как и на работе...  
Послушался вас. Попробовал для чистоты эксперимента не экспортировать модуль из примера чтобы потом импортировать его в новую книгу, а просто сохранить код в "блокноте" (txt).  
Создал новую книгу, а в ней - стандартный модуль. Закинул в модуль текст макроса из txt-файла.  
Всё просто летает и ничего не глючит.  
Теперь бы ещё понять, почему "испортился" файл post_115832.zip (т.е. что в нём не так)?  
Прилагаю (на всякий случай) файл с перезаписанным работающим макросом
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Похоже, я нашёл "где собака порылась"  
Макрос начинает глючить если на листе есть условное форматирование.  
И при этом не простое (по значению ячейки), а только по формуле.  
В своём первом примере я снял УФ вообще и всё заработало.  
Сделал доп. столбец С с вычисляемыми значениями ИСТИНА-ЛОЖЬ по той же формуле, как было в УФ столбца А (=СЧЁТЕСЛИ(A:A;A2)=1).  
Проверил. Работает Application.InputBox в макросе.  
Наложил на ячейки столбца С УФ по критерию: если значение ячейки ИСТИНА, то зелёный.  
Application.InputBox в макросе продолжал работать.  
На ячейки столбца С наложил УФ с формулой =СЧЁТЕСЛИ(A:A;A2)=1, то зелёный.  
Перестал работать Application.InputBox в макросе.  
 
Похоже, что Application.InputBox(...,Type:=8) НЕ ДРУЖИТ с УФ по формуле.  
Наверное, Dophin макрос проверял на своём каком-то списке без УФ. Вот у него всё и заработало.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=09.04.2010 09:42}{thema=}{post}Похоже, я нашёл "где собака порылась"  
Макрос начинает глючить если на листе есть условное форматирование.  
И при этом не простое (по значению ячейки), а только по формуле.  
В своём первом примере я снял УФ вообще и всё заработало.  
Сделал доп. столбец С с вычисляемыми значениями ИСТИНА-ЛОЖЬ по той же формуле, как было в УФ столбца А (=СЧЁТЕСЛИ(A:A;A2)=1).  
Проверил. Работает Application.InputBox в макросе.  
Наложил на ячейки столбца С УФ по критерию: если значение ячейки ИСТИНА, то зелёный.  
Application.InputBox в макросе продолжал работать.  
На ячейки столбца С наложил УФ с формулой =СЧЁТЕСЛИ(A:A;A2)=1, то зелёный.  
Перестал работать Application.InputBox в макросе.  
 
Похоже, что Application.InputBox(...,Type:=8) НЕ ДРУЖИТ с УФ по формуле.  
Наверное, Dophin макрос проверял на своём каком-то списке без УФ. Вот у него всё и заработало.{/post}{/quote}  
Точно также дает сбой Application.GetOpenFileName с параметром MultiSelect:=True  
Насколько мне известно баг возникает при совпадении следующих условий:  
- ячейка с УФ находится на активном листе  
- ячейка с УФ видима, т.е. строка или столбец не скрыты  
- УФ использует формулы с функциями листа  
- иногда при создании файла, баг проявляется не сразу, а после одного или нескольких сохранений :-(
KL
 
{quote}{login=KL}{date=10.04.2010 01:15}{thema=Re: }{post}  
Точно также дает сбой Application.GetOpenFileName с параметром MultiSelect:=True  
Насколько мне известно баг возникает при совпадении следующих условий:  
- ячейка с УФ находится на активном листе  
- ячейка с УФ видима, т.е. строка или столбец не скрыты  
- УФ использует формулы с функциями листа  
- иногда при создании файла, баг проявляется не сразу, а после одного или нескольких сохранений :-({/post}{/quote}  
Кирилл, формулы условного форматирования пересчитываются только в ячейках активного окна, и только если разрешена перерисовка экрана. Поэтому если добавить перед выводом диалога Application.ScreenUpdating = False, то формулы условного форматирования не взрогнут и ничему не помешают. И при мультиселекте код ниже выдаст True    
 
Sub test()  
 Dim arrFiles As Variant  
 Application.ScreenUpdating = False  
 arrFiles = Application.GetOpenFilename(MultiSelect:=True)  
 MsgBox IsArray(arrFiles)  
 Application.ScreenUpdating = True  
End Sub
 
Если быть более точным, то под "только в ячейках активного окна" я подразумевал - "в ячейках ActiveWindow.VisibleRange"
 
Алексей,  
 
С учетом влияния условного форматирования, вместо InputBox используйте форму UserForm1 с контролом RefEdit. Код в форме не нужен (если не добавлять кнопок).    
 
Вызывать из стандартного модуля можно так:  
 
Sub Test()  
   
 Dim RangeAddress As String, Rng As Range  
   
 With UserForm1  
   ' Этот кусок кода можно оформить в виде отдельной функции  
   .Caption = "Введите адрес диапазона данных"  
   .Width = Len(.Caption) * 9  ' <-- подобрать коэф. или с запасом  
   .Show  
   RangeAddress = .RefEdit1  
 End With  
   
 On Error Resume Next  
 Set Rng = Range(RangeAddress) ' <-- использовать  
 If Err Then  
   MsgBox RangeAddress, 16, "Ошибка выбора диапазона"  
   Exit Sub  
 Else  
   MsgBox RangeAddress, 64, "Диапазон:"  
 End If  
 Err.Clear  
   
 ' и так далее  
   
End Sub
 
{quote}{login=ZVI}{date=10.04.2010 02:16}{thema=}{post}{quote}{login=KL}{date=10.04.2010 01:15}{thema=Re: }{post}  
Точно также дает сбой Application.GetOpenFileName с параметром MultiSelect:=True  
Насколько мне известно баг возникает при совпадении следующих условий:  
- ячейка с УФ находится на активном листе  
- ячейка с УФ видима, т.е. строка или столбец не скрыты  
- УФ использует формулы с функциями листа  
- иногда при создании файла, баг проявляется не сразу, а после одного или нескольких сохранений :-({/post}{/quote}  
Кирилл, формулы условного форматирования пересчитываются только в ячейках активного окна, и только если разрешена перерисовка экрана. Поэтому если добавить перед выводом диалога Application.ScreenUpdating = False, то формулы условного форматирования не взрогнут и ничему не помешают. И при мультиселекте код ниже выдаст True    
 
Sub test()  
 Dim arrFiles As Variant  
 Application.ScreenUpdating = False  
 arrFiles = Application.GetOpenFilename(MultiSelect:=True)  
 MsgBox IsArray(arrFiles)  
 Application.ScreenUpdating = True  
End Sub{/post}{/quote}  
Спасибо, Владимир! Я так и делаю. Просто показалось кстати описать именно условия, при которых баг возникает, и как-то не пришло в голову привести решение :-)
 
{quote}{login=ZVI}{date=10.04.2010 03:57}{thema=}{post}Алексей,  
 
С учетом влияния условного форматирования, вместо InputBox используйте форму UserForm1 с контролом RefEdit. Код в форме не нужен (если не добавлять кнопок).    
 
Вызывать из стандартного модуля можно так:  
 
Sub Test()  
   
 Dim RangeAddress As String, Rng As Range  
   
 With UserForm1  
   ' Этот кусок кода можно оформить в виде отдельной функции  
   .Caption = "Введите адрес диапазона данных"  
   .Width = Len(.Caption) * 9  ' <-- подобрать коэф. или с запасом  
   .Show  
   RangeAddress = .RefEdit1  
 End With  
   
 On Error Resume Next  
 Set Rng = Range(RangeAddress) ' <-- использовать  
 If Err Then  
   MsgBox RangeAddress, 16, "Ошибка выбора диапазона"  
   Exit Sub  
 Else  
   MsgBox RangeAddress, 64, "Диапазон:"  
 End If  
 Err.Clear  
   
 ' и так далее  
   
End Sub{/post}{/quote}  
Мимоходом: у RefEdit тоже свои причуды :-)  
 
http://peltiertech.com/WordPress/unspecified-painfully-frustrating-error/  
 
http://peltiertech.com/WordPress/using-refedit-controls-in-excel-dialogs/  
 
и пр.
KL
 
ZVI, KL,  
спасибо за советы, но:  
1. Метод с Application.ScreenUpdating = False ... Application.ScreenUpdating = True для Application.InputBox (....., Type:=8) к сожалению не подходит, т.к. InputBox становится модальным и не отпускает мышку чтобы показать ячейки... :-(  
 
2. Как раз тем меня и прельстило использование Application.InputBox (....., Type:=8), что это позволяет минимизировать код и компактно(в смысле только в одном модуле) его размещать. Ну, точно также как вместо MsgBox никто ведь не использует UserForm, т.к. это неудобно. Создать форму UserForm1 с контролом RefEdit конечно совсем просто, но тогда макрос "размажется" по нескольким модулям книги и из-за этого станет неудобен при переносе из книги в книгу (ведь UserForm, насколько я знаю, перенести в другую книгу можно только через экспорт-импорт).
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=10.04.2010 10:10}{thema=}{post}ZVI, KL,  
спасибо за советы, но:  
1. Метод с Application.ScreenUpdating = False ... Application.ScreenUpdating = True для Application.InputBox (....., Type:=8) к сожалению не подходит, т.к. InputBox становится модальным и не отпускает мышку чтобы показать ячейки... :-(  
 
2. Как раз тем меня и прельстило использование Application.InputBox (....., Type:=8), что это позволяет минимизировать код и компактно(в смысле только в одном модуле) его размещать. Ну, точно также как вместо MsgBox никто ведь не использует UserForm, т.к. это неудобно. Создать форму UserForm1 с контролом RefEdit конечно совсем просто, но тогда макрос "размажется" по нескольким модулям книги и из-за этого станет неудобен при переносе из книги в книгу (ведь UserForm, насколько я знаю, перенести в другую книгу можно только через экспорт-импорт).{/post}{/quote}  
Алексей, по Вашим пуктам:  
п.1 - относилось только к коду Кирилла.  
п.2 - UserForm перетаскивается мышкой :-)
 
да,    
1) открываете 2 книги - одна с вашей UserForm, вторая - та, куда нужно перенести  
2) открываете редактор VBE, нажимаете Ctrl+R - для открытия окошка Project Explorer  
3) находите модуль UserForm в книге источнике (путём раскрытия папок)  
4) хватаете этот модуль мышкой и не отпуская левой кнопки мыли переносите её на ту книгу, куда хотите перенести (всё в этом же окошке Project Explorer), так сказать технология Drag & Drop  
 
и всё. Тоже самое можно и с обычными модулями с кодом и модулями Классов
 
Ну, что такое Drag & Drop объяснять необходимости не было, конечно...  
А вот то что он применим к UserForm - это для меня новость.  
Тем более, что я как-то давно пытался перетаскивать модули и ничего не получилось... Правда, вполне возможно что это было ещё на Excel-98. Не помню. Но точно помню, что не получилось.  
Ща попробую на 2003-ем.  
Но всё равно использование UserForm1 с контролом RefEdit вместо такого удобного Application.InputBox (....., Type:=8) - это как зубной протез: жевать, конечно, позволяет, но  требует отдельной от остальных зубов заботы и ухода.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Поднимаю забытую тему.  
Есть такой глюк, который может попротить много нервов:  
Application.InputBox("…", "…", Type:=8)  
при наличии на листе ячеек с условным форматированием формулой РАБОТАЕТ ТОЛЬКО ПРИ УКАЗАНИИ ДИАПАЗОНА ЦЕЛИКОМ СТРОКИ (нескольких строк) ИЛИ СТОЛБЦА (нескольких столбцов)    
При указании ограниченного диапазона или диапазона на другом листе - Ошибка 424 "Требуется объект"  
 
Я подчистил по максимуму свой пример от всяких лишних кодов.  
Потестируйте, пожалуйста.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Блин... Файл забыл прицепить :(
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Alex_ST, только в 'test_ApplicationInputBoxType0' Вы забыли про ПРОВЕРКУ,  
что формула в боксе - именно адрес диапазона.
 
{quote}{login=Alex_ST}{date=01.04.2011 01:07}{thema=}{post}  
Потестируйте, пожалуйста.{/post}{/quote}  
 
чуть-чуть потестировал.  
результат: да, описанная ошибка иногда возникает.  
не возникает, кроме случаев, приведенных Вами, еще в следующих случаях:  
1. выбрана ОДНА ячейка  
2. диапазон выбран не мышкой, а введен в окно InputBox'а вручную. стиль ссылок - любой: хоть абсолютный, хоть относительный.  
 
конечно, проблемы это не решает.
 
Алекс, вот файл, там немного УФ и InputBox работает без проблем.
 
> Потестируйте, пожалуйста  
 
Потестировал в 2007 - ошибка не возникает.  
Пофиксили или плохой из меня тестер?
 
{quote}{login=Юрий М}{date=01.04.2011 02:10}{thema=}{post}Алекс, вот файл, там немного УФ и InputBox работает без проблем.{/post}{/quote}  
Проблемы:
 
Юрий, не просто УФ, а УФ с вычисляемой формулой.  
Я на выши цифры наложил ( :-)) УФ для выделения уникальных в столбце  
=СЧЁТЕСЛИ(A:A;A2)=1  
и сразу же вывалился в ошибку после вызова вашего инпутбокса...  
А вот на том же диапазоне, но с Type:=0 всё работает прекрасно!  
 
Казанский, а вы мой пример проверяли или свой как Юрий делали?  
Если мой работает, то значит баг пофиксили.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алексей, если ввести трехмерную ссылку (в т.ч. мышкой - а InputBox, оказывается, позволяет делать и это тоже) в варианте с Type:=0, возникает ошибка вот здесь:  
 
Set rRange = Range(Trim(Mid(Application.ConvertFormula(Addr, xlR1C1, xlA1, True), 2)))
 
{quote}{login=Alex_ST}{date=01.04.2011 02:39}{thema=}{post}Юрий, не просто УФ, а УФ с вычисляемой формулой.{/post}{/quote}  
Так нечестно - разговора про формулы в УФ, вроде, не было :-) И я реагировал только на УФ. С формулами у меня тоже барахлит.
 
Юрий! Не лукавьте. Вот цитата:  
{quote}{login=Alex_ST}{date=01.04.2011 01:07}{thema=}{post}…при наличии на листе ячеек с условным форматированием формулой…{/post}{/quote}  
 
ik, я про такую возможность как drag-and-drop в inpitbox вообще в первый раз слышу... Потому и не проверял. Но вообще-то смысла в нём при вводе диапазона на листе я не вижу
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А может я реагировал на сообщение в другой теме...
 
{quote}{login=ik}{date=01.04.2011 02:40}{thema=дополнительная проблема}{post}… если ввести трехмерную ссылку …{/post}{/quote}  
что-то я не понял, что это за зверь?  
Пощупал, выяснил, что это не drag-and-drop имелся ввиду. Туда, вроде, мышкой ничего затянуть нельзя.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=01.04.2011 02:58}{thema=Re: дополнительная проблема}{post}{quote}{login=ik}{date=01.04.2011 02:40}{thema=дополнительная проблема}{post}… если ввести трехмерную ссылку …{/post}{/quote}  
что-то я не понял, что это за зверь?  
Пощупал, выяснил, что это не drag-and-drop имелся ввиду. Туда, вроде, мышкой ничего затянуть нельзя.{/post}{/quote}  
 
нет :) наверное, я плохо объяснил.  
 
в Вашем файле, находясь на листе "Лист1", жмём кнопку "test_ApplicationInputBoxType0".  
щелкаем мышкой по ячейке A1 текущего листа, затем, зажав Shift - по ярлыку листа "Лист3"  
в InputBox'е получаем трехмерную ссылку: ='Лист1:Лист3'!$A$1  
с т.зр. Excel'я это правильная ссылка  
а Ваш макрос так не считает - вылетает с ошибкой 1004
 
А... Это сквозная ссылка на одинаковые ячейки нескольких листов...  
Я такие вообще-то не люблю, не юзаю в формулах и пока не представляю, как их можно в VBA применять, поэтому и не заметил, что вылетает по ошибке... Ну, можно поставить On Error Resume Next и не будет вылетать.  
Зато за одно проверил: не непрерывные диапазоны (выбираемые с зажатым Ctrl) макрос обрабатывает нормально.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх