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

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

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

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

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


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


WWW
« Ответ #41801: 4 Май 2017, 16:52 »

Можно, всё можно: программирование для того и придумано, чтобы на любой вопрос - любой ответ  Подмигивающий
Только сразу поправка - FinalRow (а заодно и FinalColumn) лучше описывать не как Integer, а сразу как Long. Всё-таки сейчас в листе больше миллиона строк - а вдруг номер последней заполненной строки в Integer не поместиться, а?

В местном Бэйсике нет экселевских xlUp/xlToLeft, здесь это делается иначе. Например, так. Дополняем код отдельной функцией:
Код:
Function getLast(oSheet as Variant, sCellAddress As String, lastColumn As Boolean) As Long
Dim oCursor As Variant
Dim aRAddress As New com.sun.star.table.CellRangeAddress
oCursor = oSheet.createCursorByRange(oSheet.getCellRangeByName(sCellAddress))
oCursor.collapseToCurrentRegion()
aRAddress = oCursor.getRangeAddress()
If lastColumn Then
getLast = aRAddress.EndColumn
Else
getLast = aRAddress.EndRow
EndIf
End Function
Здесь не сложно, функция создает на листе вокруг ячейки с адресом sCellAddress "курсор" и даёт этому курсору команду "растянись на весь текущий диапазон". Это все равно как стоя на любой ячейке внутри сплошного диапазона нажать Ctrl+*
И в зависимости от значения третьего параметра возвращается или номер последней колонки, или номер последней строки.
Не факт, что это будет именно последняя заполненная ячейка в колонке или в строке. Но уж во всяком случае не меньше, чем нужно.
А начало основной процедуры изменится так:
Код:
Dim i&, j& ' Индексы циклов
Dim FinalRow, FinalColumn As Long
oSheets = ThisComponent.getSheets()
oSheet = oSheets.getByIndex(13)
FinalRow = getLast(oSheet, "D14", True)
FinalColumn = getLast(oSheet, "C15", False)
oRange = oSheet.getCellRangeByPosition(2, 13, FinalColumn, FinalRow)
Кстати, эти твои 2 и 13 сбили меня с толку. Речь шла именно о второй колонке? В LibreOffice номер колонки 2 соответствует колонке C, то же и с номерами строк, и с номерами листов - все они нумеруются с нуля.
Записан

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

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