Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Значение Combobox2 в зависимости от значения Combobox 1 - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Значение Combobox2 в зависимости от значения Combobox 1 (Макросы/Sub)
Значение Combobox2 в зависимости от значения Combobox 1
ILIA-PLC Дата: Четверг, 16.04.2020, 13:35 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
Всем доброго дня!
В очередной раз обращаюсь за помощью, уважаемые форумчане!
Поискал на форуме и ничего похожего не нашёл. Есть желание сделать следующее:
В зависимости от выбора значений combobox 1, которые берутся с листа "БД" в combobox 2 выводятся соответствующие данные для выбранногов combobox1 значения с таблицы на Листе2
Соответственно, если в первом боксе выбираем значение РП3, то во втором выводится списком ОБ-1, ОБ-2, ОБ-5, ОБ-8, ОБ-13.
Если в комбобоксе1 выбирается пустое поле, то во втором боксе списком выводятся все значения с ОБ-1 по ОБ-15
Может я неправильно что-то объяснил, но, думаю, что суть для Вас будет понятнее на примере. Пример прицепил.
Помогите, пожалуйста! Заранее спасибо!
К сообщению приложен файл: _2Combobox.rar(21.8 Kb)
 
Ответить
СообщениеВсем доброго дня!
В очередной раз обращаюсь за помощью, уважаемые форумчане!
Поискал на форуме и ничего похожего не нашёл. Есть желание сделать следующее:
В зависимости от выбора значений combobox 1, которые берутся с листа "БД" в combobox 2 выводятся соответствующие данные для выбранногов combobox1 значения с таблицы на Листе2
Соответственно, если в первом боксе выбираем значение РП3, то во втором выводится списком ОБ-1, ОБ-2, ОБ-5, ОБ-8, ОБ-13.
Если в комбобоксе1 выбирается пустое поле, то во втором боксе списком выводятся все значения с ОБ-1 по ОБ-15
Может я неправильно что-то объяснил, но, думаю, что суть для Вас будет понятнее на примере. Пример прицепил.
Помогите, пожалуйста! Заранее спасибо!

Автор - ILIA-PLC
Дата добавления - 16.04.2020 в 13:35
parovoznik Дата: Четверг, 16.04.2020, 17:11 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 20 ±
Замечаний: 0% ±

Excel 2007
ILIA-PLC, кросс:https://www.cyberforum.ru/vba/thread2619788.html
У ВАс структура таблицы криво составлена. Зачем отдельный лист БД? Отбирайте уникальные данные с столба D и привязывайте их к комбикам. :o Это вариант я вам выкладывал в предыдущей Вашей теме.


Сообщение отредактировал parovoznik - Четверг, 16.04.2020, 17:22
 
Ответить
СообщениеILIA-PLC, кросс:https://www.cyberforum.ru/vba/thread2619788.html
У ВАс структура таблицы криво составлена. Зачем отдельный лист БД? Отбирайте уникальные данные с столба D и привязывайте их к комбикам. :o Это вариант я вам выкладывал в предыдущей Вашей теме.

Автор - parovoznik
Дата добавления - 16.04.2020 в 17:11
Roman777 Дата: Четверг, 16.04.2020, 17:12 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
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]


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Четверг, 16.04.2020, 17:12
 
Ответить
Сообщение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]

Автор - Roman777
Дата добавления - 16.04.2020 в 17:12
ILIA-PLC Дата: Четверг, 16.04.2020, 17:29 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
Roman777, Спасибо огромное! Заработало! Сейчас переложу на свой файл!
 
Ответить
СообщениеRoman777, Спасибо огромное! Заработало! Сейчас переложу на свой файл!

Автор - ILIA-PLC
Дата добавления - 16.04.2020 в 17:29
ILIA-PLC Дата: Четверг, 16.04.2020, 17:53 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
parovoznik, Добрый день! У меня в оригинале есть лист типа базы данных. И там заданы диапазоны. В диапазоне, по которому идёт сравнение, необходимые мне данные заданы по-порядку. И они периодически дополняются и изменяются. Вот поэтому мне и хотелось привязать именно к этому листу.
Спасибо!


Сообщение отредактировал ILIA-PLC - Четверг, 16.04.2020, 17:54
 
Ответить
Сообщениеparovoznik, Добрый день! У меня в оригинале есть лист типа базы данных. И там заданы диапазоны. В диапазоне, по которому идёт сравнение, необходимые мне данные заданы по-порядку. И они периодически дополняются и изменяются. Вот поэтому мне и хотелось привязать именно к этому листу.
Спасибо!

Автор - ILIA-PLC
Дата добавления - 16.04.2020 в 17:53
ILIA-PLC Дата: Четверг, 16.04.2020, 20:15 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
Roman777, Есть вопрос. В старом файле у меня значение ComboBox1 определялось так:

[vba]
Код
ComboBox1.List = .Range("D7", .Cells(Rows.Count, "D").End(xlUp)).Value
[/vba]

А дальше по выбранному значению ListIndex ComboBox1 присваивались значения другим ComboBox и TextBox (как я понимаю, по сути, по номеру строки)
примерно так:
[vba]
Код
TextBoxDateCorrect = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 5)
ComboBox_FormUL = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 6)
Me.TextBox2 = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 7)
Me.TextBox3 = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 8)
[/vba]

и так далее
Сейчас эти значения присваиваются не правильно, так как ListIndex указывает на номер строки, а номер строки со значением в ComboBox1 не совпадают , как я понимаю (как чайник)
Подскажите, пожалуйста, как мне присвоить в этом случае значения другим ComboBox и TextBox по выбранному значению ComboBox1?


Сообщение отредактировал ILIA-PLC - Пятница, 17.04.2020, 09:58
 
Ответить
СообщениеRoman777, Есть вопрос. В старом файле у меня значение ComboBox1 определялось так:

[vba]
Код
ComboBox1.List = .Range("D7", .Cells(Rows.Count, "D").End(xlUp)).Value
[/vba]

А дальше по выбранному значению ListIndex ComboBox1 присваивались значения другим ComboBox и TextBox (как я понимаю, по сути, по номеру строки)
примерно так:
[vba]
Код
TextBoxDateCorrect = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 5)
ComboBox_FormUL = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 6)
Me.TextBox2 = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 7)
Me.TextBox3 = Sheets("Лист1").Cells(Me.ComboBox1.ListIndex + 7, 8)
[/vba]

и так далее
Сейчас эти значения присваиваются не правильно, так как ListIndex указывает на номер строки, а номер строки со значением в ComboBox1 не совпадают , как я понимаю (как чайник)
Подскажите, пожалуйста, как мне присвоить в этом случае значения другим ComboBox и TextBox по выбранному значению ComboBox1?

Автор - ILIA-PLC
Дата добавления - 16.04.2020 в 20:15
Roman777 Дата: Пятница, 17.04.2020, 11:44 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ILIA-PLC, вашего файла я не вижу. Но предполагаю, что где-то ошибка с индексом получается. Самый лучший способ разобраться в этом: поставить брейкпоинт (красную точку) и попробовать пошагово (нажимая F8) пройтись по программе. Это позволит увидеть, чему будут равны ваши переменные на том или ином шаге исполнения программы.
Возможно, вы не учитываете, что в процессе заполнения второго комбобокса, индекс перестанет как-то соответствовать номеру строки...


Много чего не знаю!!!!
 
Ответить
СообщениеILIA-PLC, вашего файла я не вижу. Но предполагаю, что где-то ошибка с индексом получается. Самый лучший способ разобраться в этом: поставить брейкпоинт (красную точку) и попробовать пошагово (нажимая F8) пройтись по программе. Это позволит увидеть, чему будут равны ваши переменные на том или ином шаге исполнения программы.
Возможно, вы не учитываете, что в процессе заполнения второго комбобокса, индекс перестанет как-то соответствовать номеру строки...

Автор - Roman777
Дата добавления - 17.04.2020 в 11:44
ILIA-PLC Дата: Пятница, 17.04.2020, 17:14 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
Roman777, Добрый день! Файлик прикрепил. Понимаю, что ориентируюсь по-сути по номеру строки в комбобоксе. Как объяснить программе, что необходимо по уникальному значению ориентироваться?
Заранее спасибо!
К сообщению приложен файл: 1-___2-_.rar(24.3 Kb)
 
Ответить
СообщениеRoman777, Добрый день! Файлик прикрепил. Понимаю, что ориентируюсь по-сути по номеру строки в комбобоксе. Как объяснить программе, что необходимо по уникальному значению ориентироваться?
Заранее спасибо!

Автор - ILIA-PLC
Дата добавления - 17.04.2020 в 17:14
Roman777 Дата: Пятница, 17.04.2020, 18:44 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
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]


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Пятница, 17.04.2020, 18:50
 
Ответить
Сообщение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]

Автор - Roman777
Дата добавления - 17.04.2020 в 18:44
ILIA-PLC Дата: Пятница, 17.04.2020, 19:53 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
Roman777, большое человеческое спасибо! Попробую поразбираться как это работает. Если вопросы будут, если Вы не против, я Вас потревожу...
 
Ответить
СообщениеRoman777, большое человеческое спасибо! Попробую поразбираться как это работает. Если вопросы будут, если Вы не против, я Вас потревожу...

Автор - ILIA-PLC
Дата добавления - 17.04.2020 в 19:53
ILIA-PLC Дата: Пятница, 17.04.2020, 22:39 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
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]
Но выпадает ошибка... Пытался по-разному, но не получается.
Подскажите, пожалуйста, что не так?
К сообщению приложен файл: 3-_.rar(29.3 Kb)


Сообщение отредактировал ILIA-PLC - Пятница, 17.04.2020, 22:52
 
Ответить
Сообщение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
Дата добавления - 17.04.2020 в 22:39
Roman777 Дата: Суббота, 18.04.2020, 11:34 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
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!!! столбца А на листе БД
[/vba]

Автор - Roman777
Дата добавления - 18.04.2020 в 11:34
ILIA-PLC Дата: Суббота, 18.04.2020, 13:38 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2019
Roman777, Roman777, Спасибо большое! Буду пробовать перекладывать на мой файл.
Цитата
Тут поменять то совсем чуть-чуть для вашего удобства:
Да, я совсем мало что соображаю в VBA. По-сути этот файл - это мой первый "проект")))) Дорогу осилит идущий. Поэтому, надеюсь, что скоро буду более-менее разбираться в написании макросов...
Цитата
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается).

А вот как раз для этого и заполняю со второй строчки. Смысл следующий. При пустом значении Combobox1 в Combobox2 появляются все значения столбца "Данные ОБ" и в том случае, когда это необходимо, выбираю пустое значение и просматриваю всё, что есть в "Данные ОБ". Это подразумевалось изначально сделать для удобства.
Ещё раз большое спасибо!


Сообщение отредактировал ILIA-PLC - Суббота, 18.04.2020, 13:40
 
Ответить
СообщениеRoman777, Roman777, Спасибо большое! Буду пробовать перекладывать на мой файл.
Цитата
Тут поменять то совсем чуть-чуть для вашего удобства:
Да, я совсем мало что соображаю в VBA. По-сути этот файл - это мой первый "проект")))) Дорогу осилит идущий. Поэтому, надеюсь, что скоро буду более-менее разбираться в написании макросов...
Цитата
Не ясно, зачем вы первый бокс заполняете со строки 2, когда данные с 3й строки (у вас первая строчка пустая получается).

А вот как раз для этого и заполняю со второй строчки. Смысл следующий. При пустом значении Combobox1 в Combobox2 появляются все значения столбца "Данные ОБ" и в том случае, когда это необходимо, выбираю пустое значение и просматриваю всё, что есть в "Данные ОБ". Это подразумевалось изначально сделать для удобства.
Ещё раз большое спасибо!

Автор - ILIA-PLC
Дата добавления - 18.04.2020 в 13:38
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Значение Combobox2 в зависимости от значения Combobox 1 (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

jooble Яндекс цитирования
© 2010-2020 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!