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

Главная категория => Макросы => Тема начата: eeigor от 24 марта 2020, 16:37

Название: Как правильно отсечь диапазон?
Отправлено: eeigor от 24 марта 2020, 16:37
Помогите разобраться.
Получаю диапазон ячеек (несколько столбцов и строк), и мне надо оставить только один (например, второй) столбец в этом диапазоне.
Пишу:
oAddress = oRange.Columns(1).RangeAddress

Однако oAddress.EndRow получает значение последней строки листа, т. е. берётся весь столбец на листе, а не в диапазоне.
Неожиданно, ибо в Excel не так (а как ожидалось: в пределах исходного диапазона).
Далее я корректирую oAddress самостоятельно, подсчитав количество строк в исходном диапазоне. Это неудобно.

Или делаю пересечение двух диапазонов:
oIntersection = oRange.queryIntersection(oRange.Columns(1).RangeAddress)
Полученный объект содержит пересечение двух диапазонов:
oIntersection.RangeAddresses(0).EndRow покажет правильное значение.

Что я делаю не так?
Название: Re: Как правильно отсечь диапазон?
Отправлено: mikekaganski от 24 марта 2020, 16:55
Действительно, XTableColumns::getByIndex() и XTableRows::getByIndex() возвращают не подобъект диапазона, а ссылку на столбцы/строки листа.

Если Вам нужен поддиапазон, получайте его с помощью функции getCellRangeByPosition(nLeft, nTop, nRight, nBottom); например, в рассматриваемом случае

oAddress = oRange.getCellRangeByPosition(1, 0, 1, oRange.Rows.Count-1).RangeAddress
Название: Re: Как правильно отсечь диапазон?
Отправлено: eeigor от 24 марта 2020, 16:57
Естественно, когда я, как оказалось, зарядил больше миллиона ячеек, LO Calc задумался...
Кроме того, Excel, получив такой "завышенный" диапазон, не спрашивая отсёк бы его по границе UsedRange (зд. UsedArea) и быстро бы откликнулся.
Название: Re: Как правильно отсечь диапазон?
Отправлено: eeigor от 24 марта 2020, 16:58
Спасибо