Как узнать адрес последней ячейки?

Автор Rafik, 14 марта 2016, 08:52

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

Rafik

Макрос Function GetEndAdr(nSht as integer, Optional oDoc0) as Object
' nSht - номер листа(не индекс, а номер), oDoc0 - Ссылка на документ
' 9 - object
' oDoc не объект - работаем с текущим документом,
' иначе - будет работа с переданной ссылкой на документ
if vartype(oDoc0) <> 9 Then
oDoc0=ThisComponent
End If
' Находит последнюю ячейку документа и возвращает его
dim document   as object
dim dispatcher as object
rem get access to the document
document   = oDoc0.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Dim oSheet          ' Sheet to filter.
' Переключаемся на лист nSht, делаем его активным
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Nr"
args4(0).Value = nSht
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4())
' Перемещение на конец документа
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Sel"
args2(0).Value = false
' Получаем адрес последней ячейки
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args2())
' Возвращаем адрес последней ячейки документа
GetEndAdr=oAddr
end function
не всегда корректно работает в LO версии 4.2.2 под XP. Не всегда срабатывает перемещение на конец документа и получаю неправильный адрес. В одном и том же документе с одним и тем же макросом то работает нормально, то не работает.

Есть ли другой более надежный способ, кроме обхода всего документа в цикле по условию "пока ячейки заполнены"?

На более новые версии пока не хочу переходить, т.к. они время от времени они падают при работе макроса,  сохраняющего текущий документ под другим именем. Было замечено в LO версиях 4.4.6 и 5.0.2.  А версия 4.2.2 ещё ни разу не падала при сохранении из макроса.

rami

Переменная oAddr в конце вашей функции откуда взялась?

Возможно так подойдёт?
Function GetEndAdr(nSht as integer, Optional oDoc0)
' nSht - номер листа(не индекс, а номер), oDoc0 - Ссылка на документ
' 9 - object
' oDoc не объект - работаем с текущим документом,
' иначе - будет работа с переданной ссылкой на документ
if vartype(oDoc0) <> 9 Then
oDoc0=ThisComponent
End If
oSheet=oDoc0.Sheets(nSht-1)
oCursor = oSheet.createCursor
oCursor.GotoEndOfUsedArea(false)
oAddr=oCursor.AbsoluteName ' Получаем адрес последней ячейки как строку
GetEndAdr=oAddr ' Возвращаем адрес последней ячейки документа
end Function

JohnSUN

Вообще-то, для параметров, помеченных как Optional, проверка обычно выполняется не "if vartype(oDoc0) <> 9", а "If IsMissing(oDoc0)"
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Rafik

Цитата: rami от 14 марта 2016, 08:00Переменная oAddr в конце вашей функции откуда взялась?
Строку oAddr=oDoc0.getCurrentSelection().getCellAddress после dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args2())
при копировании в сообщение пропустил

rami, спасибо. Попробую предложенный вариант. Возможно, будет работать без осечки.

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

Rafik

Вот что в итоге у меня получилосьFunction GetEndAdr(nSht as integer, Optional oDoc0)
' nSht - индекс листа, oDoc0 - Ссылка на документ
' oDoc не задан - работаем с текущим документом,
' иначе - будет работа с переданной ссылкой на документ
If IsMissing(oDoc0) Then
oDoc0=ThisComponent
End If
oSheet=oDoc0.Sheets(nSht)
oCursor = oSheet.createCursor
oCursor.GotoEndOfUsedArea(false)
' oAddr=oCursor.AbsoluteName ' Получаем адрес последней ячейки как строку
nEndRow = oCursor.RangeAddress.EndRow
nEndCol = oCursor.RangeAddress.EndColumn
GetEndAdr=Array(nEndCol,nEndRow) ' Возвращаем адрес последней ячейки документа
end Function
Возможно кому-то пригодится.
Необходимость передавать номер листа отпала и сейчас передаю индекс листа. Возвращает индекс колонки и индекс строки последней ячейки.