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

Автор Донченко Валерий, 6 августа 2015, 15:56

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

Донченко Валерий

Подскажите пожалуйста, может ли кто перевести код VBA в код OpenOffice Basic? К сожалению, в программировании не силен. Нашел удачный, на мой взгляд, вариант на VBA. На форуме тема обсуждалась достаточно давно (Февраль 2012 года), поэтому создал свою тему.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim WorkRange As Range
   Dim wi As Window
   Set wi = ActiveWindow
   If Target.Cells.Count > 1 Then Exit Sub  'если выделено больше 1 ячейки - выходим'
   Application.ScreenUpdating = False
   Set WorkRange = wi.VisibleRange 'адрес рабочего диапазона, в пределах которого видно выделение'
   Intersect(WorkRange, Target.EntireRow).Select   'формируем строку диапазон и выделяем'
   Intersect(WorkRange, Union(Target.EntireRow, Target.EntireColumn)).Select 'формируем крестообразный диапазон и выделяем'
   Target.Activate
End Sub

rami

Цитата: Донченко Валерий от  6 августа 2015, 13:56может ли кто перевести код VBA в код OpenOffice Basic?
Сам макрос в LibreOffice/Apache OpenOffice не работает, но его аналог можно сделать. Вот, например:

Донченко Валерий

Цитата: rami от  6 августа 2015, 21:28Сам макрос в LibreOffice/Apache OpenOffice не работает, но его аналог можно сделать.
Я как раз это и имел в виду. Спаибо за предложенный вариант. Но вариант на VBA, без кнопок "Включить" и "Выключить" и координатное выделение самостоятельно обновляется при "перемещении" активной ячейки стрелками на клавиатуре.

rami

Если без кнопок, то будет действовать постоянно, мешая редактировать. А какие действия вам нужно выполнять?

Донченко Валерий

Работать с большими таблицами. Вместо линейки  :)

rami

Цитата: rami от  6 августа 2015, 22:22Работать с большими таблицами. Вместо линейки
Просто "разглядывать" большую таблицу или редактировать. Попробуйте поработать с включенной кнопкой, если не будет мешать, то я уберу кнопки.

Донченко Валерий

"Разглядывать" и при необходимости редактировать. С включенной кнопкой активная ячейка не "перемещается" стрелками на клавиатуре.

rami

Цитата: Донченко Валерий от  6 августа 2015, 22:42С включенной кнопкой активная ячейка не "перемещается" стрелками на клавиатуре.
Сама ячейка перемещается стрелками, а выделение нет. Вам нужно чтобы выделение смещалось только стрелками?

Донченко Валерий

Цитата: rami от  6 августа 2015, 22:49Сама ячейка перемещается стрелками, а выделение нет.
Ни ячейка, ни выделение не перемещаются при включенной кнопке. А во время редактирования данных в таблице, в выделении нет необходимости.

rami

Цитата: Донченко Валерий от  6 августа 2015, 22:56Ни ячейка, ни выделение не перемещаются при включенной кнопке. А во время редактирования данных в таблице, в выделении нет необходимости.
У меня работает нормально на разных офисах. Нужно нажать кнопку включить и "тыкать" мышкой в ячейки, если смещать ячейку стрелками, то выделение исчезает

Hasim


rami

Цитата: Hasim от  7 августа 2015, 21:44Как вариант:
Во-первых стирает фоны ячеек и не подходит для таблиц с цветными ячейками.
Во-вторых мельтешит в LibreOffice, в Apache OpenOffice нормально.

Универсального решения нет и в зависимости от условий можно предложить несколько разных вариантов каждый из которых будет иметь какие-то недостатки.

Донченко Валерий

Первоначальный вариант устраивает:

Global oDocView, oMouseClickHandler
Sub RegisterMouseClickHandler
oDocView=ThisComponent.currentController
oMouseClickHandler=createUnoListener("MyApp_","com.sun.star.awt.XMouseClickHandler")
oDocView.addMouseClickHandler(oMouseClickHandler)
End Sub

Sub UnregisterMouseClickHandler
oDocView.removeMouseClickHandler(oMouseClickHandler)
End Sub

Sub MyApp_disposing
End Sub

Function MyApp_mousePressed(oEvt) As Boolean
MyApp_mousePressed=False
End Function

Function MyApp_mouseReleased(oEvt) As Boolean
MyApp_mouseReleased=False
on error resume next
oCell=ThisComponent.CurrentSelection
oRanges=ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
oCol=oCell.Columns.getByIndex(0).RangeAddress
oRow=oCell.Rows.getByIndex(0).RangeAddress
oRanges.addRangeAddresses(Array(oCell.RangeAddress,oCol,oRow),False)
ThisComponent.CurrentController.select(oRanges)
End Function


Sub Macro1

End Sub

После запуска RegisterMouseClickHandler макрос делает, то что требуется. Но можно ли поправить код таким образом, чтобы выделение не пропадало при "перемещении" активной ячейки стрелками на клавиатуре?

rami

Цитата: Донченко Валерий от 14 августа 2015, 20:10Но можно ли поправить код таким образом, чтобы выделение не пропадало при "перемещении" активной ячейки стрелками на клавиатуре?
Нет, перемещение активной ячейки всегда снимает выделение

Hasim

Цитата: rami от  7 августа 2015, 22:11Во-первых стирает фоны ячеек и не подходит для таблиц с цветными ячейками.
Можно сделать так, чтобы не стирало.