Формирование массива с одного листа и вывод на другой

Автор ali_vlad, 12 ноября 2019, 22:13

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

ali_vlad

Есть некий длинный список из трех столбцов на одном листе (ФИО, должность, признак). Из него надо сформировать несколько массивов (что то типа выборки) по определенному условию и поместить их на другой лист в несколько столбцов (ФИО, должность). Сгруппировать по общему признаку.
Переношу на другой лист через много For - Next по одному признаку. Получается много заходов, это долго и не правильно.
1. Подскажите примером, как правильно наполнить массив (ФИО, должность) по признаку (If <Условие1> Then <Добавить в Массив1: Строка1, Столбец1, Строка1, Столбец2>).
2. Как поместить Массив1 на другой лист в определенное место, начиная с .GetCellByPosition (X1,Y1) и до конца массива.

Yakov

Расширенный фильтр из Calc подойдёт?
Он то же умеет помещать результат в заданную область.

ali_vlad

#2
Не, массивы динамические и идут один за другим через пустую строку. Соответственно положение следующего массива напрямую зависит от длины предыдущего.
Как наполнить динамический массив я уже понял, как его поместить в ячейки - пока не понял.

economist

#3
Если нужно за один проход обработать несколько условий, то
If ... Then
ElseIf ... Then
End if

Также ветвление можно сделать на SELECT CASE - конструкции.

Впрочем, если эта задача регулярная, а исходные данные для условий меняются со временем (Типа был "Оператор АЗС", а стал "Оператор АЗС №2 Восход") - то правильнее назвать всю таблицу с ФИО - диапазоном, скажем, DATA, далее Фал-Создать БД - Соединиться - Эл. таблица - Выбрать ODS/XLS-файл - Готово, Далее Запросы - Создать в режиме SQL - написать select * from DATA where Должность="Оператор" и получить нужный список. Условия для запросов задаются в красивом SQL редакторе с подсветкой синтаксиса, нет никаких ограничений по объему данных, можно просто перетащить запрос во Writer/Calc и получить таблицу, а можно эту таблицу фильтровать интерактивно, передавая в запрос строки из различных "контролов" типа комбобокса.

Перетащенные в Calc SQL-запросы сами увеличивают число занимаемых ими строк, ничего "вычислять" не нужно. Набор "табличек" на листе так получить проще всего. И никаких макросов.  

UPD: чтобы макросу сообщить первую незанятую строку для вставки следующей "таблички" - можно просто написать формулу вида =СЧЁТА() и определять число занятых строк по её значению.


Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ali_vlad

#4
Мне не надо через sql, мне надо через basic запрлнить диапазон ячеек массивом.
Размерность массива я получаю при завершении его наполнения.

Yakov


dim Doc as object
Dim Sheet as object
Doc = ThisComponent
Sheet = Doc.getSheets.getByIndex(0)
Cell =  Sheet.getCellByPosition(X,Y)

Так?

ali_vlad

Цитата: Yakov от 13 ноября 2019, 15:55

dim Doc as object
Dim Sheet as object
Doc = ThisComponent
Sheet = Doc.getSheets.getByIndex(0)
Cell =  Sheet.getCellByPosition(X,Y)

Так?
Цитата: Yakov от 13 ноября 2019, 15:55

dim Doc as object
Dim Sheet as object
Doc = ThisComponent
Sheet = Doc.getSheets.getByIndex(0)
Cell =  Sheet.getCellByPosition(X,Y)

Так?
Это одна ячейка. У меня есть двумерный массив string. Его надо поместить в диапазон ячеек, начиная с X,Y. Я его записываю в ячейки через for ... ubond.
Есть ли другой способ поместить массив в ячейки сразу, не по одной через for.
Типа диапазону ячеек (X1,Y1,X2,Y2) присвоить значения массива А(Z,2) одним действием?

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут


bigor

в строке поиска форума набираешь, и выбираешь любой понравившийся пример
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

ali_vlad

Цитата: Bigor от 13 ноября 2019, 17:03
в строке поиска форума набираешь, и выбираешь любой понравившийся пример
С телефона тяжко это делать

bigor

Вот из твоей предыдущей темы

oASheet=oAdoc.sheets(0)'Tabelle 2
oArange=oASheet.getCellRangeByName("A1:B1")'source
oAarray=oArange.getDataArray()
oCrange=oCSheet.getCellRangeByName("A1:b1")'target
oCrange.setDataArray(oAarray)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут