siti
|
Не могу придумать оптимальный алгоритм для следующей задачи: в таблице calc куча колонок. В заголовке каждой колонки (например строка 5) есть ячейка с тегом (строковое значение в одно слово, например m1, m2, price, install, photo и т.п. около 30шт) Стоит задача создать процедуру, которая присваивает переменным (название которых совпадает с тегом) значение номера колонки в которой стоит данный тег.
Есть вариант перебирать в цикле значение ячеек в данной строке с тегами и далее через If соотносить тег и переменную. Но конструкция будет из 30 if.
Может есть какой то более удобный метод?
|
|
|
Записан
|
|
|
|
sokol92
|
В таких случаях лучше использовать на 30 переменных, а словарь.
|
|
|
Записан
|
Владимир.
|
|
|
siti
|
А можно ссылку где это по-подробнее описано?
|
|
|
Записан
|
|
|
|
|
eeigor
|
«Стоит задача создать процедуру, которая присваивает переменным (название которых совпадает с тегом) значение номера колонки в которой стоит данный тег.»
Вы можете пояснить ЗАЧЕМ?
У столбцов уже есть индекс, а не номер. oColumn.RangeAddress.StartColumn
Edit: Создайте коллекцию ячеек типа Dim oColumnHeaders As New Collection с ключом – тег (метка) столбца, а значением – индекс столбца, после этого можно повторить вопрос: ЗАЧЕМ?
|
|
« Последнее редактирование: 16 Май 2022, 18:14 от eeigor »
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
sokol92
|
Подобные задачи бывают, когда мы импортируем из баз данных диапазон ячеек, первая строка которого представляет собой имена полей, а остальные строки - записи (Records) баз данных. Для быстрого доступа к ячейкам диапазона (или соответствующего массива) может понадобиться словарь, в котором ключом является имя поля, а значением - номер столбца.
|
|
|
Записан
|
Владимир.
|
|
|
siti
|
Вы можете пояснить ЗАЧЕМ? Есть исходная таблица в 30+ колонок Из нее формирую вторую по задаваемым пользователям условиям. Тут было нормально, просто константы в макросе с номерами колонок в исходной таблице, но понадобилось на основании второй делать типа презентацию и вставлять данные из второй, динамической таблицы. И тут расчеты где какая колонка стали сильно буксовать. Решил что проще будет проанализировать вторую таблицу чтобы знать что откуда брать. Плюс это более гибкий вариант в случае добавления новых колонок.
|
|
|
Записан
|
|
|
|
eeigor
|
Ну, понятно плохо, нужен файл, по возможности. Но должно быть более простое решение (без много кода), которое вы не видите и ведёте нас по ложному пути…
Edit: С такими таблицами работают иначе. Присваивают имена столбцам и строкам, а нужное значение берут на их пересечении, используя соответствующий оператор (в Excel – пробел, в Calc, вроде, – !).
|
|
« Последнее редактирование: 16 Май 2022, 18:34 от eeigor »
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
eeigor
|
Пользователь фильтрует строки или столбцы? Попробуйте в динамической таблице скрывать ненужные столбцы, не нарушая структуры записи (и порядка следования столбцов).
|
|
« Последнее редактирование: 16 Май 2022, 18:42 от eeigor »
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
eeigor
|
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
|
|
« Последнее редактирование: 16 Май 2022, 19:07 от eeigor »
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
siti
|
Вот пример файла. Скажем помесячная аренда недвижимости.
Со скрытием столбцов не вариант, так как файл результат отправляется клиенту и ему не надо иметь возможность глянуть скрытые столбцы.
С именами столбцов что-то не понял пока как их назначить.
|
|
« Последнее редактирование: 16 Май 2022, 19:25 от siti »
|
Записан
|
|
|
|
eeigor
|
Не быстро: я в дороге. Может, другие ответят быстрее…
|
|
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
siti
|
Не быстро: я в дороге. Может, другие ответят быстрее…
уже месяц осваиваю бейсик... не горит 
|
|
|
Записан
|
|
|
|
eeigor
|
А в чем суть фильтрации?
|
|
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
siti
|
А в чем суть фильтрации?
клиент указывает какие месяцы ему нужны (лишние колонки выкидываются), от типа клиента выбирается цена. И от типа клиента так же необходимость выводить те или иные доп колонки. Строки выводятся выборочно (в которых свободен хотя бы один или все запрашиваемые месяцы) или все, но это к вопросу наверное не относится. Формирование второй таблицы сделано. Загвоздка в заполнении третьей (Презентация). Выбор нужной колонки из второй динамической таблицы. Тема с именами колонок интересная. Надо понять как это применить.
|
|
« Последнее редактирование: 16 Май 2022, 19:34 от siti »
|
Записан
|
|
|
|
|