Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 17:12   #1
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
Вопрос ComboBox умеет предлагать список похожих вариантов?

Здравствуйте!
Можно в комбобоксе сделать так, чтобы при наборе слова он предлагал уже похожие варианты и при перелистывании (стрелками) можно было бы перемещаться не по всему списку, а по суженному списку на основе введенного.

И еще один маленький вопрос.
Можно ли сделать так, чтобы при вводе слова, комбобокс не только дописывал слова, но и показывал выпадающий список этих похожих слов (см. первый вопрос)

Спасибо.

Последний раз редактировалось frantic150; 31.05.2009 в 17:14.
frantic150 вне форума Ответить с цитированием
Старый 31.05.2009, 17:41   #2
pivas
Форумчанин
 
Регистрация: 03.04.2009
Сообщений: 412
По умолчанию

Скорее всего Вам сюда http://programmersforum.ru/showthrea...EF%EE%E8%F1%EA
pivas вне форума Ответить с цитированием
Старый 31.05.2009, 17:51   #3
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
По умолчанию

Цитата:
Сообщение от pivas Посмотреть сообщение
Скорее всего Вам сюда http://programmersforum.ru/showthrea...EF%EE%E8%F1%EA
но там немного другой вопрос
frantic150 вне форума Ответить с цитированием
Старый 31.05.2009, 23:41   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Можно в комбобоксе сделать так, чтобы при наборе слова он предлагал уже похожие варианты и при перелистывании (стрелками) можно было бы перемещаться не по всему списку, а по суженному списку на основе введенного.
Нет. Такое невозможно.

Дело в том, что сужать список приходится программно - по событию ComboBox1_Change - примерно таким кодом:
Код:
Private Sub ComboBox1_Change()
    If stopEv Then Exit Sub
    stopEv = True
    
    txt = Me.ComboBox1
    Me.ComboBox1.Clear
    For i = 1 To 100
        cv = Cells(i, 1)
        If cv Like txt & "*" Then Me.ComboBox1.AddItem cv
    Next
    Me.ComboBox1 = txt

    stopEv = False
    DoEvents
    ' Application.SendKeys "{F4}"
End Sub
После ввода нового символа весь список комбобокса затирается, а потом заполняется вновь, но уже только подходящими значениями.

Строка Application.SendKeys "{F4}" позволяет программно "нажать на стрелочку" комбобокса, чтобы отобразился выпадающий список.
(Метод ComboBox1.DropDown почему-то работает некорректно, отрисовывая список в углу экрана)

Во-первых, возникает небольшая проблема - весь список допустимых значений почему-то упаковывается в одну строку комбобокса (типа как в однострочном листбоксе). Но эту проблему, в принципе, при желании можно обойти.

Проблема в другом. Список-то мы можем урезать, а вот пролистывать оставшиеся в нём значения (стрелками вверх и вниз) не получится.
При нажатии одной из стрелок мы выбираем следующий подходящий пункт из списка, и этот пункт автоматически попадает в основное поле комбобокса.
Что происходит дальше, думаю, Вы догадываетесь.
Комбобокс по-новой запускает выборку подходящих значений - но теперь подходящее значение уже только одно - и пролистывать уже нечего...

Цитата:
Можно ли сделать так, чтобы при вводе слова, комбобокс не только дописывал слова, но и показывал выпадающий список этих похожих слов
Тут всё просто.
Поэкспериментируйте с изменением свойства MatchEntry комбобокса.
А для появления списка используйте такой код:
Код:
Private Sub ComboBox1_Change()
    Application.SendKeys "{F4}"
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 01.06.2009, 00:44   #5
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
По умолчанию

to EducatedFool

Спасибо. Ну хоть что-то

У меня возник еще один вопрос. Как сделать так, чтобы введенные данные в UserForm сохранялись (все комбобоксы, текстбоксы). UserForm.Hide не помогает (почему то все равно UserForm очищается через некоторое время, как я понял, если зайти в другую книгу/лист и т.п.)

О! Плиз помогите, возник еще один вопрос
Как мне ввести этот код для всех комбобоксов сразу (наверняка можно)
Код:
Private Sub ComboBox1_Change()
    Application.SendKeys "{F4}"
End Sub
Для одного комбобокса то понятно, но у меня этих комбобоксов 40 шт. :D Да к тому же еще 13 UserForm'ов в каждой их которых по 40 комбобоксов и по 40 текстбоксов. Всего 40*14=560 комбобоксов xD


P.S. Вы даже не представляете что я там натворил у себя в excel :D. Вручную вдолбливал любые нарастающие изменения. Вот к примеру

Код:
Private Sub ComboBox1_Change()
Worksheets("data").Range("A1") = ComboBox1.ListIndex
End Sub

Private Sub ComboBox2_Change()
Worksheets("data").Range("A2") = ComboBox2.ListIndex
End Sub

Private Sub ComboBox3_Change()
Worksheets("data").Range("A3") = ComboBox3.ListIndex
End Sub

Private Sub ComboBox4_Change()
Worksheets("data").Range("A4") = ComboBox4.ListIndex
End Sub

Private Sub ComboBox5_Change()
Worksheets("data").Range("A5") = ComboBox5.ListIndex
End Sub
...
...
' И так до 40-го


И так в каждой форме. (а их 14, как вы помните )

Последний раз редактировалось frantic150; 01.06.2009 в 00:54.
frantic150 вне форума Ответить с цитированием
Старый 01.06.2009, 01:27   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Вы даже не представляете что я там натворил у себя в excel
В том-то и дело, что не представляю...

Будет файл, и подробное описание того, чего Вы пытаетесь добиться, - другое дело.

Цитата:
Всего 40*14=560 комбобоксов
Подумаешь... всего-то полторы тысячи строк кода

При таком количестве элементов на форме проще использовать классы.
Пример можно посмотреть в этой теме: http://www.programmersforum.ru/showthread.php?t=37287
EducatedFool вне форума Ответить с цитированием
Старый 01.06.2009, 18:06   #7
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
По умолчанию

Цитата:
Будет файл, и подробное описание того, чего Вы пытаетесь добиться, - другое дело.
Прикрепляю файл. Остаются вопросы:
  1. Как сделать так, чтобы введенные данные в UserForm сохранялись (все комбобоксы, текстбоксы). UserForm.Hide не помогает (почему то все равно UserForm очищается через некоторое время, как я понял, если зайти в другую книгу/лист и т.п.)
  2. Как мне ввести обработку событий для всех комбобоксов сразу (и текстбоксов тоже). Или как правильно использовать классы?
Вложения
Тип файла: rar бланк 12.34 бета8.rar (234.6 Кб, 50 просмотров)
frantic150 вне форума Ответить с цитированием
Старый 01.06.2009, 23:13   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Теперь все элементы на форме формируются динамически:



Обработка событий теперь осуществляется одной строкой для всех элементов управления:
Код:
Private Sub TheCombo_Change()
    If StopEvents Then Exit Sub
    Worksheets("data" & F.Tag).Range("A" & Me.TheCombo.Tag) = Me.TheCombo.ListIndex
End Sub

Private Sub TheTextBox_Change()
    If StopEvents Then Exit Sub
    Worksheets("data" & F.Tag).Range("B" & Me.TheTextBox.Tag) = Me.TheTextBox.Text
End Sub
Убрал все лишние 14 форм.
Последние введённые данные на форме сохраняются (если, конечно, закрывать форму не крестиком, а кнопкой ГОТОВО)

Запуск формы теперь осуществляется не нажатием одной из кнопок, а двойным щелчком по зелёным ячейкам на листе ВСЕГО.

TextBox_LOG добавлен лишь для визуального контроля над срабатыванием событий в элементах класса.

Что должно происходить при изменении значений полей, и нажатии на кнопку ГОТОВО, толком не понял. (сделал так, как было раньше)

Форму Магазины не изменял.

Параметры моей формы можно изменить в обработчике события UserForm_Initialize
Для этого предусмотрены строки:
Код:
СтрокВСтолбце = 18: TopPosition = 20: LeftPosition1 = 15
    LeftPosition2 = 240: Высота = 18 '  Высота - это размер комбобоксов по вертикали
Будут вопросы - обращайтесь.
Вложения
Тип файла: rar frantic_2.rar (87.0 Кб, 177 просмотров)
EducatedFool вне форума Ответить с цитированием
Старый 02.06.2009, 00:16   #9
frantic150
Пользователь
 
Аватар для frantic150
 
Регистрация: 25.05.2009
Сообщений: 31
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Что должно происходить при изменении значений полей, и нажатии на кнопку ГОТОВО, толком не понял. (сделал так, как было раньше)
есть должно происходить вот что: http://programmersforum.ru/showthread.php?t=52426

Не работает. Вот здесь
Код:
sh1.Cells(j, 11).Value = Worksheets("data" & F.Tag).Cells(i, 2).Value
выдает ошибку 1004
Добавлено спустя 2 часа И я понял почему Оказывается на листы Дата-Дата13 с полей возвращались номера строк с цифры 0 (если картофель). А ячейки с адресом 0 не существует. Вот из-за чего выдавало 1004
Как изменить этот участок, чтобы все правильно заполнялось?
Я пробовал
Код:
sh1.Cells(j, F.Tag) но опять выдает 1004
Но мне выдает ошибку 1004

--------------

Вы не привязывали листы м1-м14 к чему-либо? (По кодам ,вроде, вы их вроде никуда не приписывали, но все же увидел в текстбокс_ЛОГе ("Лист м1") и это меня немножко смутило ) Просто, их вообще не нужно трогать, т.к. это накладные, которые в последствии печатаются/ Просто я подумал, может вы их использовали, ссылаясь на тот факт, что имена этих листов (м1-м14) могут ассоциироваться с нашим делом. Но они отношения к формам не имеют. Они заполняются по листу "Всего".

А вот отношение к формам имеют листы data-data13. Как я понял, вы их и использовали в кодах. Вопрос: система заполнения ячеек на "Всего" основываясь на данных листов "data", "data2"..."data13" осталась прежним? Т.е. ячеки заполняются на основе номера строки (listbox) и значения listbox?

И объясните, пожалуйста, вот этот
Код:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Row = 2 And Target.Rows.Count = 3 Then
        Cancel = True: F.Caption = Target.Cells(1).Value:
        F.Tag = Mid(F.Caption, 2)    ' номер листа
        If IsNumeric(F.Tag) Then F.Show
    End If
End Sub
Что значит ("data" & F.Tag)?

Огромное спасибо, за то что уделили время моей проблеме.

Последний раз редактировалось frantic150; 02.06.2009 в 01:33.
frantic150 вне форума Ответить с цитированием
Старый 02.06.2009, 08:31   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

У каждого комбобокса, листбокса, и формы есть свойство Tag

Для комбобоксов и листбоксов мы храним в этом свойстве порядковый номер этого элемента.
(чтобы при изменении значения знать, в какую строку вносить данные)

Для формы в этом свойстве храним номер листа, на который будет производиться запись
(чтобы знать, на какой лист записывать данные - на лист data5 или лист data12

Код:
' срабатывает автоматически при двойном щелчке на ячейках листа ВСЕГО
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Row = 2 And Target.Rows.Count = 3 Then
        ' если двойной щелчок выполнен на ячейке второй строки,
        ' к примеру, DoubleClick выполнялся на ячейке "м12"
        ' и ячейка объединённая (остоит из 3 строк), то:
        Cancel = True:    ' отменяем режим правки в ячейке (действие по умолчанию)
        
        F.Caption = Target.Cells(1).Value    ' (в заголовок формы пишем содержимое той ячейки)

        ' в свойство Tag формы пишем номер магазина = 12
        ' (содержимое ячейки, начиная со 2-го символа = Mid(F.Caption, 2))
        F.Tag = Mid(F.Caption, 2)    ' номер листа

        ' если номер магазина является числом (щелкнули на ячейке "м5" или "м12", а не на ячейке Машина 1)
        If IsNumeric(F.Tag) Then F.Show    ' тогда запускаем форму
    End If
End Sub
Цитата:
Оказывается на листы Дата-Дата13 с полей возвращались номера строк с цифры 0 (если картофель). А ячейки с адресом 0 не существует. Вот из-за чего выдавало 1004
Я не разбирался особо в Вашем коде.
Как у Вас было, так я и оставил.

Цитата:
А вот отношение к формам имеют листы data-data13. Как я понял, вы их и использовали в кодах
Это надо спросить у Вас.
В Вашим формах были сотни строк такого кода:
(пример для формы м10)
Код:
Private Sub ComboBox12_Change()
    Worksheets("data10").Range("A12") = ComboBox12.ListIndex
End Sub
Private Sub ComboBox13_Change()
    Worksheets("data10").Range("A13") = ComboBox13.ListIndex
End Sub
Зачем надо записывать ListIndex каждого комбобокса на лист dataXX в столбец А, известно только Вам.

Я лишь оптимизировал ВАШ код, сократив количество строк до минимума, и убрал повторяющийся под.

Цитата:
должно происходить вот что: http://programmersforum.ru/showthread.php?t=52426
Там я мало чего понял.
Хотя бы потому, что там нет примера файла, и ничего не сказано, какой из листов обрабатывать.

Назначение строки sh1.Cells(j, 11).Value = Worksheets("data" & F.Tag).Cells(i, 2).Value
мне вообще непонятно.

Попробуйте использовать такой вариант:
if j>0 then sh1.Cells(j, 11).Value = Worksheets("data" & F.Tag).Cells(i, 2).Value
(sh1 - это лист ВСЕГО)
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выпадающий список ComboBox pu4koff Win Api 29 27.02.2014 17:23
Как в Combobox убрать список? Alexi Компоненты Delphi 10 04.01.2011 08:25
ComboBox как сделать чтобы список в нем формировался с другой страницы? sttafi Microsoft Office Excel 11 12.05.2009 17:45
Потестируйте программу (поиск похожих MP3 файлов) mutabor Софт 9 28.10.2008 14:01