Всем доброго дня! В очередной раз обращаюсь за помощью, уважаемые форумчане! Поискал на форуме и ничего похожего не нашёл. Есть желание сделать следующее: В зависимости от выбора значений combobox 1, которые берутся с листа "БД" в combobox 2 выводятся соответствующие данные для выбранногов combobox1 значения с таблицы на Листе2 Соответственно, если в первом боксе выбираем значение РП3, то во втором выводится списком ОБ-1, ОБ-2, ОБ-5, ОБ-8, ОБ-13. Если в комбобоксе1 выбирается пустое поле, то во втором боксе списком выводятся все значения с ОБ-1 по ОБ-15 Может я неправильно что-то объяснил, но, думаю, что суть для Вас будет понятнее на примере. Пример прицепил. Помогите, пожалуйста! Заранее спасибо!
Всем доброго дня! В очередной раз обращаюсь за помощью, уважаемые форумчане! Поискал на форуме и ничего похожего не нашёл. Есть желание сделать следующее: В зависимости от выбора значений combobox 1, которые берутся с листа "БД" в combobox 2 выводятся соответствующие данные для выбранногов combobox1 значения с таблицы на Листе2 Соответственно, если в первом боксе выбираем значение РП3, то во втором выводится списком ОБ-1, ОБ-2, ОБ-5, ОБ-8, ОБ-13. Если в комбобоксе1 выбирается пустое поле, то во втором боксе списком выводятся все значения с ОБ-1 по ОБ-15 Может я неправильно что-то объяснил, но, думаю, что суть для Вас будет понятнее на примере. Пример прицепил. Помогите, пожалуйста! Заранее спасибо!ILIA-PLC
ILIA-PLC, кросс:https://www.cyberforum.ru/vba/thread2619788.html У ВАс структура таблицы криво составлена. Зачем отдельный лист БД? Отбирайте уникальные данные с столба D и привязывайте их к комбикам. Это вариант я вам выкладывал в предыдущей Вашей теме.
ILIA-PLC, кросс:https://www.cyberforum.ru/vba/thread2619788.html У ВАс структура таблицы криво составлена. Зачем отдельный лист БД? Отбирайте уникальные данные с столба D и привязывайте их к комбикам. Это вариант я вам выкладывал в предыдущей Вашей теме.parovoznik
Сообщение отредактировал parovoznik - Четверг, 16.04.2020, 17:22
ILIA-PLC, Задачка типичная, странно, что не нашли ничего: [vba]
Код
Option Explicit Dim x
Private Sub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With
'ВАРИАНТ 1 With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) If Not .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty 'Значение из БД Next i Me.ComboBox1.List = .keys End With Call ReFillCombobox2 '!!!!!!!!!!!! End Sub
Private Sub ComboBox1_Change() Call ReFillCombobox2 End Sub
Private Sub ReFillCombobox2() Dim i As Integer Dim v As Variant Dim txt As String txt = ComboBox1.Text With Worksheets(1) v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4) End With ComboBox2.Clear If (txt <> "") Then For i = 1 To UBound(v) If (v(i, 4) = txt) Then ComboBox2.AddItem v(i, 1) End If Next i Else For i = 1 To UBound(v) ComboBox2.AddItem v(i, 1) Next i End If End Sub
[/vba]
ILIA-PLC, Задачка типичная, странно, что не нашли ничего: [vba]
Код
Option Explicit Dim x
Private Sub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With
'ВАРИАНТ 1 With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) If Not .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty 'Значение из БД Next i Me.ComboBox1.List = .keys End With Call ReFillCombobox2 '!!!!!!!!!!!! End Sub
Private Sub ComboBox1_Change() Call ReFillCombobox2 End Sub
Private Sub ReFillCombobox2() Dim i As Integer Dim v As Variant Dim txt As String txt = ComboBox1.Text With Worksheets(1) v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4) End With ComboBox2.Clear If (txt <> "") Then For i = 1 To UBound(v) If (v(i, 4) = txt) Then ComboBox2.AddItem v(i, 1) End If Next i Else For i = 1 To UBound(v) ComboBox2.AddItem v(i, 1) Next i End If End Sub
parovoznik, Добрый день! У меня в оригинале есть лист типа базы данных. И там заданы диапазоны. В диапазоне, по которому идёт сравнение, необходимые мне данные заданы по-порядку. И они периодически дополняются и изменяются. Вот поэтому мне и хотелось привязать именно к этому листу. Спасибо!
parovoznik, Добрый день! У меня в оригинале есть лист типа базы данных. И там заданы диапазоны. В диапазоне, по которому идёт сравнение, необходимые мне данные заданы по-порядку. И они периодически дополняются и изменяются. Вот поэтому мне и хотелось привязать именно к этому листу. Спасибо!ILIA-PLC
Сообщение отредактировал ILIA-PLC - Четверг, 16.04.2020, 17:54
А дальше по выбранному значению ListIndex ComboBox1 присваивались значения другим ComboBox и TextBox (как я понимаю, по сути, по номеру строки) примерно так: [vba]
и так далее Сейчас эти значения присваиваются не правильно, так как ListIndex указывает на номер строки, а номер строки со значением в ComboBox1 не совпадают , как я понимаю (как чайник) Подскажите, пожалуйста, как мне присвоить в этом случае значения другим ComboBox и TextBox по выбранному значению ComboBox1?
Roman777, Есть вопрос. В старом файле у меня значение ComboBox1 определялось так:
А дальше по выбранному значению ListIndex ComboBox1 присваивались значения другим ComboBox и TextBox (как я понимаю, по сути, по номеру строки) примерно так: [vba]
и так далее Сейчас эти значения присваиваются не правильно, так как ListIndex указывает на номер строки, а номер строки со значением в ComboBox1 не совпадают , как я понимаю (как чайник) Подскажите, пожалуйста, как мне присвоить в этом случае значения другим ComboBox и TextBox по выбранному значению ComboBox1?ILIA-PLC
Сообщение отредактировал ILIA-PLC - Пятница, 17.04.2020, 09:58
ILIA-PLC, вашего файла я не вижу. Но предполагаю, что где-то ошибка с индексом получается. Самый лучший способ разобраться в этом: поставить брейкпоинт (красную точку) и попробовать пошагово (нажимая F8) пройтись по программе. Это позволит увидеть, чему будут равны ваши переменные на том или ином шаге исполнения программы. Возможно, вы не учитываете, что в процессе заполнения второго комбобокса, индекс перестанет как-то соответствовать номеру строки...
ILIA-PLC, вашего файла я не вижу. Но предполагаю, что где-то ошибка с индексом получается. Самый лучший способ разобраться в этом: поставить брейкпоинт (красную точку) и попробовать пошагово (нажимая F8) пройтись по программе. Это позволит увидеть, чему будут равны ваши переменные на том или ином шаге исполнения программы. Возможно, вы не учитываете, что в процессе заполнения второго комбобокса, индекс перестанет как-то соответствовать номеру строки...Roman777
Roman777, Добрый день! Файлик прикрепил. Понимаю, что ориентируюсь по-сути по номеру строки в комбобоксе. Как объяснить программе, что необходимо по уникальному значению ориентироваться? Заранее спасибо!
Roman777, Добрый день! Файлик прикрепил. Понимаю, что ориентируюсь по-сути по номеру строки в комбобоксе. Как объяснить программе, что необходимо по уникальному значению ориентироваться? Заранее спасибо!ILIA-PLC
ILIA-PLC, В данном случае, самое простое, записать в отдельный массив соответствие позиции в комбобоксе - номеру строки в листе: [vba]
Код
Option Explicit Dim x Dim indxs() As Integer
Private Sub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With
'ВАРИАНТ 1 With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) If Not .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty 'Значение из БД Next i Me.ComboBox1.List = .keys End With Call ReFillCombobox2 '!!!!!!!!!!!! End Sub
Private Sub ComboBox1_Change() Call ReFillCombobox2 End Sub
Private Sub ReFillCombobox2() Dim i As Integer, k As Integer Dim v As Variant Dim txt As String
ReDim indxs(0 To 0) txt = ComboBox1.Text With Sheets("ОБЪЕКТЫ") 'С листа "ОБЪЕКТЫ" 'v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4 ИЩЕМ ЗНАЧЕНИЯ В СТОЛБЦЕ 4) v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4) End With ComboBox2.Clear If (txt <> "") Then For i = 1 To UBound(v) - 1 'If (v(i, 4) = txt)ТОЖЕ МЕНЯЕМ Then ЕСЛИ В СТОЛБЦЕ 4 = ТЕКСТ) If (v(i, 4) = txt) Then ReDim Preserve indxs(0 To k) ' ComboBox2.AddItem v(i, 1) ВОТ ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ComboBox2.AddItem v(i, 1) indxs(k) = i + 1 k = k + 1 End If Next i Else ReDim indxs(0 To (UBound(v) - 2)) For i = 1 To UBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ ПОМЕНЯТЬ ComboBox2.AddItem v(i, 1) indxs(i - 1) = i + 1 Next i End If End Sub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- 'Сведения об объекте, контактные лица Dim n As Integer n = Me.ComboBox2.ListIndex If (n > -1) Then Me.TextBox1 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 2) 'Данные 1 Me.TextBox2 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 3) 'Данные 2 Me.TextBox3 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 4) 'Значение из БД Me.TextBox4 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 5) 'Данные 3 Me.TextBox5 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 6) 'Данные 4 Me.TextBox6 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 7) 'Данные 5 End If End Sub
[/vba]
ILIA-PLC, В данном случае, самое простое, записать в отдельный массив соответствие позиции в комбобоксе - номеру строки в листе: [vba]
Код
Option Explicit Dim x Dim indxs() As Integer
Private Sub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With
'ВАРИАНТ 1 With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) If Not .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty 'Значение из БД Next i Me.ComboBox1.List = .keys End With Call ReFillCombobox2 '!!!!!!!!!!!! End Sub
Private Sub ComboBox1_Change() Call ReFillCombobox2 End Sub
Private Sub ReFillCombobox2() Dim i As Integer, k As Integer Dim v As Variant Dim txt As String
ReDim indxs(0 To 0) txt = ComboBox1.Text With Sheets("ОБЪЕКТЫ") 'С листа "ОБЪЕКТЫ" 'v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4 ИЩЕМ ЗНАЧЕНИЯ В СТОЛБЦЕ 4) v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4) End With ComboBox2.Clear If (txt <> "") Then For i = 1 To UBound(v) - 1 'If (v(i, 4) = txt)ТОЖЕ МЕНЯЕМ Then ЕСЛИ В СТОЛБЦЕ 4 = ТЕКСТ) If (v(i, 4) = txt) Then ReDim Preserve indxs(0 To k) ' ComboBox2.AddItem v(i, 1) ВОТ ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ComboBox2.AddItem v(i, 1) indxs(k) = i + 1 k = k + 1 End If Next i Else ReDim indxs(0 To (UBound(v) - 2)) For i = 1 To UBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ ПОМЕНЯТЬ ComboBox2.AddItem v(i, 1) indxs(i - 1) = i + 1 Next i End If End Sub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- 'Сведения об объекте, контактные лица Dim n As Integer n = Me.ComboBox2.ListIndex If (n > -1) Then Me.TextBox1 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 2) 'Данные 1 Me.TextBox2 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 3) 'Данные 2 Me.TextBox3 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 4) 'Значение из БД Me.TextBox4 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 5) 'Данные 3 Me.TextBox5 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 6) 'Данные 4 Me.TextBox6 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 7) 'Данные 5 End If End Sub
Roman777, Ещё раз добрый вечер! В оригинальной таблице данные смещены как по строкам (на 6 строк), так и по столбцам (на 29). Оригинал приложить не могу - много весит (там большая таблица на 800 столбцов), но примерно, как это выглядит, смодулировал в файле
Я понимаю, что необходимо в коде показать это смещение [vba]
Код
ReDim indxs(0 To 0) txt = ComboBox1.Text With Sheets("ОБЪЕКТЫ") 'С листа "ОБЪЕКТЫ" 'v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, Х) ИЩЕМ ЗНАЧЕНИЯ В СТОЛБЦЕ Х v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 29) End With ComboBox2.Clear If (txt <> "") Then 'For i = XZ To UBound(v) - 1 XZ - Строка, с которой ищем значения For i = 6 To UBound(v) - 1 'If (v(i, Х) = txt) ЗНАЧЕНИЯ В СТОЛБЦЕ Х ТОЖЕ МЕНЯЮ If (v(i, 29) = txt) Then ReDim Preserve indxs(0 To k) ' ComboBox2.AddItem v(i, YY) YY - НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ МЕНЯЮ ComboBox2.AddItem v(i, 4) indxs(k) = i + 1 k = k + 1 End If Next i Else ReDim indxs(0 To (UBound(v) - 2)) For i = 1 To UBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ МЕНЯЮ ComboBox2.AddItem v(i, 4) indxs(i - 1) = i + 1 Next i End If End Sub
[/vba] Но выпадает ошибка... Пытался по-разному, но не получается. Подскажите, пожалуйста, что не так?
Roman777, Ещё раз добрый вечер! В оригинальной таблице данные смещены как по строкам (на 6 строк), так и по столбцам (на 29). Оригинал приложить не могу - много весит (там большая таблица на 800 столбцов), но примерно, как это выглядит, смодулировал в файле
Я понимаю, что необходимо в коде показать это смещение [vba]
Код
ReDim indxs(0 To 0) txt = ComboBox1.Text With Sheets("ОБЪЕКТЫ") 'С листа "ОБЪЕКТЫ" 'v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, Х) ИЩЕМ ЗНАЧЕНИЯ В СТОЛБЦЕ Х v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 29) End With ComboBox2.Clear If (txt <> "") Then 'For i = XZ To UBound(v) - 1 XZ - Строка, с которой ищем значения For i = 6 To UBound(v) - 1 'If (v(i, Х) = txt) ЗНАЧЕНИЯ В СТОЛБЦЕ Х ТОЖЕ МЕНЯЮ If (v(i, 29) = txt) Then ReDim Preserve indxs(0 To k) ' ComboBox2.AddItem v(i, YY) YY - НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ МЕНЯЮ ComboBox2.AddItem v(i, 4) indxs(k) = i + 1 k = k + 1 End If Next i Else ReDim indxs(0 To (UBound(v) - 2)) For i = 1 To UBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ МЕНЯЮ ComboBox2.AddItem v(i, 4) indxs(i - 1) = i + 1 Next i End If End Sub
[/vba] Но выпадает ошибка... Пытался по-разному, но не получается. Подскажите, пожалуйста, что не так?ILIA-PLC
ILIA-PLC, добрый день! Если вам в действительности хотелось бы разобраться, рекомендую вам, всё-таки, попробовать пошаговый режим отладки (F8), в котором можно наблюдать все значения переменных. Тут поменять то совсем чуть-чуть для вашего удобства: [vba]
Код
Option Explicit Dim x Dim indxs() As Integer
Private Sub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With
'ВАРИАНТ 1 With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) 'Берём со строки 2!!! столбца А на листе БД If Not .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty 'Значение из БД Next i Me.ComboBox1.List = .keys End With Call ReFillCombobox2 '!!!!!!!!!!!! End Sub
Private Sub ComboBox1_Change() Call ReFillCombobox2 End Sub
Private Sub ReFillCombobox2() Dim i As Integer, k As Integer Dim v As Variant Dim txt As String Dim cnt As Integer, maxIndx As Integer Dim offstRow As Integer, offstClmn As Integer ReDim indxs(0 To 0) txt = ComboBox1.Text offstRow = 7 'интересуемый диапазон начинается с 7й строки offstClmn = 4 'интересуемый диапазон начинается с 4-го столбца With Sheets("ОБЪЕКТЫ") 'С листа "ОБЪЕКТЫ" 'v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, Х) ИЩЕМ ЗНАЧЕНИЯ В СТОЛБЦЕ Х v = .Cells(offstRow, offstClmn).Resize(.Cells(.Rows.Count, 4).End(xlUp).Row - offstRow + 1, 29) 'интересуемый диапазон начинается с 7й строки 4-го столбца, включает 29 столбцов и n строк End With cnt = UBound(v) 'к-во строк в массиве v maxIndx = cnt - 1
ComboBox2.Clear If (txt <> "") Then For i = 1 To cnt If (v(i, 26) = txt) Then ReDim Preserve indxs(0 To k) ComboBox2.AddItem v(i, 1) indxs(k) = i + offstRow - 1 k = k + 1 End If Next i Else ReDim Preserve indxs(0 To maxIndx) For i = 1 To cnt ComboBox2.AddItem v(i, 1) indxs(i - 1) = i + offstRow - 1 Next i End If End Sub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- Dim n As Integer n = Me.ComboBox2.ListIndex If (n > -1) Then Me.TextBox1 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 2) 'Данные 1 Me.TextBox2 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 3) 'Данные 2 Me.TextBox3 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 4) 'Значение из БД Me.TextBox4 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 5) 'Данные 3 Me.TextBox5 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 6) 'Данные 4 Me.TextBox6 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 7) 'Данные 5 End If End Sub
[/vba]
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается). [vba]
Код
For i = 2 To UBound(x) 'Берём со строки 2!!! столбца А на листе БД
[/vba]
ILIA-PLC, добрый день! Если вам в действительности хотелось бы разобраться, рекомендую вам, всё-таки, попробовать пошаговый режим отладки (F8), в котором можно наблюдать все значения переменных. Тут поменять то совсем чуть-чуть для вашего удобства: [vba]
Код
Option Explicit Dim x Dim indxs() As Integer
Private Sub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With
'ВАРИАНТ 1 With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) 'Берём со строки 2!!! столбца А на листе БД If Not .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty 'Значение из БД Next i Me.ComboBox1.List = .keys End With Call ReFillCombobox2 '!!!!!!!!!!!! End Sub
Private Sub ComboBox1_Change() Call ReFillCombobox2 End Sub
Private Sub ReFillCombobox2() Dim i As Integer, k As Integer Dim v As Variant Dim txt As String Dim cnt As Integer, maxIndx As Integer Dim offstRow As Integer, offstClmn As Integer ReDim indxs(0 To 0) txt = ComboBox1.Text offstRow = 7 'интересуемый диапазон начинается с 7й строки offstClmn = 4 'интересуемый диапазон начинается с 4-го столбца With Sheets("ОБЪЕКТЫ") 'С листа "ОБЪЕКТЫ" 'v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, Х) ИЩЕМ ЗНАЧЕНИЯ В СТОЛБЦЕ Х v = .Cells(offstRow, offstClmn).Resize(.Cells(.Rows.Count, 4).End(xlUp).Row - offstRow + 1, 29) 'интересуемый диапазон начинается с 7й строки 4-го столбца, включает 29 столбцов и n строк End With cnt = UBound(v) 'к-во строк в массиве v maxIndx = cnt - 1
ComboBox2.Clear If (txt <> "") Then For i = 1 To cnt If (v(i, 26) = txt) Then ReDim Preserve indxs(0 To k) ComboBox2.AddItem v(i, 1) indxs(k) = i + offstRow - 1 k = k + 1 End If Next i Else ReDim Preserve indxs(0 To maxIndx) For i = 1 To cnt ComboBox2.AddItem v(i, 1) indxs(i - 1) = i + offstRow - 1 Next i End If End Sub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- Dim n As Integer n = Me.ComboBox2.ListIndex If (n > -1) Then Me.TextBox1 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 2) 'Данные 1 Me.TextBox2 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 3) 'Данные 2 Me.TextBox3 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 4) 'Значение из БД Me.TextBox4 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 5) 'Данные 3 Me.TextBox5 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 6) 'Данные 4 Me.TextBox6 = Sheets("ОБЪЕКТЫ").Cells(indxs(n), 7) 'Данные 5 End If End Sub
[/vba]
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается). [vba]
Код
For i = 2 To UBound(x) 'Берём со строки 2!!! столбца А на листе БД
Roman777, Roman777, Спасибо большое! Буду пробовать перекладывать на мой файл.
Цитата
Тут поменять то совсем чуть-чуть для вашего удобства:
Да, я совсем мало что соображаю в VBA. По-сути этот файл - это мой первый "проект")))) Дорогу осилит идущий. Поэтому, надеюсь, что скоро буду более-менее разбираться в написании макросов...
Цитата
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается).
А вот как раз для этого и заполняю со второй строчки. Смысл следующий. При пустом значении Combobox1 в Combobox2 появляются все значения столбца "Данные ОБ" и в том случае, когда это необходимо, выбираю пустое значение и просматриваю всё, что есть в "Данные ОБ". Это подразумевалось изначально сделать для удобства. Ещё раз большое спасибо!
Roman777, Roman777, Спасибо большое! Буду пробовать перекладывать на мой файл.
Цитата
Тут поменять то совсем чуть-чуть для вашего удобства:
Да, я совсем мало что соображаю в VBA. По-сути этот файл - это мой первый "проект")))) Дорогу осилит идущий. Поэтому, надеюсь, что скоро буду более-менее разбираться в написании макросов...
Цитата
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается).
А вот как раз для этого и заполняю со второй строчки. Смысл следующий. При пустом значении Combobox1 в Combobox2 появляются все значения столбца "Данные ОБ" и в том случае, когда это необходимо, выбираю пустое значение и просматриваю всё, что есть в "Данные ОБ". Это подразумевалось изначально сделать для удобства. Ещё раз большое спасибо!ILIA-PLC
Сообщение отредактировал ILIA-PLC - Суббота, 18.04.2020, 13:40