Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

30 Июнь 2022, 19:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 3 »   Вниз
  Печать  
Автор Тема: Посоветуйте алгоритм решения  (Прочитано 2325 раз)
0 Пользователей и 1 Гость смотрят эту тему.
siti
Форумчанин
***
Offline Offline

Сообщений: 54


« Стартовое сообщение: 16 Май 2022, 14:10 »

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

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

Может есть какой то более удобный метод?
Записан
sokol92
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 939


WWW
« Ответ #1: 16 Май 2022, 14:24 »

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

Владимир.
siti
Форумчанин
***
Offline Offline

Сообщений: 54


« Ответ #2: 16 Май 2022, 14:43 »

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

Пол: Мужской
Сообщений: 939


WWW
« Ответ #3: 16 Май 2022, 15:14 »

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

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

Владимир.
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 104


« Ответ #4: 16 Май 2022, 17:51 »

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

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

У столбцов уже есть индекс, а не номер.
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
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 939


WWW
« Ответ #5: 16 Май 2022, 18:05 »

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

Владимир.
siti
Форумчанин
***
Offline Offline

Сообщений: 54


« Ответ #6: 16 Май 2022, 18:16 »

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

Пол: Мужской
Сообщений: 1 104


« Ответ #7: 16 Май 2022, 18:28 »

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

Edit:
С такими таблицами работают иначе. Присваивают имена столбцам и строкам, а нужное значение берут на их пересечении, используя соответствующий оператор (в Excel – пробел, в Calc, вроде, – !).
« Последнее редактирование: 16 Май 2022, 18:34 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 104


« Ответ #8: 16 Май 2022, 18:39 »

Пользователь фильтрует строки или столбцы?
Попробуйте в динамической таблице скрывать ненужные столбцы, не нарушая структуры записи (и порядка следования столбцов).
« Последнее редактирование: 16 Май 2022, 18:42 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 104


« Ответ #9: 16 Май 2022, 18:57 »

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
Форумчанин
***
Offline Offline

Сообщений: 54


« Ответ #10: 16 Май 2022, 19:00 »

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

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

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

* Пример.ods (27.17 Кб - загружено 1 раз.)
« Последнее редактирование: 16 Май 2022, 19:25 от siti » Записан
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 104


« Ответ #11: 16 Май 2022, 19:03 »

Не быстро: я в дороге. Может, другие ответят быстрее…
Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
siti
Форумчанин
***
Offline Offline

Сообщений: 54


« Ответ #12: 16 Май 2022, 19:06 »

Не быстро: я в дороге. Может, другие ответят быстрее…
уже месяц осваиваю бейсик... не горит  Подмигивающий
Записан
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 104


« Ответ #13: 16 Май 2022, 19:24 »

А в чем суть фильтрации?
Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
siti
Форумчанин
***
Offline Offline

Сообщений: 54


« Ответ #14: 16 Май 2022, 19:29 »

А в чем суть фильтрации?
клиент указывает какие месяцы ему нужны (лишние колонки выкидываются), от типа клиента выбирается цена. И от типа клиента так же необходимость выводить те или иные доп колонки.

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

Формирование второй таблицы сделано. Загвоздка в заполнении третьей (Презентация). Выбор нужной колонки из второй динамической таблицы.
Тема с именами колонок интересная. Надо понять как это применить.
« Последнее редактирование: 16 Май 2022, 19:34 от siti » Записан
Страниц: 1 2 3 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!