Страницы: 1
RSS
Как вызвать и заполнить раскрывающийся список с помощью VBA?
 
Имеется ввиду не тот список, который формируется проверкой вводимых значений, а тот, который вызывается по правому щелчку мыши (или по Alt + стрелка вниз). По умолчанию он заполняется данными из текущего столбца, а как его заполнить собственными данными, хранящимися, например, в массиве, или на другом листе?  
 
Странно, но нигде не встречал материалов по этой теме.
 
Кажется VovaK решал (и решил) эту проблему. Может увидит этот пост...
 
Точно!
 
{quote}{login=The_Prist}{date=01.12.2009 02:03}{thema=}{post}И не найдете. Это встроенное средство и работать с ним напрямую нельзя. Можете только создать некий аналог: назначить при открытии книги на сочетание клавиш Alt+вниз некий макрос, который будет формировать список из нужных значний и выводить его Вам в виде формы.{/post}{/quote}  
 
Создал аналог, но возникли проблемы с позиционированием его под ячейкой. Во многих примерах позиционирование осуществляется с помощью мышиного указателя, а вот материалов про позиционирование, подобное раскрывающемуся списку (так, чтобы можно было переходить между ячейками стрелками), я либо не встречал, либо их нет.  
 
Может с помощью API это можно как-то решить?
 
{quote}{login=The_Prist}{date=01.12.2009 02:25}{thema=Re: Re: }{post}{quote}{login=Валерий}{date=01.12.2009 02:21}{thema=Re: }{post}возникли проблемы с позиционированием его под ячейкой.  
Может с помощью API это можно как-то решить?{/post}{/quote}Это уже обсуждается(кстати по Вашей инициативе) в теме - "Узнать координаты ячейки".{/post}{/quote}  
 
Про API я имел ввиду эту тему. Может кому-нть известно как вызвать процедуру, отвечающую за раскрывающийся список с помощью Excel'евского API ? Это было бы наиболее оптимальное решение для такой задачи.
 
{quote}{login=Валерий}{date=01.12.2009 02:00}{thema=Как вызвать и заполнить раскрывающийся список с помощью VBA?}{post}Имеется ввиду не тот список, который формируется проверкой вводимых значений, а тот, который вызывается по правому щелчку мыши (или по Alt + стрелка вниз). По умолчанию он заполняется данными из текущего столбца, а как его заполнить собственными данными, хранящимися, например, в массиве, или на другом листе?  
 
Странно, но нигде не встречал материалов по этой теме.{/post}{/quote}  
 
В свое время тоже пытался это сделать. Решил что самый простой способ эмулировать нажатие Alt+Down  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
If Target.Cells.Count = 1 Then  
   If Not (Intersect(Target, Me.Range("A1:A100")) Is Nothing) Then SendKeys "%{DOWN}", True  
End If  
End Sub  
 
те в данном случае если курсор в диапазоне  "A1:A100" происходит выведение списка. В excel2003 отлично работает.
 
{quote}{login=The_Prist}{date=01.12.2009 02:55}{thema=}{post}{quote}{login=Jom}{date=01.12.2009 02:53}{thema=Re: Как вызвать и заполнить раскрывающийся список с помощью VBA?}{post}те в данном случае если курсор в диапазоне  "A1:A100" происходит выведение списка. В excel2003 отлично работает.{/post}{/quote}Все красиво, но есть одно НО. Человеку нужно выводить СВОЙ список, а не тот, что предлагает Excel при инажатии Alt+Down.{/post}{/quote}  
если на другом листе то только через проверку значений.  
Как вариант можно зарезервировать и заполнить нужными данными строки сверху и скрыть. Но и там одно но. Заполнение списка должно идти без пустых строк.  
В принципе всё реализуемо , но с проверкой значений это делает на порядок проще.  
Советую автору идти именно в этом  направлении.
 
1. Нет, вариант с резервируемыми ячейками не подойдет - этот список будет динамичным (фактически - список найденных (по тексту изменяемой ячейки) значений из которых выбирается нужное).  
2. Что касается списка проверяемых значений, я уже думал над этим, но меня поставил в тупик такой вопрос: а возможно ли раскрыть список проверяемых значений и установить фокус на него после события Worksheet_Change, чтобы не нажимать постоянно на стрелочку? Данных много, поэтому расстояние между мышкой и клавой увеличивается с 10 см. до нескольких десятков метров :)
 
{quote}{login=The_Prist}{date=01.12.2009 02:50}{thema=}{post}У Excel-я есть свой API?! Я в шоке!{/post}{/quote}  
 
Я имел в виду Win, разумеется. Все они от лукавого :)
 
{quote}{login=The_Prist}{date=01.12.2009 03:47}{thema=}{post}Так выпадающий список так же по Alt+Down раскрывается и с помощью клавиш Вниз/Вверх выбирается значение, а Enter-ом вноситься в ячейку.  
Или я что-то не так понимаю?{/post}{/quote}  
 
Это так. Только в моем случае порядок событий такой: сначала вносится значение в пустую ячейку, оно обрабатывается событием Worksheet_Change и формирует отфильтрованный по значению ячейки массив значений, затем по этому массиву должен формироваться список (в той ячейке где введено искомое значение), затем он должен раскрываться и ставить курсор на первую запись.  
 
Вот, как-то так )
 
надо макросом после алт+вниз_стрелка  
1. Макрос ищет значения в списке1 и формирует свой массив с данными (думаю именнованый)  
2. на активную ячейку вешаеться список равный именованому диапазону.  
 
вариант 2    
1. Макрос ищет значения в списке1 и формирует свой массив с данными.  
2. под активную ячейку создается листбокс и данными.  
3. после выбора и энтера листбокс удаляется.
 
{quote}{login=Марчук}{date=01.12.2009 04:07}{thema=}{post}надо макросом после алт+вниз_стрелка  
1. Макрос ищет значения в списке1 и формирует свой массив с данными (думаю именнованый)  
2. на активную ячейку вешаеться список равный именованому диапазону.  
 
вариант 2    
1. Макрос ищет значения в списке1 и формирует свой массив с данными.  
2. под активную ячейку создается листбокс и данными.  
3. после выбора и энтера листбокс удаляется.{/post}{/quote}  
 
 
А может Вы знаете и как листбокс под активную ячейку запихнуть ?!!! ))
 
в соседней теме вам давали линки на привязку формы к ячейке.  
Тут тоже самое , просто вместо формы listbox
 
{quote}{login=}{date=01.12.2009 04:16}{thema=Re: }{post}{quote}{login=Марчук}{date=01.12.2009 04:07}{thema=}{post}надо макросом после алт+вниз_стрелка  
1. Макрос ищет значения в списке1 и формирует свой массив с данными (думаю именнованый)  
2. на активную ячейку вешаеться список равный именованому диапазону.  
 
вариант 2    
1. Макрос ищет значения в списке1 и формирует свой массив с данными.  
2. под активную ячейку создается листбокс и данными.  
3. после выбора и энтера листбокс удаляется.{/post}{/quote}  
 
 
А может Вы знаете и как листбокс под активную ячейку запихнуть ?!!! )){/post}{/quote}  
вот узнал  
Sub CreateOLEObjects()  
Dim ws As Worksheet  
Dim tSh As OLEObject  
   
   Application.ScreenUpdating = True  
   Set ws = ActiveSheet  
       
 
       Set tSh = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", Link:=False, _  
           DisplayAsIcon:=False, Left:=ActiveCell.Left, Top:=ActiveCell.Top + ActiveCell.Height, _  
           Width:=200, Height:=100)  
           
End Sub
 
{quote}{login=The_Prist}{date=01.12.2009 04:15}{thema=}{post}Одну строчку добавил - чтоб не ругался на значения, не входящие в список.{/post}{/quote}  
 
Посмотрел. Очень просто и красиво! Спасибо, мастер The_Prist :)  
 
Один момент: этот список теперь ведь всегда будет появляться при изменении? А как выйти из этого события по Enter'у?
 
{quote}{login=The_Prist}{date=01.12.2009 04:52}{thema=Re: Re: }{post}{quote}{login=Валерий}{date=01.12.2009 04:50}{thema=Re: }{post}А как выйти из этого события по Enter'у?{/post}{/quote}Плохо понял. Выйти по Enter'у как? После выбора значения, не выбирая значения или что? Можете поподробней объяснить суть вопроса?{/post}{/quote}  
 
Выбрать значение Enter'ом, и после этого закрыть список.
 
{quote}{login=Jom}{date=01.12.2009 04:38}{thema=}{post}в соседней теме вам давали линки на привязку формы к ячейке.  
Тут тоже самое , просто вместо формы listbox{/post}{/quote}  
 
Спасибо, Jom. Но там не совсем то, что мне нужно. Марчук подсказал дельный вариант, буду двигаться в его направлении.
 
{quote}{login=Марчук}{date=01.12.2009 04:44}{thema=Re: Re: }{post}{quote}{login=}{date=01.12.2009 04:16}{thema=Re: }{post}{quote}{login=Марчук}{date=01.12.2009 04:07}{thema=}{post}  
вот узнал  
Sub CreateOLEObjects()  
Dim ws As Worksheet  
Dim tSh As OLEObject  
   
   Application.ScreenUpdating = True  
   Set ws = ActiveSheet  
       
 
       Set tSh = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", Link:=False, _  
           DisplayAsIcon:=False, Left:=ActiveCell.Left, Top:=ActiveCell.Top + ActiveCell.Height, _  
           Width:=200, Height:=100)  
           
End Sub{/post}{/quote}  
 
Отлично, после незначительной доработки ListBox появляется под ячейкой без всяких дополнительных расчетов. А можно ли то же самое проделать с готовой формой?
 
Спасибо всем за интересные предложения. Я попробую поковыряться в сторону OLEObjects и ListBox'а.
Страницы: 1
Читают тему
Наверх