Есть два комбобокса, заполненные из таблицы с сервера. Выглядят так:
Код
'Соединение с базой и получение данных в Combobx-ы'
cn.Open
sSQL = "Select distinct id1 From Itog Where id1 IS NOT NULL Order by 1"
Set rs = cn.Execute(sSQL)
If Not cn.State = 1 Then Exit Sub
a = rs.GetRows
Me.ComboBox1.List = Application.Index(a, 1, 0)
rs.Close:
cn.Close
'-------------------
cn.Open
sSQL = "Select distinct id2 FROM Itog ORDER BY 1"
Set rs = cn.Execute(sSQL)
If Not cn.State = 1 Then Exit Sub
a = rs.GetRows
Me.ComboBox2.List = Application.Index(a, 1, 0)
rs.Close:
cn.Close
Как организовать связь между комбобоксами? Что бы при выборе данных в комбобоксе подтягивались данные из другого комбобокса, если они есть?
Джек Восмеркин написал: Что бы при выборе данных в комбобоксе подтягивались данные из другого комбобокса,
Подтягивались куда? Задание неясно. если нужно во втором боксе получить список на основании первого, то что то типа sSQL = "Select distinct id2 FROM Itog WHERE id1 =" & Me.ComboBox1.Value & "ORDER BY 1"
1. Мне кажется, что у Вас в каждый комбобокс записывается только 1 значение из выборки, а не весь результат запроса, но я могу ошибаться. 2. Из Вашего кода совершенно не видно какая связь между ID1 и ID2. 3. На каждый комбобокс нужно повесить повесить событие "on change", по срабатывании которого обновлять список значений в другом комбобоксе. 4. ИМХО не очень хорошая идея постоянно запрашивать данные для комбо боксов туда-сюда, так что хорошо бы их при запуске формы сохранить их в какой-нить массив, а потом при необходимости обновления обращаться уже непосредственно к нему.
1. Да не, в комбобокс идет весь результат запроса - из которого можно выбирать любое значение. 2.Связи действительно не видно...)))... Ее надо сделать. ID1, ID2 - это просто поля одной таблицы и никаких условий там нет. Если в ComboBox1 выбрать 1элемент "Иванов", то в ComboBox2 должны отобразиться соответствующие 4 "Иван". Вот как то вот так...))) 3. Мне кажется, не стоит. Хотя возможно и ошибаюсь. 4. Данные для комбобоксов запрашиваются с сервера SQL - так что каждый раз при инициализации формы приходится запрашивать заново, во избежание.
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
Ну не знаю я как Вы без onChange такую задачу решите... В теории, в комбоБокс можно в одной строчке несколько значений хранить. Если у Вас связь списков один к одному, то можно в каждый комбо бокс сразу пару значений загнать, но зачем тогда их 2 нужно?!....
Код
Option Explicit
Dim bFlag
Private Sub ComboBox1_Change()
If bFlag Then
bFlag = False
UserForm1.ComboBox2.Value = UserForm1.ComboBox1.List(UserForm1.ComboBox1.ListIndex, 1)
bFlag = True
End If
End Sub
Private Sub ComboBox2_Change()
If bFlag Then
bFlag = False
UserForm1.ComboBox1.Value = UserForm1.ComboBox2.List(UserForm1.ComboBox2.ListIndex, 1)
bFlag = True
End If
End Sub
Private Sub UserForm_Activate()
Dim arrX(3, 2) As String
Dim i As Long
bFlag = True
arrX(1, 1) = "Иванов"
arrX(1, 2) = "Иван"
arrX(2, 1) = "Петров"
arrX(2, 2) = "Пётр"
arrX(3, 1) = "Сидоров"
arrX(3, 2) = "Яша"
UserForm1.ComboBox1.ColumnCount = 2 'Вообще не нужная строчка, просто показать, что в комбоБоксе можно оба хначения показывать
For i = 1 To 3
UserForm1.ComboBox1.AddItem arrX(i, 1)
UserForm1.ComboBox1.List(i - 1, 1) = arrX(i, 2)
UserForm1.ComboBox2.AddItem arrX(i, 2)
UserForm1.ComboBox2.List(i - 1, 1) = arrX(i, 1)
Next i
bFlag = True
End Sub