В файле два листа "ReportS" - отчет, и "Nomenclature" - справочники. На листе "ReportS" есть работающие связанные списки, созданные через "проверку данных": "Категории" и "Номенклатура". Каждому элементу из "умной" таблицы "Категории" соответствует "умная" таблица Номенклатуры с таким же названием. При наличии пробелов в названиях Категорий происходит замена на "_". Значения из списков "Категории" и "Номенклатура" использовались как условия для создания отчета продаж, реализованном с помощью формул (самого отчета в примере нет, дабы не загромождать). Решил заменить стандартные списки на ComboBox. Первый ComboBox1 работает. Пытался использовать в ComboBox2 переменную, которой присваивается значение из ComboBox1. Но не работает. Прошу помочь.
[vba]
Код
Private Sub ComboBox1_Change() Worksheets("ReportS").ComboBox2.Clear With Worksheets("Nomenclature") Worksheets("ReportS").ComboBox1.ListFillRange = "'" & .Name & "'!" & .ListObjects("Категорія").ListColumns("Категорія").DataBodyRange.Address End With End Sub
[/vba]
[vba]
Код
Sub ComboBox2_Change() Dim ComboBox1Value As String ComboBox1Value = Replace(ComboBox1.Value, " ", "_") With Worksheets("Nomenclature") Worksheets("ReportS").ComboBox2.ListFillRange = "'" & .Name & "'!" & .ListObjects("ComboBox1Value").ListColumns("ComboBox1Value").DataBodyRange.Address End With End Sub
[/vba]
И еще вопрос, а то не совсем понимаю. Возможно ли использовать значение, выбранное в ComboBox, в обычных формулах Excel? Т.е., если при использовании обычных списков, я могу подставить в формулу значение из ячейки (например, как условие в функции "ЕСЛИ"), то как теперь это сделать при использовании ComboBox? Или это возможно только через предварительную запись значения из ComboBox в какую-то ячейку (Cells(ХХ, ХХ) = ComboBox1.Value), и в формуле уже ссылаться на нее?
Здравствуйте.
В файле два листа "ReportS" - отчет, и "Nomenclature" - справочники. На листе "ReportS" есть работающие связанные списки, созданные через "проверку данных": "Категории" и "Номенклатура". Каждому элементу из "умной" таблицы "Категории" соответствует "умная" таблица Номенклатуры с таким же названием. При наличии пробелов в названиях Категорий происходит замена на "_". Значения из списков "Категории" и "Номенклатура" использовались как условия для создания отчета продаж, реализованном с помощью формул (самого отчета в примере нет, дабы не загромождать). Решил заменить стандартные списки на ComboBox. Первый ComboBox1 работает. Пытался использовать в ComboBox2 переменную, которой присваивается значение из ComboBox1. Но не работает. Прошу помочь.
[vba]
Код
Private Sub ComboBox1_Change() Worksheets("ReportS").ComboBox2.Clear With Worksheets("Nomenclature") Worksheets("ReportS").ComboBox1.ListFillRange = "'" & .Name & "'!" & .ListObjects("Категорія").ListColumns("Категорія").DataBodyRange.Address End With End Sub
[/vba]
[vba]
Код
Sub ComboBox2_Change() Dim ComboBox1Value As String ComboBox1Value = Replace(ComboBox1.Value, " ", "_") With Worksheets("Nomenclature") Worksheets("ReportS").ComboBox2.ListFillRange = "'" & .Name & "'!" & .ListObjects("ComboBox1Value").ListColumns("ComboBox1Value").DataBodyRange.Address End With End Sub
[/vba]
И еще вопрос, а то не совсем понимаю. Возможно ли использовать значение, выбранное в ComboBox, в обычных формулах Excel? Т.е., если при использовании обычных списков, я могу подставить в формулу значение из ячейки (например, как условие в функции "ЕСЛИ"), то как теперь это сделать при использовании ComboBox? Или это возможно только через предварительную запись значения из ComboBox в какую-то ячейку (Cells(ХХ, ХХ) = ComboBox1.Value), и в формуле уже ссылаться на нее?Jenialij
Ошибку у себя нашел. Для ComboBox2 названия столбцов должны быть с пробелами.
[vba]
Код
Sub ComboBox2_Change()
Dim ComboBox1Value As String, ComboBox1Value2 As String ComboBox1Value = Replace(ComboBox1.Value, " ", "_") ComboBox1Value2 = ComboBox1.Value
With Worksheets("Nomenclature") Worksheets("ReportS").ComboBox2.ListFillRange = "'" & .Name & "'!" & .ListObjects("ComboBox1Value").ListColumns("ComboBox1Value2").DataBodyRange.Address End With End Sub
[/vba]
Но все равно не работает.
Ошибку у себя нашел. Для ComboBox2 названия столбцов должны быть с пробелами.
[vba]
Код
Sub ComboBox2_Change()
Dim ComboBox1Value As String, ComboBox1Value2 As String ComboBox1Value = Replace(ComboBox1.Value, " ", "_") ComboBox1Value2 = ComboBox1.Value
With Worksheets("Nomenclature") Worksheets("ReportS").ComboBox2.ListFillRange = "'" & .Name & "'!" & .ListObjects("ComboBox1Value").ListColumns("ComboBox1Value2").DataBodyRange.Address End With End Sub
MikeVol, спасибо! С опозданием отвечаю, т.к. не было возможности.
Протестировал и выявил несколько нюансов. 1. Если файл открыть при других открытых книгах, то ComboBox1 и 2 не работают. 2. В процедуру "Private Sub ComboBox1_Change()" добавил команду для очистки ComboBox2, поскольку без нее в ComboBox2 накапливается весь список номенклатуры, а не тот, что соответствует только выбранной категории: [vba]
Код
Worksheets("ReportS").ComboBox2.Clear
[/vba] Но, снова таки, при первых изменениях ComboBox1 очистка ComboBox2 не происходит. Нужно сначала выбрать номенклатуру, и только при повторном изменении категории, очищается ComboBox2. 3. Добавление/удаление категорий отображается в ComboBox1 только при переоткрытии книги.
Можно это "подкрутить", ибо не уверен, что сам справлюсь?
MikeVol, спасибо! С опозданием отвечаю, т.к. не было возможности.
Протестировал и выявил несколько нюансов. 1. Если файл открыть при других открытых книгах, то ComboBox1 и 2 не работают. 2. В процедуру "Private Sub ComboBox1_Change()" добавил команду для очистки ComboBox2, поскольку без нее в ComboBox2 накапливается весь список номенклатуры, а не тот, что соответствует только выбранной категории: [vba]
Код
Worksheets("ReportS").ComboBox2.Clear
[/vba] Но, снова таки, при первых изменениях ComboBox1 очистка ComboBox2 не происходит. Нужно сначала выбрать номенклатуру, и только при повторном изменении категории, очищается ComboBox2. 3. Добавление/удаление категорий отображается в ComboBox1 только при переоткрытии книги.
Можно это "подкрутить", ибо не уверен, что сам справлюсь?Jenialij
MikeVol, еще раз благодарю за то, что уделили время. *** С пунктом "2. Очистка ComboBox2" все же есть нюансы. Пошагово опишу. Вариант 1. Предварительно ComboBox1 и ComboBox2 заполнены значениями. 1. Открываем книгу. Меняем значение ComboBox1 (категории) - при этом ComboBox2 НЕ очищается. 2. Устанавливаем значение ComboBox2. 3. Повторно меняем значение ComboBox1 - при этом ComboBox2 уже очищается. Т.е., первое изменение ComboBox1 после открытия книги не приводит к очистке ComboBox2.
Вариант 2. Предварительно ComboBox1 заполнен значением, а ComboBox2 - пустой. 1. Открываем книгу. Пробуем выбрать значение для ComboBox2, но список пуст, хотя ComboBox1 заполнен. 2. Меняем значение ComboBox1. После этого уже можно выбирать значения из ComboBox2. Т.е., после открытия книги ComboBox2 не содержит списка, соответствующего выбранной категории в ComboBox1.
По большему счету, все это не так уж критично, и можно смириться. Но, если возможно... *** С пунктом №1 буду разбираться, т.к. у меня такое поведение все же наблюдается. Странно. Если файл открыть первым, а потом другие книги, то все хорошо. А если файл открыть при других открытых книгах, то ComboBox-ы не работают. *** Добра вам!
MikeVol, еще раз благодарю за то, что уделили время. *** С пунктом "2. Очистка ComboBox2" все же есть нюансы. Пошагово опишу. Вариант 1. Предварительно ComboBox1 и ComboBox2 заполнены значениями. 1. Открываем книгу. Меняем значение ComboBox1 (категории) - при этом ComboBox2 НЕ очищается. 2. Устанавливаем значение ComboBox2. 3. Повторно меняем значение ComboBox1 - при этом ComboBox2 уже очищается. Т.е., первое изменение ComboBox1 после открытия книги не приводит к очистке ComboBox2.
Вариант 2. Предварительно ComboBox1 заполнен значением, а ComboBox2 - пустой. 1. Открываем книгу. Пробуем выбрать значение для ComboBox2, но список пуст, хотя ComboBox1 заполнен. 2. Меняем значение ComboBox1. После этого уже можно выбирать значения из ComboBox2. Т.е., после открытия книги ComboBox2 не содержит списка, соответствующего выбранной категории в ComboBox1.
По большему счету, все это не так уж критично, и можно смириться. Но, если возможно... *** С пунктом №1 буду разбираться, т.к. у меня такое поведение все же наблюдается. Странно. Если файл открыть первым, а потом другие книги, то все хорошо. А если файл открыть при других открытых книгах, то ComboBox-ы не работают. *** Добра вам!Jenialij
1. Открываем книгу. Меняем значение ComboBox1 (категории) - при этом ComboBox2 НЕ очищается.
Тут вы лукавите! При открытии книги изначально происходит очистка всех ComboBox-в [vba]
Код
Option Explicit
Private Sub Workbook_Open() FillCombo End Sub
[/vba]Что в своё время вызывает другую процедуру [vba]
Код
Option Explicit
Public Sub FillCombo() Application.ScreenUpdating = False ThisWorkbook.Worksheets("ReportS").ComboBox1.Clear ThisWorkbook.Worksheets("ReportS").ComboBox2.Clear ThisWorkbook.Worksheets("ReportS").ComboBox1.List = Application.Transpose(ThisWorkbook.Worksheets("Nomenclature").ListObjects("Категорія").ListColumns("Категорія").DataBodyRange.Value) Application.ScreenUpdating = True End Sub
1. Открываем книгу. Пробуем выбрать значение для ComboBox2, но список пуст, хотя ComboBox1 заполнен.
Тут вы тоже лукавите! Смотрим скрин Связанные списки ComboBox_OpenBook, далее смотрим скрин Связанные списки ComboBox_OpenBook_Combo1 и далее смотрим скрин Связанные списки ComboBox_OpenBook_Combo2 Незнаю почему у вас так но у меня всё путём, всё так работает как и требуется.
Странно. Если файл открыть первым, а потом другие книги, то все хорошо. А если файл открыть при других открытых книгах, то ComboBox-ы не работают.
У меня что первым его открыть что вторым или третьем его открыть всё работает. Вы случаем не поместили код процедур из моего файла в Личную Книгу макросов или в собственную надстройку?
1. Открываем книгу. Меняем значение ComboBox1 (категории) - при этом ComboBox2 НЕ очищается.
Тут вы лукавите! При открытии книги изначально происходит очистка всех ComboBox-в [vba]
Код
Option Explicit
Private Sub Workbook_Open() FillCombo End Sub
[/vba]Что в своё время вызывает другую процедуру [vba]
Код
Option Explicit
Public Sub FillCombo() Application.ScreenUpdating = False ThisWorkbook.Worksheets("ReportS").ComboBox1.Clear ThisWorkbook.Worksheets("ReportS").ComboBox2.Clear ThisWorkbook.Worksheets("ReportS").ComboBox1.List = Application.Transpose(ThisWorkbook.Worksheets("Nomenclature").ListObjects("Категорія").ListColumns("Категорія").DataBodyRange.Value) Application.ScreenUpdating = True End Sub
1. Открываем книгу. Пробуем выбрать значение для ComboBox2, но список пуст, хотя ComboBox1 заполнен.
Тут вы тоже лукавите! Смотрим скрин Связанные списки ComboBox_OpenBook, далее смотрим скрин Связанные списки ComboBox_OpenBook_Combo1 и далее смотрим скрин Связанные списки ComboBox_OpenBook_Combo2 Незнаю почему у вас так но у меня всё путём, всё так работает как и требуется.
Странно. Если файл открыть первым, а потом другие книги, то все хорошо. А если файл открыть при других открытых книгах, то ComboBox-ы не работают.
У меня что первым его открыть что вторым или третьем его открыть всё работает. Вы случаем не поместили код процедур из моего файла в Личную Книгу макросов или в собственную надстройку?
Уважаемый MikeVol, нет, не лукавлю. ) Все описанное мной происходит с файлом 27_01_2025_exw_svjazannye_spis.xls, скачанным с форума (ничего нигде не менял кроме, собственно, значений ComboBox). Мог бы подтвердить свои слова видео, но не ужму его до 500кб, а ссылки на сторонние ресурсы запрещены. * Значит что-то где-то у меня... Буду искать в чем проблема. * Еще раз благодарю за помощь.
Уважаемый MikeVol, нет, не лукавлю. ) Все описанное мной происходит с файлом 27_01_2025_exw_svjazannye_spis.xls, скачанным с форума (ничего нигде не менял кроме, собственно, значений ComboBox). Мог бы подтвердить свои слова видео, но не ужму его до 500кб, а ссылки на сторонние ресурсы запрещены. * Значит что-то где-то у меня... Буду искать в чем проблема. * Еще раз благодарю за помощь.Jenialij