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

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

7 Март 2021, 05:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Удаление необходимых строк  (Прочитано 10880 раз)
0 Пользователей и 1 Гость смотрят эту тему.
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #15: 16 Ноябрь 2014, 12:07 »

Спасибо, rami, а то я в код не вчитывался... Потому и на не тот вопрос ответил. Можно формулы растянуть, и это очень просто:
Код:
oSheet.getCellRangeByName("C2:F8348").fillAuto(com.sun.star.sheet.FillDirection.TO_TOP, 1)
Только здесь внимательно надо: растягиваемая строка тоже должна в выделяемый диапазон попасть - не только ячейки куда копируем, но и исходные.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
ALexey7ov
Участник
**
Offline Offline

Пол: Мужской
Расположение: г.Мелеуз
Сообщений: 17



WWW
« Ответ #16: 21 Ноябрь 2014, 10:09 »

Вот мой вариант решения поставленной задачи, время выполнения не замерял, но, субъективно, секунды две.
Макрос вставляет обработанные данные справа от начальных через 1 столбец.

Код:
Sub Temperaturer
 dim ShD as object ' Модель объекта табличного документа
 dim ShL as object ' Модель объекта листа документа
 dim N as long ' Переменная количества строк на листе
 dim i as long ' Переменна счётчика
 dim k as long ' Переменная ещё одного счётчика
 dim l as long ' Переменная ещё одного счётчика
 dim CR as object ' Модель диапазона ячеек
 dim Dar as variant ' Массив данных диапазона ячеек
 dim D1(0) as variant ' Выборка по времени
 dim D2(0) as variant ' Сгрупированные данные
 
 ShD=ThisComponent
 ShL=ShD.sheets(0)
 N=ubound(ShL.Data)
 CR=ShL.getCellRangeByPosition(0,0,1,N)
 Dar=CR.getDataArray()
 k=-1
 Rem Выборка отметок в 12:00 и 15:00
 for i=0 to N
  select case right(Dar(i)(0),5)
   case "12:00","15:00"
    k=k+1: redim preserve D1(k)
    D1(k)=array(0,0)
    D1(k)(0)=Dar(i)(0)
    D1(k)(1)=Val(Dar(i)(1))
  end select
 next
 
 Rem Нахождение средней температуры по 2-м или 1-й отметке
 l=-1
 for i=0 to k-1 step 2
  l=l+1
  redim preserve D2(l)
  D2(l)=array(0,0)
  if left(D1(i)(0),10)<>left(D1(i+1)(0),10) then
   D1(i)(0)=left(D1(i)(0),10)
   D2(l)(0)=D1(i)(0): D2(l)(1)=D1(i)(1)
   i=i-1 ' Поправка перехода
  else
   D1(i)(0)=left(D1(i)(0),10)
   D1(i)(1)=(D1(i)(1)+D1(i+1)(1))/2
   D1(i+1)(0)=0: D1(i+1)(1)=0
   D2(l)(0)=D1(i)(0): D2(l)(1)=D1(i)(1)
  endif
 next

 CR=ShL.getCellRangeByPosition(3,0,4,ubound(D2()))
 CR.setDataArray(D2()) ' Запись обратно на лист
End Sub
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #17: 21 Ноябрь 2014, 10:47 »

Да, довольно бодрый вариант... Шустрый и на предложенных данных работает без ошибок... кажется...  Смеющийся Да нет, действительно без ошибок, это я по привычке осторожничаю.
Пару моментов, наверное, стоило бы улучшить.
Во-первых, нам просто повезло, что данные в тестовой книге уже были отсортированы по убыванию даты-времени. Шли бы они в случайном порядке или хотя бы пара десятков дат уползли бы со своего места вверх или вниз - получили бы мы две-три тысячи значений, которые ни о чём не говорят. Поэтому, раз уж второй цикл ориентируется на строгое последовательное убывание дат, то начать макрос, пожалуй, следовало бы с принудительной сортировки данных. То ли прямо данные в листе отсортировать, то ли на массив D1 QuickSort натравить...
И во-вторых, тысяча ReDim'ов D2 - это сильное замедление алгоритма. Лучше было бы сразу определить его размером с D1 (больше не надо, на больше у нас значений не хватит), а в самом конце одним ReDim'ом обрезать лишний незаполненный хвост...

Повеселил конструкцией
Код:
N = UBound(ThisComponent.getSheets().getByIndex(0).getData())
Сам придумал или где-то на форумах нарыл?  Всё хорошо
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: « 1 2   Вверх
  Печать  
 
Перейти в:  

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