Координатное выделение

Автор rodionz, 2 февраля 2012, 17:43

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

rodionz

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

JohnSUN

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

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

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rodionz

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

JohnSUN

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

Hasim

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

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

JohnSUN

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

rodionz

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

Hasim

Нашел макрос, который делает координатное выделение. Как его прицепить к какому-нибудь событию, чтобы он сам запускался при изменении активной ячейки?
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

Да, 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

#9
Цитата: Hasim от  4 февраля 2012, 13:42Как его прицепить к какому-нибудь событию, чтобы он сам запускался при изменении активной ячейки?
Например, вот так - при щелчке мышью на любой ячейке.
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 для слежения за мышью.

RFJ

#10
Цитироватьочень бы хотелось, чтоб строка активной ячейки подсвечивалась
Еще некоторые варианты
Подсвечивание строки с активной ячейкой
Подсвечивание границы строки с активной ячейкой

neft

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

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

Hasim

Цитата: neft от  5 февраля 2012, 11:04Вот так, с линиями, будет лучше всего.
С линиями хорошо. А как так сделать?
Может лучше по линиям сетки, а не по середине строки, а то будет зачеркивать данные в строке?