powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Связь трех и более combobox в Excel
25 сообщений из 32, страница 1 из 2
Связь трех и более combobox в Excel
    #35075185
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые профи,
перчитал кучу страниц интернета но так и не смог найти ответ.
Сделал userform где есть куча взаимосвязанных комбобоксов и текстбоксов. Перечитав Ваш форум нашел как связать два комбика . Попытался такимже способом привязать к двух третий, но ничего не вышло. Купил несколько книг по программированию в Excel на VBA но там такие вещи не рассматриваются. Буду очень признателен, если Вы поможете мне увязать кобики между собой и подскажете хорошую литературу для VBA в Excel.
В приложении Вы можете найти образец файла с формой.
Буду признателен за любую помощь.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35090777
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели перевелись на Руси богатыри? Неужели никто не знает как это сделать? Или подобная помощь за бесплатно не делается?
Подскажите хотябы толковую литературу по этому воросу.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35091829
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты как-то странно связываешь ІМХО. Сколько у тебя переменных комбобоксов. Пока что 1. Т.е. в остальных значения чётко связанны? Или в первом свободны, во втором - ограничены, а в третьем - ещё больше?

И вообще, что-то мне подсказывает, что сделать то, что надо на Access будет намного проще, и даже без програмирования. Так что копай туда.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35092403
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dd44,

Чтобы привязать к двух третий, или другими словами, в двумя третьего, можно хотябы использовать Dictionary. Здесь чуда никакого нет и старик Хотябыч здесь не требуется. Посадите на форму комбобокс и такимже способов два других. Далее скопируйте в форму код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Option Explicit

Private mobjCombo1 As New Scripting.Dictionary
Private mobjCombo2 As New Scripting.Dictionary
Private mobjCombo3 As New Scripting.Dictionary
Private mvarKey As Variant

Private Sub UserForm_Initialize()
    With mobjCombo1
        .Add  1 , "A"
        .Add  2 , "B"
        .Add  3 , "C"
    End With

    With mobjCombo2
        .Add "A1", "AA1"
        .Add "A2", "AA2"
        .Add "B1", "BB1"
        .Add "B2", "BB2"
        .Add "C1", "CC1"
        .Add "C2", "CC2"
    End With

    With mobjCombo3
        .Add "AA1", "AAA1"
        .Add "BB1", "BBB1"
        .Add "CC1", "CCC1"
        .Add "AA2", "AAA2"
        .Add "BB2", "BBB2"
        .Add "CC2", "CCC2"
    End With

    With ComboBox1
        For Each mvarKey In mobjCombo1.Keys
         ComboBox1.AddItem mobjCombo1.Item(mvarKey)
        Next mvarKey
    End With
    
End Sub

Private Sub ComboBox1_Change()
            With ComboBox2
                .Clear
                For Each mvarKey In mobjCombo2.Keys
                    If Left$(mvarKey,  1 ) = ComboBox1.Value Then
                        ComboBox2.AddItem mobjCombo2.Item(mvarKey)
                    End If
                Next mvarKey
            End With
End Sub


Private Sub ComboBox2_Change()
            With ComboBox3
                .Clear
                For Each mvarKey In mobjCombo3.Keys
                    If Left$(mvarKey,  2 ) = Left$(ComboBox2.Value,  2 ) Then
                        ComboBox3.AddItem mobjCombo3.Item(mvarKey)
                    End If
                Next mvarKey
            End With
End Sub

Вы увидите, что выбор в одном комбобоксе определяет список в последующем. Вот таким способом они и связаны.

Успехов

Не богатырь не на Руси

:0)
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35092445
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шыфл ...И вообще, что-то мне подсказывает, что сделать то, что надо на Access будет намного проще, и даже без програмирования. Так что копай туда.

Я не смотрел исходник, но вообще, если серьезно, то естественно желательнее SQL запросами, если данных много.

Мой же пример демонстрирует каскадную связку как таковую, отвечая таким образом на исходный вопрос.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35093829
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Шыфл и VladConn,

2 Шыфл,
Все просто: выбираешь плательщика, в соответствии с выбором формируется комбик получателя, в соответствии с выбором полчателя формируется комбик наименование платежа и т.д.

2 VladConn
С Dictionary пока не знаком, осваиваю Васик только месяц. Пошел разбираться.


Еще раз моя благодарность Вам.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35093891
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот и первый вопрос, куда вставлять этот код
Код: plaintext
1.
2.
3.
4.
5.
Option Explicit
Private mobjCombo1 As New Scripting.Dictionary
Private mobjCombo2 As New Scripting.Dictionary
Private mobjCombo3 As New Scripting.Dictionary
Private mvarKey As Variant
End Sub
Если вставить данный текст в "General Declarations", выдает ошибку "User-defined type not defined".
Если вставить в "Module(Code)", выдает ошибку "MobjCombo1 - Veriable not defined".

P.S. Мое почтение богатырям из Коннектикута :))
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35093984
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladConn,
Буду Вам обязан, еси Вы закомментируете Ваш код, чтобы мне было проще разбираться.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35100021
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый VladConn,
Почитал про Dictionary и расстроился, вот что пишут в хелпе: The key is used to retrieve an individual item and is usually a integer or a string, but can be anything except an array. Т.е. ключ не может быть массивом, каким же тогда образом это мне поможет.
Возможно я открыл "словарь" вверх ногами?
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35101502
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dd44,

Отвечаю по порядку. Для использования Dictionary подключите библиотеку Microsoft Scripting Runtime так, как обычно подключаются библиотеки.
Свой код я, помнится, безыскусно вставил в код формы, но это не догма. Что касается Key, то ваше сомнение исходит, видимо, из недостаточного понимания сути дела. Dictionary сам заменяет собой Array. Первый в каком то узком смысле как бы второй с прямым доступом (метод Exists, например). А Key, в свою очередь, сам может быть Dictiоnary, да хоть каким классом, т.е., вообще говоря, чем угодно.

Успехов.

vladconn
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35101995
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, конечно, не знаю что такое Scripting.Dictionary Может это круче. :)

Но если просто в лоб, по Ехселосвки, то тут 6 строчек кода, и 5 минут на заполнение. :)

З.Ы. Естесвенно, что с увеличением комбобоксов и вариантов, такой способ не пройдёт, но на 3 - 4 с по 3-4 варианта очень даже покатит.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35101999
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, не зааттачилось
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35102013
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Между прочим лист Ехселя - практически идеальная хэштаблица :)
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35102091
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ШыфлЯ, конечно, не знаю что такое Scripting.Dictionary Может это круче. :)

Но если просто в лоб, по Ехселосвки, то тут 6 строчек кода, и 5 минут на заполнение. :)

З.Ы. Естесвенно, что с увеличением комбобоксов и вариантов, такой способ не пройдёт, но на 3 - 4 с по 3-4 варианта очень даже покатит.


Шыфл, что вообще может быть круче Праги? Всегда мечтал там побывать.

Касательно примера - это голая демонстрация возможности как таковой каскадной связи комбо боксов. Можно придумать еще с дюжину альтернативных способов.

Успехов.

:0)
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35102094
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, почему 3 - 4? Если я заполнял вручную в примере, это не значит, что в жизни я бы так и поступил, наверно бы автоматизировал.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35102112
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnКстати, почему 3 - 4? Если я заполнял вручную в примере, это не значит, что в жизни я бы так и поступил, наверно бы автоматизировал.

Вот в том то и дело, что было бы из чего автоматизировать :) Потому как таки придётся куда-то заполнять вручную. И изначально для этого больше подходят БД.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35102186
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
So, what the point? Что есть другие методы и базы данных лучше Dictionary? OK. Тогда можно совершить следующий бросок к звездам - давайте все это напишем в Оракле. Или нет - давай делать XML. Или нет - в INI файле. Прочтите вопрос: как можно связать комбо боксы. Все. Вспышки сверхновых можно не изучать.

:0))
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35102340
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnSo, what the point?....давайте все это напишем в Оракле. Или нет - давай делать XML. Или нет - в INI файле. :0))
Очень суровы челябинские програмисты...
:)
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35103513
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые Шыфл,
То что Вы показали в примере я и так могу сделать, но это как-то некрасиво чтоли. Хочется сделать форму, которая програмно определяла бы соотношение кобобоксов по выборке, а не забивать в столбик под каждый вариант перечень соответствий, т.к. при увеличении комбиков количество столбцов с выборкой под них будет расти геометрически.

Уважаемый VladConn,
Не совсем понял, каким образом "ключ" может быть массивом, если в описании четко сказано, что чем угодно, кроме массива, может надо задавать ключ определенным образом?
Потом, при добавлении новой строки в первый комбик програмно не будет определяться новый "словарь", что не есть "гуд".
В приложенном мною примере (первое сообщение) я связал два комбика, которые будут работать не зависимо от добавления/удаления/изменения позиций. НО, это работае только на два комбика, третий и т.д. прикрутить не удается ((.
Задача состоит не только в том, чтобы просматривать имеющиеся записи, а чтобы работать с пополняющемся списком без дальнейшего вмешательства в код проги.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35103807
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dd44Уважаемые Шыфл,
То что Вы показали в примере я и так могу сделать, но это как-то некрасиво чтоли. Хочется сделать форму, которая програмно определяла бы соотношение кобобоксов по выборке, а не забивать в столбик под каждый вариант перечень соответствий, т.к. при увеличении комбиков количество столбцов с выборкой под них будет расти геометрически.

Задача состоит не только в том, чтобы просматривать имеющиеся записи, а чтобы работать с пополняющемся списком без дальнейшего вмешательства в код проги.

Уважаемый dd44 ,
Несмотря на все достижения прогресса, структуру связей необходимо где-то хранить. Именно в этом, а не во "взаимосвязывании комбобоксов" заключается суть проблемы, если вы заметили.

Эксцел - это не очень подходящий инструмент для хранения данных. Лучшее, что он может предложить, это именованные диапазоны, которые, с некоторой натяжкой, могут исполнять роль базы данных связей элементов списка. Можно также попробовать работать с автофильтром, но это уже не так тривиально.
Колличество этих связей будет расти геометрически независимо от выбранного способа реализации, просто как показательная функция колличества комбобоксов.

Построение механизма взаимного дополнения всех связанных полей - не тривиальная задача, часто требующая последовательного заполнения таблиц "сверху вниз". У меня была похожая задача, которую я решал несколькими способами (хранения логинов для различных отделений различных компаний). Но в любом случае - сколько переменных, столько степеней свободы. При наличии ключа и индексации (в словаре, или в БД) можно ограничится одной табличкой в 2 столбика для каждой степени свободы. Непосредственно методами Эксцеля механизмы поиска придётся реализовать вручную.
Я предложил именованные диапазоны. Никто не говорит, что их надо заполнять вручную. Можно реализовать алгоритм. Хранить данные для разных комбобоксов на разных листах, сделать иерархическую систему, и шаблон добавления на форме с циклом последовательного внесения и переопределения диапазонов. :) + таблица имён диапазонов.
В итоге мы имеем то, что принято называть реляционной БД, только самописную, на базе Эксцеля. :) Микрософт ещё в 90х годах реализовал всё это под торговой маркой Access.
Можно это чудо углублять и расширять, через систему гиперссылок на разные книги (которые тоже хранить определённым образом, а ссылки генерировать автоматически), но последнее время я занимаюсь тем, что переписываю эти чуда под Ассесс, потому как "чудо распухло и мешало ходить". И таких вот "чУдов" видел достаточно много, в том числе и на Excel 4.0
Так что выбирайте метод изходя из того, что вам на самом деле надо. Посмотрев на ваш пример я рискнул предположить, что это будет самописная эмуляция БД. ;) А оно надо?
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35104364
dd44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый Шыфл,
Я прекрасно понимаю, что Эксель не самая лучшая программа для достижения поставленной мною цели. Однако я не разбираюсь, к своему стыду, в Аксессе.
Кроме того, вопрос состоит в том, имеется ли возможность, программно реализовать поставленную задачу в Экселе, если ДА, то как это сделать.
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35105236
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dd44Уважаемый Шыфл,
Я прекрасно понимаю, что Эксель не самая лучшая программа для достижения поставленной мною цели. Однако я не разбираюсь, к своему стыду, в Аксессе.
Кроме того, вопрос состоит в том, имеется ли возможность, программно реализовать поставленную задачу в Экселе, если ДА, то как это сделать.
В Экселе это легче всего сделать используя ADO/DAO + BD
Если нет, то учитывая специфику, достаточно легко сделать иерархическую структуру именованных диапазонов и листов. Или даже просто листов. Или даже просто диапазонов.

Просто придётся вручную прописывать процедуры поиска элементов и добавления элементов. Циклами и ветвлениями. Что-то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function poisk(kogo As String) As Name
Dim i As Integer
For i =  1  To Application.ThisWorkbook.Names.Count
If Application.ThisWorkbook.Names.Item(i).Name = kogo Then
Set poisk = Application.ThisWorkbook.Names.Item(i)
Exit Function
End If
Next i
End Function
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35105376
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dd44 Уважаемый VladConn,
Не совсем понял, каким образом "ключ" может быть массивом, если в описании четко сказано, что чем угодно, кроме массива, ...

Я этого не утверждал, да и нужды в этом не было. Ключ не может быть массивом, но Item тоже может быть Dictionary (впрочем. как и Key). Чем это вас не устраивает?

*********************************************
Key и Item могут быть классами, а значит и словарями.
*********************************************

Мой пример демонстрирует возможность какскадной связки 3х комбо боксов даже без этой хитрости. Связка, это как раз то, что вы спрашивали. Существует еще много других способов и возможностей. Например, вложенные друг в друга словари

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Dim objD As New Dictionary
    Dim objDD As New Dictionary
    Dim objItem As New Dictionary
    
    objD.Add  1 , "A"
    objD.Add  2 , "B"
    objDD.Add  1 , objD
    Set objItem = objDD.Item( 1 )
    
    Debug.Print objItem.Item( 2 )

или

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    Dim objD As New Dictionary
    Dim objDD As New Dictionary
    Dim objKey As New Dictionary
    
    objD.Add  1 , "A"
    objD.Add  2 , "B"
    objDD.Add objD, "C"
    
    For Each objKey In objDD.Keys
        Debug.Print objDD.Item(objKey)
    Next objKey


Успехов
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35105429
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VladConn
Мне стало интересно, могут ли эти словари хранить данные?
Если нет, то задача наполнения комбобоксов из словарей разделяется на наполнения словарей из источника данных + наполнение комбобоксов из словарей.

Вопрос не в том, каким образом реализовать связь. Вопрос в том, где хранить данные под эти связи? Логично, что не в коде программы :/ Тогда, скорее всего (если уж не в БД) прямо в листах Экселя :)

З.Ы. Вот, в догонку, функция добавления нового значения и расширения вертикального диапазона на это значение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function redifine_range(n As Name, new_v As String) As Name
Dim n_n As String
n.RefersToRange.Worksheet.Activate
n.RefersToRange.End(xlDown).Offset( 1 ,  0 ).Value = new_v
Range(n.RefersToRange, n.RefersToRange.Offset( 1 ,  0 )).Select
n_n = n.Name
n.Delete
Set redifine_range = Application.ThisWorkbook.Names.Add(n_n, Selection)
End Function
...
Рейтинг: 0 / 0
Связь трех и более combobox в Excel
    #35105525
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы имеете ввиду, предназначены ли словари для хранения данных вне программы? Нет, не предназначены. Они предназначены для хранения данных в программе. Для хранения данных вне программы используют базы данных, XML, INI, TXT, LOG файлы и Property Bags, а также registry. Что касается разделения задач, это зависит от потребности. Бывает надо делать каскадную презентацию, основываясь на чтении малоструктурированного текстового файла, изъятия из его разных мест разного сорта информации (RegExp) и показа их на экране вo взаимосвязанных комбо боксax. Сделать это удобно через словари.

Успехов.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Связь трех и более combobox в Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]