Удаление необходимых строк

Автор Feers1de, 12 ноября 2014, 18:44

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

JohnSUN

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

ALexey7ov

Вот мой вариант решения поставленной задачи, время выполнения не замерял, но, субъективно, секунды две.
Макрос вставляет обработанные данные справа от начальных через 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

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

Повеселил конструкцией
N = UBound(ThisComponent.getSheets().getByIndex(0).getData())Сам придумал или где-то на форумах нарыл?  :beer:
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне