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

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

22 Март 2019, 11:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Сообщений: 12


« Стартовое сообщение: 2 Февраль 2012, 16:43 »

Здравствуйте!
Работаю много с таблицами, очень бы хотелось, чтоб строка активной ячейки подсвечивалась. Как это реализовать в калк? Решение в ексел - http://www.planetaexcel.ru/tip.php?aid=61.
Спасибо
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #1: 2 Февраль 2012, 17:43 »

Ну, так как они и рекомендуют - макросом и условным форматированием.

Если не нравятся красные полоски в качестве указателей, достаточно изменить стили пользователя, которые начинаются со слова target

[вложение удалено Администратором]
« Последнее редактирование: 2 Февраль 2012, 17:45 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rodionz
Участник
**
Offline Offline

Сообщений: 12


« Ответ #2: 2 Февраль 2012, 18:34 »

В том и проблема, скопировал себе макрос с той темы - он выдает ошибку.
В условном форматировании такая формула должна стоять "OR(CELL("row")=ROW(G19),CELL("col")=col(G19))"? где G19 - активная ячейка.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #3: 2 Февраль 2012, 18:50 »

Да нет, не обязательно именно такая формула...
Я приложил файл, в котором решение использует эту идею - макрос+условный формат, но сам формат другой.
Макрос для ячеек, которые "указывают" на активную, вписывает "принудительное" форматирование - выставляет условие в заведомую "Истина", просто вписывает ненулевое число. Calc'у остается только отрисовать заданные стили для этих ячеек.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754


Woe from wit


« Ответ #4: 2 Февраль 2012, 18:54 »

Если перемещать стрелками то вот такая нехорошая картинка

[вложение удалено Администратором]
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #5: 2 Февраль 2012, 19:05 »

Да, что есть - то есть. Подтормаживают офисы  на отрисовке (и ООо, и LiO)...
Возможно, есть способ быстрее и аккуратнее.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rodionz
Участник
**
Offline Offline

Сообщений: 12


« Ответ #6: 4 Февраль 2012, 05:53 »

Спасибо, JohnSUN, за старания, но для меня это пока слишком сложно, буду искать другие пути. Может выделение таблицы аля "зебра". Вообщем ожидал легкое решение, какой-нибудь макрос в пару строчек, чтоб потом легко можно перенести его на рабочие доки)
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754


Woe from wit


« Ответ #7: 4 Февраль 2012, 13:42 »

Нашел макрос, который делает координатное выделение. Как его прицепить к какому-нибудь событию, чтобы он сам запускался при изменении активной ячейки?
Код:
Sub SelectRowsColumns
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oColumns = oSheet.getColumns()
  oRows= oSheet.getRows()

For c=2 To 5
For r=2 To 5
  oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
oRangeAddress1 = CreateObject("com.sun.star.table.CellRangeAddress")
  oRangeAddress1.Sheet = 0
  oRangeAddress1.StartColumn = c
  oRangeAddress1.EndColumn =c
  oRangeAddress1.StartRow = r
  oRangeAddress1.EndRow = r
 
  oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
oRangeAddress2=oColumns.getByIndex(c).getRangeAddress()

  oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
oRangeAddress3=oRows.getByIndex(r).getRangeAddress()

  oRanges.addRangeAddresses(Array(oRangeAddress1, oRangeAddress2, oRangeAddress3), False)

  ThisComponent.getCurrentController().select(oRanges)

  MsgBox c & " - " & r

Next r
Next c

End Sub


[вложение удалено Администратором]
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #8: 4 Февраль 2012, 18:56 »

Да, Hasim, круто...
Самое удивительно, что решение четко соответствует названию темы - это действительно "координатное выделение".

Но есть несколько замечаний.
1. Что за макрос, откуда такое чудо? Сам по себе он для решения поставленной задачи не годится - последовательно "подсвечивает" (на самом деле - реально выделяет) крест ячеек в диапазоне C3:F6, а не текущую ячейку. Да и лишних операторов много... Я бы записал это так:
Код:
Sub SelectCurRowsColumns
Dim oColumns ' Все колонки текущей ячейки (на самом деле одна единственная)
Dim oRows ' Её же строки (одна)
Dim oCell ' Сама активная ячейка
Dim oRanges, oCellRng, oRowRng, oColRng ' Список диапазонов для выделения и его составные части
oCell = ActiveCell() ' Получить активную ячейку
REM Текст функции здесь http://wmstrong.ru/index.php/home/2011-04-02-21-00-40/starbasic/25-activecell.html
oColumns = oCell.getColumns()
oColRng = oColumns.getByIndex(0).getRangeAddress()
oRows = oCell.getRows()
oRowRng = oRows.getByIndex(0).getRangeAddress()
REM Здесь трюк, связанный с копированием структур, описанный у Питоньяка:
REM копируется не ссылка на структуру, как это случилось бы с массивом, а вся структура целиком
oCellRng = oRowRng
REM Остается заменить только два поля, связанных с номером колонки
oCellRng.StartColumn = oCell.getCellAddress().Column
oCellRng.EndColumn = oCellRng.StartColumn
oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
oRanges.addRangeAddresses(Array(oCellRng, oRowRng, oColRng), False)
ThisComponent.getCurrentController().select(oRanges)
End Sub
2. В результате выполнения мы получим "множественное выделение", которое
а) пропадет, как только попытаемся выделить что-то другое;
б) не позволит скопировать при необходимости содержимое текущей ячейки;
в) будет уничтожать любое предварительное ручное выделение при повтором вызове макроса.
Поэтому, навешивать этот макрос на событие, наверное, не стоит. А вот отдельную кнопку на панели инструментов для него сделать можно: нажал кнопку, покрутил лист вправо-влево, вверх-вниз и видишь где относительно активной ячейки находишься. Кликнул мышкой другую ячейку - выделение пропало и работаешь как с обычной таблицей.
Есть еще один недостаток такого решения. На рисунке.

[вложение удалено Администратором]
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
neft
Форумчанин
***
Offline Offline

Сообщений: 189


« Ответ #9: 4 Февраль 2012, 22:36 »

Как его прицепить к какому-нибудь событию, чтобы он сам запускался при изменении активной ячейки?
Например, вот так - при щелчке мышью на любой ячейке.
Код:
Global oDocView As Object
Global oMouseClickHandler As Object

Sub RegisterMouseClickHandler
  oDocView = ThisComponent.currentController
  oMouseClickHandler = _
  createUnoListener("MyApp_", "com.sun.star.awt.XMouseClickHandler")
  oDocView.addMouseClickHandler(oMouseClickHandler)
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub UnregisterMouseClickHandler
  on error resume next
  oDocView.removeMouseClickHandler(oMouseClickHandler)
  on error goto 0
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MyApp_disposing(oEvt)
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MyApp_mousePressed(oEvt) As Boolean
  MyApp_mousePressed = False
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MyApp_mouseReleased(oEvt) As Boolean
if oEvt.ClickCount >= 1 then
SelectCurRowsColumns '<== Макрос JohnSUN'a
end if
MyApp_mouseReleased = False
End Function

Естественно, сначала запускается макрос RegisterMouseClickHandler для слежения за мышью.
« Последнее редактирование: 4 Февраль 2012, 22:41 от neft » Записан
RFJ
Форумчанин
***
Offline Offline

Сообщений: 220


« Ответ #10: 5 Февраль 2012, 10:25 »

Цитата:
очень бы хотелось, чтоб строка активной ячейки подсвечивалась
Еще некоторые варианты
Подсвечивание строки с активной ячейкой
Подсвечивание границы строки с активной ячейкой
« Последнее редактирование: 5 Февраль 2012, 13:15 от RFJ » Записан

neft
Форумчанин
***
Offline Offline

Сообщений: 189


« Ответ #11: 5 Февраль 2012, 11:04 »

Вот так, с линиями, будет лучше всего.

[вложение удалено Администратором]
« Последнее редактирование: 5 Февраль 2012, 13:23 от neft » Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754


Woe from wit


« Ответ #12: 5 Февраль 2012, 19:08 »

Вот так, с линиями, будет лучше всего.
С линиями хорошо. А как так сделать?
Может лучше по линиям сетки, а не по середине строки, а то будет зачеркивать данные в строке?
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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