Всем доброго дня! В очередной раз обращаюсь за помощью, уважаемые форумчане! Поискал на форуме и ничего похожего не нашёл. Есть желание сделать следующее: В зависимости от выбора значений 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, Задачка типичная, странно, что не нашли ничего:
Option Explicit Dim x
PrivateSub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData
x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value EndWith
'ВАРИАНТ 1 WithCreateObject("Scripting.Dictionary")
.CompareMode = 1 For i = 2ToUBound(x) IfNot .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty'Значение из БД Next i
Me.ComboBox1.List = .keys EndWith Call ReFillCombobox2 '!!!!!!!!!!!! EndSub
PrivateSub ReFillCombobox2() Dim i AsInteger Dim v AsVariant Dim txt AsString
txt = ComboBox1.Text With Worksheets(1)
v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4) EndWith
ComboBox2.Clear If (txt <> "") Then For i = 1ToUBound(v) If (v(i, 4) = txt) Then
ComboBox2.AddItem v(i, 1) EndIf Next i Else For i = 1ToUBound(v)
ComboBox2.AddItem v(i, 1) Next i EndIf EndSub
ILIA-PLC, Задачка типичная, странно, что не нашли ничего:
Option Explicit Dim x
PrivateSub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData
x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value EndWith
'ВАРИАНТ 1 WithCreateObject("Scripting.Dictionary")
.CompareMode = 1 For i = 2ToUBound(x) IfNot .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty'Значение из БД Next i
Me.ComboBox1.List = .keys EndWith Call ReFillCombobox2 '!!!!!!!!!!!! EndSub
PrivateSub ReFillCombobox2() Dim i AsInteger Dim v AsVariant Dim txt AsString
txt = ComboBox1.Text With Worksheets(1)
v = .Cells(2, 1).Resize(.Cells(.Rows.Count - 1, 1).End(xlUp).Row, 4) EndWith
ComboBox2.Clear If (txt <> "") Then For i = 1ToUBound(v) If (v(i, 4) = txt) Then
ComboBox2.AddItem v(i, 1) EndIf Next i Else For i = 1ToUBound(v)
ComboBox2.AddItem v(i, 1) Next i EndIf EndSub
parovoznik, Добрый день! У меня в оригинале есть лист типа базы данных. И там заданы диапазоны. В диапазоне, по которому идёт сравнение, необходимые мне данные заданы по-порядку. И они периодически дополняются и изменяются. Вот поэтому мне и хотелось привязать именно к этому листу. Спасибо!
parovoznik, Добрый день! У меня в оригинале есть лист типа базы данных. И там заданы диапазоны. В диапазоне, по которому идёт сравнение, необходимые мне данные заданы по-порядку. И они периодически дополняются и изменяются. Вот поэтому мне и хотелось привязать именно к этому листу. Спасибо!ILIA-PLC
Сообщение отредактировал ILIA-PLC - Четверг, 16.04.2020, 17:54
А дальше по выбранному значению ListIndex ComboBox1 присваивались значения другим ComboBox и TextBox (как я понимаю, по сути, по номеру строки) примерно так:
и так далее Сейчас эти значения присваиваются не правильно, так как ListIndex указывает на номер строки, а номер строки со значением в ComboBox1 не совпадают , как я понимаю (как чайник) Подскажите, пожалуйста, как мне присвоить в этом случае значения другим ComboBox и TextBox по выбранному значению ComboBox1?
Roman777, Есть вопрос. В старом файле у меня значение ComboBox1 определялось так:
А дальше по выбранному значению ListIndex ComboBox1 присваивались значения другим ComboBox и TextBox (как я понимаю, по сути, по номеру строки) примерно так:
и так далее Сейчас эти значения присваиваются не правильно, так как 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, В данном случае, самое простое, записать в отдельный массив соответствие позиции в комбобоксе - номеру строки в листе:
Option Explicit Dim x Dim indxs() AsInteger
PrivateSub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData
x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value EndWith
'ВАРИАНТ 1 WithCreateObject("Scripting.Dictionary")
.CompareMode = 1 For i = 2ToUBound(x) IfNot .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty'Значение из БД Next i
Me.ComboBox1.List = .keys EndWith Call ReFillCombobox2 '!!!!!!!!!!!! EndSub
PrivateSub ReFillCombobox2() Dim i AsInteger, k AsInteger Dim v AsVariant Dim txt AsString
ReDim indxs(0To0)
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) EndWith
ComboBox2.Clear If (txt <> "") Then For i = 1ToUBound(v) - 1 'If (v(i, 4) = txt)ТОЖЕ МЕНЯЕМ Then ЕСЛИ В СТОЛБЦЕ 4 = ТЕКСТ) If (v(i, 4) = txt) Then ReDim Preserve indxs(0To k) ' ComboBox2.AddItem v(i, 1) ВОТ ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ
ComboBox2.AddItem v(i, 1)
indxs(k) = i + 1
k = k + 1 EndIf Next i Else ReDim indxs(0To (UBound(v) - 2)) For i = 1ToUBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ ПОМЕНЯТЬ
ComboBox2.AddItem v(i, 1)
indxs(i - 1) = i + 1 Next i EndIf EndSub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- 'Сведения об объекте, контактные лица Dim n AsInteger
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 EndIf EndSub
ILIA-PLC, В данном случае, самое простое, записать в отдельный массив соответствие позиции в комбобоксе - номеру строки в листе:
Option Explicit Dim x Dim indxs() AsInteger
PrivateSub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData
x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value EndWith
'ВАРИАНТ 1 WithCreateObject("Scripting.Dictionary")
.CompareMode = 1 For i = 2ToUBound(x) IfNot .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty'Значение из БД Next i
Me.ComboBox1.List = .keys EndWith Call ReFillCombobox2 '!!!!!!!!!!!! EndSub
PrivateSub ReFillCombobox2() Dim i AsInteger, k AsInteger Dim v AsVariant Dim txt AsString
ReDim indxs(0To0)
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) EndWith
ComboBox2.Clear If (txt <> "") Then For i = 1ToUBound(v) - 1 'If (v(i, 4) = txt)ТОЖЕ МЕНЯЕМ Then ЕСЛИ В СТОЛБЦЕ 4 = ТЕКСТ) If (v(i, 4) = txt) Then ReDim Preserve indxs(0To k) ' ComboBox2.AddItem v(i, 1) ВОТ ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ
ComboBox2.AddItem v(i, 1)
indxs(k) = i + 1
k = k + 1 EndIf Next i Else ReDim indxs(0To (UBound(v) - 2)) For i = 1ToUBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ ПОМЕНЯТЬ
ComboBox2.AddItem v(i, 1)
indxs(i - 1) = i + 1 Next i EndIf EndSub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- 'Сведения об объекте, контактные лица Dim n AsInteger
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 EndIf EndSub
Roman777, Ещё раз добрый вечер! В оригинальной таблице данные смещены как по строкам (на 6 строк), так и по столбцам (на 29). Оригинал приложить не могу - много весит (там большая таблица на 800 столбцов), но примерно, как это выглядит, смодулировал в файле
Я понимаю, что необходимо в коде показать это смещение
ReDim indxs(0To0)
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) EndWith
ComboBox2.Clear If (txt <> "") Then 'For i = XZ To UBound(v) - 1 XZ - Строка, с которой ищем значения For i = 6ToUBound(v) - 1 'If (v(i, Х) = txt) ЗНАЧЕНИЯ В СТОЛБЦЕ Х ТОЖЕ МЕНЯЮ If (v(i, 29) = txt) Then ReDim Preserve indxs(0To k) ' ComboBox2.AddItem v(i, YY) YY - НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ МЕНЯЮ
ComboBox2.AddItem v(i, 4)
indxs(k) = i + 1
k = k + 1 EndIf Next i Else ReDim indxs(0To (UBound(v) - 2)) For i = 1ToUBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ МЕНЯЮ
ComboBox2.AddItem v(i, 4)
indxs(i - 1) = i + 1 Next i EndIf EndSub
Но выпадает ошибка... Пытался по-разному, но не получается. Подскажите, пожалуйста, что не так?
Roman777, Ещё раз добрый вечер! В оригинальной таблице данные смещены как по строкам (на 6 строк), так и по столбцам (на 29). Оригинал приложить не могу - много весит (там большая таблица на 800 столбцов), но примерно, как это выглядит, смодулировал в файле
Я понимаю, что необходимо в коде показать это смещение
ReDim indxs(0To0)
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) EndWith
ComboBox2.Clear If (txt <> "") Then 'For i = XZ To UBound(v) - 1 XZ - Строка, с которой ищем значения For i = 6ToUBound(v) - 1 'If (v(i, Х) = txt) ЗНАЧЕНИЯ В СТОЛБЦЕ Х ТОЖЕ МЕНЯЮ If (v(i, 29) = txt) Then ReDim Preserve indxs(0To k) ' ComboBox2.AddItem v(i, YY) YY - НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ МЕНЯЮ
ComboBox2.AddItem v(i, 4)
indxs(k) = i + 1
k = k + 1 EndIf Next i Else ReDim indxs(0To (UBound(v) - 2)) For i = 1ToUBound(v) - 1 ' ComboBox2.AddItem v(i, 1) ТУТ НОМЕР СТОЛБЦА ОТКУДА БЕРЁМ ОБЪЕКТ ТОЖЕ МЕНЯЮ
ComboBox2.AddItem v(i, 4)
indxs(i - 1) = i + 1 Next i EndIf EndSub
Но выпадает ошибка... Пытался по-разному, но не получается. Подскажите, пожалуйста, что не так?ILIA-PLC
ILIA-PLC, добрый день! Если вам в действительности хотелось бы разобраться, рекомендую вам, всё-таки, попробовать пошаговый режим отладки (F8), в котором можно наблюдать все значения переменных. Тут поменять то совсем чуть-чуть для вашего удобства:
Option Explicit Dim x Dim indxs() AsInteger
PrivateSub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData
x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value EndWith
'ВАРИАНТ 1 WithCreateObject("Scripting.Dictionary")
.CompareMode = 1 For i = 2ToUBound(x) 'Берём со строки 2!!! столбца А на листе БД IfNot .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty'Значение из БД Next i
Me.ComboBox1.List = .keys EndWith Call ReFillCombobox2 '!!!!!!!!!!!! EndSub
PrivateSub ReFillCombobox2() Dim i AsInteger, k AsInteger Dim v AsVariant Dim txt AsString Dim cnt AsInteger, maxIndx AsInteger Dim offstRow AsInteger, offstClmn AsInteger ReDim indxs(0To0)
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 строк EndWith
cnt = UBound(v) 'к-во строк в массиве v
maxIndx = cnt - 1
ComboBox2.Clear If (txt <> "") Then For i = 1To cnt If (v(i, 26) = txt) Then ReDim Preserve indxs(0To k)
ComboBox2.AddItem v(i, 1)
indxs(k) = i + offstRow - 1
k = k + 1 EndIf Next i Else ReDim Preserve indxs(0To maxIndx) For i = 1To cnt
ComboBox2.AddItem v(i, 1)
indxs(i - 1) = i + offstRow - 1 Next i EndIf EndSub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- Dim n AsInteger
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 EndIf EndSub
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается).
For i = 2ToUBound(x) 'Берём со строки 2!!! столбца А на листе БД
ILIA-PLC, добрый день! Если вам в действительности хотелось бы разобраться, рекомендую вам, всё-таки, попробовать пошаговый режим отладки (F8), в котором можно наблюдать все значения переменных. Тут поменять то совсем чуть-чуть для вашего удобства:
Option Explicit Dim x Dim indxs() AsInteger
PrivateSub UserForm_Initialize() 'Задаём диапазон значений для Комбобокса Dim i& 'Присваиваем i значение строки With Sheets("БД") If .FilterMode Then .ShowAllData
x = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value EndWith
'ВАРИАНТ 1 WithCreateObject("Scripting.Dictionary")
.CompareMode = 1 For i = 2ToUBound(x) 'Берём со строки 2!!! столбца А на листе БД IfNot .Exists(x(i, 1)) Then .Item(x(i, 1)) = Empty'Значение из БД Next i
Me.ComboBox1.List = .keys EndWith Call ReFillCombobox2 '!!!!!!!!!!!! EndSub
PrivateSub ReFillCombobox2() Dim i AsInteger, k AsInteger Dim v AsVariant Dim txt AsString Dim cnt AsInteger, maxIndx AsInteger Dim offstRow AsInteger, offstClmn AsInteger ReDim indxs(0To0)
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 строк EndWith
cnt = UBound(v) 'к-во строк в массиве v
maxIndx = cnt - 1
ComboBox2.Clear If (txt <> "") Then For i = 1To cnt If (v(i, 26) = txt) Then ReDim Preserve indxs(0To k)
ComboBox2.AddItem v(i, 1)
indxs(k) = i + offstRow - 1
k = k + 1 EndIf Next i Else ReDim Preserve indxs(0To maxIndx) For i = 1To cnt
ComboBox2.AddItem v(i, 1)
indxs(i - 1) = i + offstRow - 1 Next i EndIf EndSub
Sub ComboBox2_Change() 'Присвоить Textbox с листа "ХХХ" значение выбранного в ComboBox диапазона. Смещаем +y вниз, z вправо '------------------------------------------------С ЛИСТА "ОБЪЕКТ"-------------------------------------------------------------------- Dim n AsInteger
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 EndIf EndSub
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается).
For i = 2ToUBound(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