Определение номера выделенной строки

Автор Nikem79, 17 июля 2012, 13:58

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

Nikem79

Есть вот такой макрос:



'Определение строки

Sub add_case
Dim oRange as Object
Dim r as Integer
oRange = thisComponent.getCurrentSelection.getRangeAddress
r = oRange.startRow
msgbox "Первая выделенная строка под номером " &r+1
End Sub



Он определяет первую выделенную строчку и выводит её сообщением

Проблема в том, что если выделять через строчно, то выходит ошибка.

Как можно избежать ошибки при выделении черезстрочно и вернуть таки значение первой выделенной строки?

JohnSUN

Смотря что называть "первой выделенной строкой"... Та, которую выделили первой? Или та, которая самая верхняя из всех выделенных?
Этот код показывает номер строки с "активной ячейкой":
Sub getActiveRow()
MsgBox("Активная строка (с ячейкой обведенной жирной рамкой) - " + ActiveRow(), 48, "Информмация")
End Sub

Function ActiveRow(Optional iSheet As Long, Optional oDoc As Variant) As Long
Dim arrayOfString() ' Массив текстовых строк для парсинга
Dim tmpString$ ' Временная строка
Dim oCurrentController ' Контроллер анализируемого документа
Dim oSheets As Variant ' Все листы текущей книги
Dim oSheet As Variant ' Активный (анализируемый) лист книги
REM Проверить входные параметры и установить значения по умолчанию:
If IsMissing(oDoc) Then oDoc = ThisComponent
If NOT oDoc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then Exit Function
oCurrentController = oDoc.getCurrentController()
If IsMissing(iSheet) Then
oSheet = oCurrentController.getActiveSheet()
iSheet = oSheet.getRangeAddress().Sheet
Else
If (iSheet < 0) Then Exit Function
oSheets = ThisComponent.getSheets()
If (iSheet >= oSheets.getCount()) Then Exit Function
oSheet = oSheets.getByIndex(iSheet)
EndIf
tmpString = oCurrentController.getViewData()
arrayOfString() = Split(tmpString, ";")
If UBound(arrayOfString) < (3 + iSheet) Then Exit Function
tmpString = arrayOfString(3 + iSheet)
If InStr(tmpString,"+") > 0 Then
arrayOfString() = Split(tmpString, "+")
Else
arrayOfString() = Split(tmpString, "/")
EndIf
ActiveRow = CLng(arrayOfString(1)) + 1
End Function
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

Макрос отлично справился со своей задачей, пристроил работает! Спасибо!

А как насчёт макроса который бы присваивал переменной имя активного листа?


Nikem79

Попутно ещё понадобится замена столбцов в листе, чтоли...

JohnSUN

Цитата: Nikem79 от 18 июля 2012, 13:46А как насчёт макроса который бы присваивал переменной имя активного листа?
Как два байта переслать:
Function NameActiveSheet() As String
Dim oCurrentController As Variant
Dim oActiveSheet As Variant
oCurrentController = ThisComponent.getCurrentController()
oActiveSheet = oCurrentController.getActiveSheet()
NameActiveSheet = oActiveSheet.getName()
End Function
Или (если лень много писать)
Function NamActSh() As String
NamActSh = ThisComponent.getCurrentController().getActiveSheet().getName()
End Function
Цитата: Nikem79 от 18 июля 2012, 14:02
Попутно ещё понадобится замена столбцов в листе, чтоли...
Замена на что?
Старайся не сыпать кучу разных вопросов в одну тему. А то ведь тема про выделенную строку, а вопросы и про лист, и про столбцы
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

Обалдеть, работает!

Function NamActSh() As String
NamActSh = ThisComponent.getCurrentController().getActiveSheet().getName()
End Function


JohnSUN как ты это делаешь?! )))

По поводу разности тем, да, создам новую, спасибо за замечание