Вставить строку в диапазон [РЕШЕНО]

Автор Aleksandr H., 16 ноября 2014, 11:59

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

Aleksandr H.

Это спинофф соседнено топика

Цитата: JohnSUN от 16 ноября 2014, 07:312. До Питоньяка так и не добрался? См.  5.23.2. Copy Spreadsheet Cells Without The Clipboard и  5.23.1. Copy Spreadsheet Cells With The Clipboard.
В первом из них приблизительно такой код:
Код:

Sub exampleCopyRange
Dim oSheet As Variant
Dim aRangeAddress As New com.sun.star.table.CellRangeAddress
Dim aCellAddress As New com.sun.star.table.CellAddress
oSheet = ThisComponent.getSheets().getByIndex(0) ' Первый лист книги (он есть всегда, не ошибемся)
aRangeAddress = oSheet.getRows().getByIndex(7).getRangeAddress() ' Адрес всей восьмой строки, на всю длину
aCellAddress = oSheet.getCellByPosition(0, 22).getCellAddress() ' Адрес первой ячейки в 23 строке
oSheet.copyRange(aCellAddress, aRangeAddress) ' Копирование
End Sub


На самом деле Oliver Brinzing там чуть запутаннее написал: сначала взял адрес всего диапазона, куда будет копировать, потом взял адрес его первой ячейки... Реально для копирования нужно знать адрес диапазона, из которого копируем (лист, первая и последняя колонка, первая и последняя строка), и адрес ячейки, в которую копируем (лист, колонка, строка).
(Друг мой, вообще-то этот твой вопрос хоть и в продолжение темы, но все-таки совершенно самостоятельный. На форуме есть правило - новый вопрос = новая тема. Так незарегистрированным читателям проще отыскивать ответы на свои вопросы. Учти на будущее, ОК?)

Этот код я видел, только он копирует строку и строку вставляет, в одно место. А как вставить эту строку в диапазон? см. видео

JohnSUN

Это тот самый FillAuto, про который я раньше намекал - щёлк и всё...
oSheet.getCellRangeByName("A1:F24").fillAuto(com.sun.star.sheet.FillDirection.TO_TOP, 1)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: JohnSUN от 16 ноября 2014, 10:11Это тот самый FillAuto,
...который Aleksandr H. уже использовал в коде.


Присваивать значения можно только равным по размерности объектам: или от ячейки к ячейке, или от массива к такому же по размерности массиву. В коде:
oSheet.copyRange(aCellAddress, aRangeAddress) ' Копированиекопирование происходит не в ячейку aCellAddress, а по адресу aCellAddress

JohnSUN

Цитата: rami от 16 ноября 2014, 12:25
ЦитироватьЭто тот самый FillAuto,
...который Aleksandr H. уже использовал в коде.
Где?  :o Это ты про последний вариант? Не вижу я там FillAuto...

Aleksandr H., по поводу видео... Да, размножение данных через копи-паст штука привычная. Но вот для такой операции - не перенос данных-формул-форматов, а просто для растягивания образца на целый диапазон - лучше использовать Правка-Заполнить: в принципе делается всё то же самое, но чуть-чуть лучше...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне


JohnSUN

Ага, спасибо... какой-то я рассеянный сегодня: скопировал код из сообщения в редактор Бэйсика, просмотрел, ничего нового не увидел... Оказывается, скопировал самый первый вариант, sub Cos.  :roll:
Кстати, Aleksandr H., а почему такое название? Вроде бы тут тригонометрией и не пахнет...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Aleksandr H.

Цитата: JohnSUN от 16 ноября 2014, 08:54Кстати, Aleksandr H., а почему такое название? Вроде бы тут тригонометрией и не пахнет...
Да, ты прав, тригонометрией и не пахнет. Кто называет процедуры Proc1, кто asdf, кто дает сразу осмысленное название на англ. языке, я же, в силу работы с нашими самими близкими соседями, временные процедуры называю просто coś (smthg - на 2 символа длиннее  ;))

Цитата: JohnSUN от 16 ноября 2014, 08:54просто для растягивания образца на целый диапазон - лучше использовать Правка-Заполнить: в принципе делается всё то же самое, но чуть-чуть лучше...
Я надеюсь что смогу сам найти программную реализацию этого. Подскажи, это ведь возможно?

rami

Цитата: Aleksandr H. от 16 ноября 2014, 18:04Я надеюсь что смогу сам найти программную реализацию этого. Подскажи, это ведь возможно?
Возможно, если обратить внимание :o на красную рамку на снимке экрана (Я уже второй раз сегодня выкладываю этот снимок)
Это и есть "Правка-Заполнить"

JohnSUN

А быстрее макрос в таком виде работать уже вряд ли будет. Эксперимента ради, попробуй на этих 9к строк тот приём, что в видео показал - тормоза начинаются здесь, от макроса уже ничего не зависит. Это Calc пересчитывает эту кучу формул, некоторые из которых требуют работы с 9000 значений.
Вообще-то, ускорить можно... Но придется пересмотреть последовательность действий.
Тут какие соображения: 9000 формул считаться будут по-любому дольше, чем 1000. Поэтому, наверное, можно было бы на первом этапе только пометить строки, которые понадобятся позже. То есть вставить пока только формулу в колонку C.
Когда она посчитается, выбрать только те строки, с которыми нужно работать дальше, и перенести их в новый лист.
Это, пожалуй, и будет ответом на первоначальный вопрос задачи, про удаление лишних строк...
Только потом, после сокращения исходных данных, переводить значения температур в числа, считать средние, отбирать по одному из вычисленных значений и, наверное, копировать в еще один новый лист...
Вроде бы должно немного ускориться.
У тебя в формуле всё ещё фигурирует 9000 (в формуле в колонке E). Не хочешь и туда (lastrow+1) вставить?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Aleksandr H.

rami, спасибо за подсказку.

JohnSUN, ты прав - если вручную на 9k записей повторить прием из видео, то это займет ~140 сек, так само как и работа макроса.