Посоветуйте алгоритм решения

Автор siti, 16 мая 2022, 14:10

0 Пользователи и 1 гость просматривают эту тему.

siti

Не могу придумать оптимальный алгоритм для следующей задачи:
в таблице calc куча колонок. В заголовке каждой колонки (например строка 5) есть ячейка с тегом (строковое значение в одно слово, например m1, m2, price, install, photo и т.п. около 30шт)
Стоит задача создать процедуру, которая присваивает переменным (название которых совпадает с тегом) значение номера колонки в которой стоит данный тег.

Есть вариант перебирать в цикле значение ячеек в данной строке с тегами и далее через If соотносить тег и переменную. Но конструкция будет из 30 if.

Может есть какой то более удобный метод?

sokol92

В таких случаях лучше использовать на 30 переменных, а словарь.
Владимир.

siti

А можно ссылку где это по-подробнее описано?

sokol92

Про применение словарей в Excel можно прочитать здесь.

В LO Basic для словаря можно использовать сервис  EnumerableMap.
Владимир.

eeigor

#4
«Стоит задача создать процедуру, которая присваивает переменным (название которых совпадает с тегом) значение номера колонки в которой стоит данный тег.»

Вы можете пояснить ЗАЧЕМ?

У столбцов уже есть индекс, а не номер.
oColumn.RangeAddress.StartColumn

Edit:
Создайте коллекцию ячеек типа
Dim oColumnHeaders As New Collection
с ключом – тег (метка) столбца, а значением – индекс столбца, после этого можно повторить вопрос: ЗАЧЕМ?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

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

siti

Цитата: eeigor от 16 мая 2022, 17:51Вы можете пояснить ЗАЧЕМ?
Есть исходная таблица в 30+ колонок
Из нее формирую вторую по задаваемым пользователям условиям. Тут было нормально, просто константы в макросе с номерами колонок в исходной таблице, но понадобилось на основании второй делать типа презентацию и вставлять данные из второй, динамической таблицы. И тут расчеты где какая колонка стали сильно буксовать. Решил что проще будет проанализировать вторую таблицу чтобы знать что откуда брать.
Плюс это более гибкий вариант в случае добавления новых колонок.

eeigor

#7
Ну, понятно плохо, нужен файл, по возможности. Но должно быть более простое решение (без много кода), которое вы не видите и ведёте нас по ложному пути...

Edit:
С такими таблицами работают иначе. Присваивают имена столбцам и строкам, а нужное значение берут на их пересечении, используя соответствующий оператор (в Excel – пробел, в Calc, вроде, – !).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#8
Пользователь фильтрует строки или столбцы?
Попробуйте в динамической таблице скрывать ненужные столбцы, не нарушая структуры записи (и порядка следования столбцов).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#9
Demo code:

Dim oColumnHeaders As New Collection
Dim sh, rg, cell
Dim j&

sh = ThisComponent.Sheets(0)
rg = sh.getCellRangeByPosition(0, 4, 30, 4)
For j = 0 To 30  'rg.RangeAddress.EndColumn | rg.Columns.Count - 1
   cell = rg.getCellByPosition(j, 4)
   oColumnHeaders.Add cell.CellAddress.Column, cell.String
Next
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

siti

#10
Вот пример файла. Скажем помесячная аренда недвижимости.

Со скрытием столбцов не вариант, так как файл результат отправляется клиенту и ему не надо иметь возможность глянуть скрытые столбцы.

С именами столбцов что-то не понял пока как их назначить.

eeigor

Не быстро: я в дороге. Может, другие ответят быстрее...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

siti

Цитата: eeigor от 16 мая 2022, 19:03
Не быстро: я в дороге. Может, другие ответят быстрее...
уже месяц осваиваю бейсик... не горит  ;)

eeigor

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

siti

#14
Цитата: eeigor от 16 мая 2022, 19:24
А в чем суть фильтрации?
клиент указывает какие месяцы ему нужны (лишние колонки выкидываются), от типа клиента выбирается цена. И от типа клиента так же необходимость выводить те или иные доп колонки.

Строки выводятся выборочно (в которых свободен хотя бы один или все запрашиваемые месяцы) или все, но это к вопросу наверное не относится.

Формирование второй таблицы сделано. Загвоздка в заполнении третьей (Презентация). Выбор нужной колонки из второй динамической таблицы.
Тема с именами колонок интересная. Надо понять как это применить.