Страницы: 1
RSS
Значения для выпадающего списка в одной ячейке через разделитель
 
Дано:
Ячейка, в которой записаны значения для списка через какой-то определённый разделитель. Например "1;2;3;4"
Выпадающий список, который ссылается на эти значения, воспринимая их как одну строку.

Нужно: Чтобы этот список работал так, как если бы значения были заданы несколькими строками. В идеале - решение через пользовательсткую функцию. Пробовал через split разбивать строку на массивную переменную, но либо я что-то сделал не так, либо списки не умеют это читать. Пример, к сожалению, не сохранился.

В файле - r1c1 - то как это должно выглядеть, r2c1 - Список, который не работает, r2c2 - ячейка со значениями.
Изменено: Onefox - 14.12.2019 17:25:50
 
в Excel у вас разделитель элементов списка ; точка с запятой
а в VBA разделитель элементов списка , запятая
Код
Sub SetValidation2A5()
  With Range("A5").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
    Operator:=xlBetween, Formula1:=Replace([b2], ";", ",")
  End With
End Sub
Изменено: Ігор Гончаренко - 14.12.2019 18:17:01
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Работает, но, к сожалению, не так как надо. Возможно, я не вполне корректно сформулировал задачу.

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

Т.е. список должен воспринимать ячейку-источник не как строку, а как именованный диапазон, где пространство между разделителями играет роль ячеек диапазона. Сам разделитель при этом абсолютно не принципиален, в идеале - где-то обозначается отдельно.
 
возможно, кто-то сможет понять ваши уточнения
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Попробуем так.

Прикрепил пример. В нём два списка. Левый - определяет набор допустимых значений для правого, используя в качестве диапазона своих значений динамический диапазон [таблица 1[набор значений]]. Правый, соответственно, должен брать эту цифру, искать соответствующий этой цифре набор уже своих значений в [таблица 1[значения]] и представлять его в виде нескольких строк списка вместо одной, используя какое-то заданное текстовое значение в качестве разделителя. И делать он это должен в штатном порядке, как формула или любой другой нормальный список, а не по макросу. Мне почему-то кажется, что это очень простая задача, просто я не совсем понимаю свойства выпадающих списков.
 
Onefox,  ну так привяжите то что сделал Игорь к изменению в ячейке.

Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("b2")) Is Nothing Then
    With Range("A2").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
    Operator:=xlBetween, Formula1:=Replace([b2], ";", ",")
  End With
End If
End Sub
По вопросам из тем форума, личку не читаю.
 
БМВ, А есть какое-то подобное решение в виде функции, а не макроса? Предполагается, что таких списков будет много и не всегда в ожидаемых местах, прописывать для каждого случая отдельный макрос немножечко подзаманаюсь.
 
Цитата
Onefox написал:
прописывать для каждого случая отдельный макрос немножечко подзаманаюсь
Отдельные макросы не нужны: перечислите нужные ячейки (диапазоны) в одном.
 
Onefox, №6 я делал когда не видел №5. Тепеь и мне, стало не понятно что вы хотите. От чего что зависит и что должно куда попасть чтоб потом выпасть.
По вопросам из тем форума, личку не читаю.
 
БМВ, видимо, мои объяснятельные способности совсем никуда не годятся. Попробую на полуживом примере, нацарапанном на коленке.

Дано:
1 - на листе 1 динамическая таблица "Детали" с какими-то значениями, среди которых интересующие меня в данном случае: материал, цвет и толщина.
2 - На листе 2 несколько таблиц с именами материалов и таблица со списком этих материалов. В таблицах материалов есть какие-то параметры, которые подгружаются в таблицу "детали", в том числе и интересующие нас цвет и толщины (все допустимые для данного цвета значения в одной ячейке через запятую, например)

Как я себе представляю процесс:
1 - Выбираем материал
2 - Список "Цвет" подгружает допустимые значения из колонки "Цвет" таблицы материала.
3 - Выбираем цвет
4 - Список "Толщина" подгружает допустимые значения из ячейки, соответствующей значению "Цвет" из таблицы материала, представляя её не в виде одного стрингового значения, а в виде нескольких значений.
5 - Выбираем толщину из допустимых для данного цвета и материала.
6 - Радуемся.

Каковы нюансы:
1 - Таблица "Материалы" - пополняемая. Т.е. она рассчитана на то что ниже будут дописываться строки с соответствующим автоматическим расширением, как это свойственно умным таблицам.
2 - Таблицы материалов имеют свойство расширяться, обновляться и появляться новые.
3 - Всё это происходит в результате действия пользователя, не разбирающегося в экселе, а сталбыть, не способного запустить нужный макрос.
4 - Многое завязано на ДВССЫЛ

Таким образом прихожу к выводу, что процесс необходимо максимально автоматизировать. И лично я, как пользователь хоть и знакомый с экселем довольно плотно, но не считающий себя его гуру, а ВБА вообще слегка побаивающийся, предпочёл бы иметь формулу, которую можно просто воткнуть в поле источника для списка, нежели связываться с автоматизацией посредством событий листа. Тем более что эта формула могла бы пригодиться в других местах.

Если в таком варианте такое неосуществимо, то, возможен другой (файл "пример 2"):
Дано:
1 - на листе 1 динамическая таблица "Детали" с какими-то значениями, среди которых интересующие меня в данном случае: материал, цвет и толщина.
2 - На листе 2 несколько таблиц с именами материалов и таблица со списком этих материалов. В таблицах материалов есть какие-то параметры, которые подгружаются в таблицу "детали", в том числе и интересующие нас цвет, толщины, перечисленные в шапке, и значения цен для каждой из этих толщин. Некоторые значения цен - пустые, это значит, что цвета в этой толщине нет.

Как я себе представляю процесс:
1 - Выбираем материал
2 - Список "Цвет" подгружает допустимые значения из колонки "Цвет" таблицы материала.
3 - Выбираем цвет
4 - Список "Толщина" подгружает допустимые значения из шапки таблицы материала, руководствуясь наличием ненулевого значения цены на пересечении толщины и цвета. Соответственно, если цена нулевая, то значение в выпадающий список не идёт.
5 - Выбираем толщину из допустимых для данного цвета и материала.
6 - Радуемся.

Нюансы:
1 - Таблица "Материалы" - пополняемая. Т.е. она рассчитана на то что ниже будут дописываться строки с соответствующим автоматическим расширением, как это свойственно умным таблицам.
2 - Таблицы материалов имеют свойство расширяться, обновляться и появляться новые.
3 - Всё это происходит в результате действия пользователя, не разбирающегося в экселе, а сталбыть, не способного запустить нужный макрос.
4 - Многое завязано на ДВССЫЛ
5 - Для всех материалов в шапке зарезервировано 5 столбцов для толщин, но не все они заполнены какой-то толщиной.

Как я пытался реализовать:
Помимо очевидных попыток просто зафигачить в ячейку значения через запятую, я пытался сделать формулу массива, которая делает split значению в ячейке-аргументе1 с разделителем в виде аргумента2. Функция работала (т.е. я получал одномерный массив значений как если бы работал с диапазоном), но выпадающий список её жрать почему-то отказался, говоря мне что аргумент должен быть списком значений через разделитель или ссылкой на диапазон.

Читаю я всё это перед отправкой и понимаю, что второй вариант был бы даже более предпочтителен в перспективе. И, да, простите за многобукаф. Я не очень умею в объяснять(
Изменено: Onefox - 15.12.2019 00:43:52
 
см.вложение
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, Благодарю.
Очень похоже на то что мне нужно) Осталось понять своим не сильно обширным багажом знаний, как именно это работает - и можно будет преобразовать это в совсем то что надо)

Очень спасибо!
 
И снова здрасте.

Сделал я свою функцию и всем вроде бы доволен, но есть одно маленькое, но ощутимое НО. При изменении источника данных для списка или при изменении самой ячейки со списком при участии макроса, список представляется опять в виде одной строки. После повторного ввода руками чего ни будь в ячейку списка (или попытки, если ошибка включена), повторного ввода формулы или ручного ввода данных в список всё снова работает как надо, но это один хрен не торт. Пример во вложении.
Страницы: 1
Наверх