Список форумов Форум Libreoffice

Форум Libreoffice

Добро пожаловать на Форум Libreoffice!
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

English French German Italian Portuguese Russian Spanish
Адрес активной ячейки при выделении нескольких диапазонов
На страницу Пред.  1, 2
 
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Basic
Предыдущая тема :: Следующая тема  
Автор Сообщение
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Ср Янв 18, 2012 8:16 pm    Заголовок сообщения: Ответить с цитатой

JohnSUN, еще вываливается ошибка при выполнении макроса.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Чт Янв 19, 2012 7:21 am    Заголовок сообщения: Ответить с цитатой

Честное слово, не понимаю что происходит.
Изначально весь код был таким:

Код:
REM Функция для определения активной ячейки
REM Параметры:
REM    iSheet - индекс листа, для которого ищется активная ячейка.
REM            Не обязателен. По умолчанию - активный лист
REM    oDoc - электронная книга, для которой ищется активная ячейка.
REM            Не обязателен. По умолчанию - текущий документ
REM Возвращает ссылку на активную ячейку или Null, если её не удалось определить
REM Автор: Владислав Орлов aka JohnSUN, Украина, Киев, 2012
REM by UROS > http://www.oooforum.org/forum/viewtopic.phtml?t=19348
REM by Villeroy > http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=38672#p177590
Function ActiveCell(Optional iSheet As Long, Optional oDoc As Variant) As Object
Dim arrayOfString()      ' Массив текстовых строк для парсинга
Dim lRow&, lColumn&      ' Координаты искомой ячейки
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
   lColumn = CLng(arrayOfString(0))
   lRow = CLng(arrayOfString(1))
   Set ActiveCell = oSheet.getCellByPosition(lColumn, lRow)
End Function

Именно так и публиковался... И вдруг из текста оказываются вырезаны по две-три строки, код получается неработоспособным. Даже не знаю, на кого грешить...

PS. Понял! Выбрасывается текст между знаками "меньше" и "больше". Он воспринимается как какой-то большой бестолковый тег и просто проглатывается... Редактор самовольничает...
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2


Последний раз редактировалось: JohnSUN (Чт Янв 19, 2012 7:35 am), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Чт Янв 19, 2012 7:32 am    Заголовок сообщения: Ответить с цитатой

Немного разобрался с ViewData. Полученная строка (vd) содержит параметры, описывающие "внешний вид видимой области данных всех листов" (ViewData).
Получаем с помощью такого макроса.
Код:
Sub get_View_Data
oDoc = ThisComponent
vd=oDoc.currentController.getViewData()
MsgBox vd
End Sub


Этот "внешний вид видимой области данных всех листов" можно восстановить или задать таким макросом.
Код:
Sub restore_View_Data
oDoc = ThisComponent
vd="89/60/0;0;tw:270;7/17/1/1/321/151/2/5/13/4/14"
oDoc.currentController.restoreViewData(vd)
End Sub


В данном примере строка ViewData (vd) задается только для одного первого листа, но содержит все параметры (не равны 0).
Некоторые параметры легко понять, а некоторые непонятны.
Так,
89 - масштаб листа 89%,
60 - ?
0 - ?
0 - отображаемый лист (0 - первый),
tw:270 - ?
7/17 - "активная" ячейка H18,
остальные задают параметры видимой области листа, в данном случае - положения четырех окон, на которые разбито основное окно.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Чт Янв 19, 2012 7:52 am    Заголовок сообщения: Ответить с цитатой

Ну, про tw:270 в том же обсуждении ms777 сказал, что это ширина горизонтальной полосы прокрутки.
Жаль, что документации так мало
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Чт Янв 19, 2012 8:50 am    Заголовок сообщения: Всего отзывов: 1 Ответить с цитатой

JohnSUN писал(а):
Ну, про tw:270 в том же обсуждении ms777 сказал, что это ширина горизонтальной полосы прокрутки.

Нет, это ширина области перед горизонтальной полосой прокрутки (области, не занятой горизонтальной полосой прокрутки).
Можете сами проверить.
Вставьте, например, tw:1200.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Nikem79



Репутация: 0    

Зарегистрирован: 13.07.2012
Сообщения: 2

СообщениеДобавлено: Сб Июл 21, 2012 12:12 pm    Заголовок сообщения: Ответить с цитатой

Возвращаясь к теме...

А можно из вышенаписанного извлечь функцию присвоения адреса строк выделенных ячеек. С возможностью выделения черезстрочно.

Например есть таблица, пользователь через контрол выделяет несколько нужных ячеек в ней, жмёт макрос, макрос выдаёт номера всех строк содержащих выделенные ячейки. Rolling Eyes
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Nikem79



Репутация: 0    

Зарегистрирован: 13.07.2012
Сообщения: 2

СообщениеДобавлено: Пн Июл 23, 2012 5:44 am    Заголовок сообщения: Ответить с цитатой

Актуально
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
hasim



Репутация: 0    

Зарегистрирован: 28.05.2012
Сообщения: 32

СообщениеДобавлено: Вт Июл 24, 2012 6:39 pm    Заголовок сообщения: Ответить с цитатой

Nikem79 писал(а):
Например есть таблица, пользователь через контрол выделяет несколько нужных ячеек в ней, жмёт макрос, макрос выдаёт номера всех строк содержащих выделенные ячейки.


Это не тот вопрос, которая обсуждался в этой теме.

И для вашей задачи решение очень простое:

Код:
Sub SelectedCellsRow
Dim NRow(0)

oDoc=ThisComponent

Ncells=oDoc.CurrentSelection.Count

ReDim NRow(Ncells)

For n=0 To Ncells-1
   NRow(n)=oDoc.CurrentSelection(n).CellAddress.Row+1
   MsgBox NRow(n)
Next n

End Sub


PS. Этот макрос для случая, когда через контрол выделяются отдельные одиночные ячейки (а не отдельные диапазоны ячеек).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
neft



Репутация: 0    

Зарегистрирован: 19.10.2011
Сообщения: 28

СообщениеДобавлено: Чт Июл 26, 2012 1:42 pm    Заголовок сообщения: Ответить с цитатой

hasim писал(а):

PS. Этот макрос для случая, когда через контрол выделяются отдельные одиночные ячейки (а не отдельные диапазоны ячеек).


Чтобы можно было работать и с выделяемыми диапазонами ячеек, а не только с одиночными ячейками, нужно заменить .CellAddress на .RangeAddress и находить в каждом выделенном диапазоне начальную строку .StartRow и конечную строку .EndRow. При выделении одиночной ячейкм начальная и конечная строки, естественно, совпадают.

Макрос теперь будет выглядеть таким образом:
Код:
Sub SelectedCellsRow
Dim NStartRow(0)
Dim NEndRow(0)

oDoc=ThisComponent

Ncells=oDoc.CurrentSelection.Count

ReDim NStartRow(Ncells)
ReDim NEndRow(Ncells)

For n=0 To Ncells-1
   NStartRow(n)=oDoc.CurrentSelection(n).RangeAddress.StartRow+1
   NEndRow(n)=oDoc.CurrentSelection(n).RangeAddress.EndRow+1
      MsgBox NStartRow(n) & ":" & NEndRow(n)
Next n

End Sub
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Basic Часовой пояс: GMT
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Вы можете бесплатно создать форум на MyBB2.ru, RSS