Destacar a linha da célula selecionada

Olá, Pessoal!

Estou tentando no Calc um código para destacar só a linha da célula selecionada, limitada à tabela: A6 a J2400, protegida sem senha e conservando a formatação dessa tabela.

.

Grato pela atenção!

Orlando Souza

Seguem códigos para inserir no “Module1”, exclusivo, do Basic (Alt+F11), depois atribuir a ação DestacarEventos na opção Seleção alterada (em Planilha->Eventos de planilha…):

Sub DestacarEventos
DestacarX()
end sub

Sub DestacarX(Optional nClasse, Optional Back As Integer)

Dim Altura
Dim DDestac
Dim ETQ As String
Dim i As Integer
Dim LinhaSel
Dim Largura
Dim oControlador As Object
Dim oCursor As Object
Dim oDib As Object
Dim oDoc As Object
Dim oDP As Object
Dim oSel As Object
Dim pos
Dim shape1 As Object
Dim size

ETQ= "BarraDestacar"
If IsMissing(Back) Then Back = 2 

oDoc = ThisComponent
oControlador = oDoc.CurrentController
oSel = oControlador.Selection

If Not (oSel.ImplementationName = "ScCellObj") Then
	GoTo Fin
End If

oDP = oSel.getSpreadSheet().getDrawPage()

LinhaSel = oSel.getRangeAddress.StartRow

If IsMissing(nClasse) or nClasse="" Then
	oCursor = oSel.getSpreadSheet.createCursorByRange(oSel)
	oCursor.gotoEndOfUsedArea( False )
 	nClasse= Replace(oCursor.AbsoluteName, ".",  ".A6:")		'começar na linha 6
End If
DDestac = oControlador.ActiveSheet.getCellRangeByName(nClasse)		
If LinhaSel > DDestac.getRangeAddress.EndRow Or LinhaSel < DDestac.getRangeAddress.StartRow Then
	For i= (oDP.getCount - 1) To 0 Step -1
		oDib = oDP.getByIndex(i)
		If oDib.Name = ETQ & "Linha" Then
			oDP.Remove(oDib)
		End If
	Next
	GoTo Fin
Else
	For i= (oDP.getCount - 1) To 0 Step -1
		oDib = oDP.getByIndex(i)
		If oDib.Name = ETQ & "Linha" Then
			GoTo Seguir
		End If
	Next
Dim oForma As Object
Dim oTam As New com.sun.star.awt.Size
	For i=0 To 1

	     oTam.Width= 5000 - (4700*i)
	     oTam.Height= 300 + (4700*i)
		oForma = ThisComponent.createInstance("com.sun.star.drawing.RectangleShape")
		With oForma
			If i=1 Then 
				.Name = ETQ & "Linha"
			End If
			.setSize (oTam)	
			.MoveProtect = True
			.LineStyle = com.sun.star.drawing.LineStyle.NONE
			.FillColor = RGB( 75,75,75 ) 'cor
			.FillTransparence = 85		 'transparência em %
			.LayerID = Back
			.ZOrder = 0
		End With
	     oDP.Add(oForma)
	Next
End If

Seguir:
oCursor = DDestac.getSpreadSheet.createCursorByRange(DDestac)
Largura = oCursor.Size.Width
Altura = oCursor.Size.Height	
oCursor.gotoEndOfUsedArea(False)

Dim index1 As Integer 
For i=0 To oDP.getCount - 1
	oDib = oDP.getByIndex(i)
	If  oDib.Name  = ETQ & "Linha" Then
		index1 = i
	End If
Next

shape1 = oDP.getByIndex(index1) 

pos = oSel.Position
size = oSel.Size
size.Width = Largura

pos.X = DDestac.Position.X
shape1.setPosition(pos)
shape1.setSize(size)

pos = oSel.Position
size = oSel.Size	
size.Height = Altura

Fin:
Exit Sub

End Sub

Fonte: Fóruns da comunidade Apache OpenOffice (e LibreOffice)

Ps: O destaque na linha aparecerá entre a col A e a última usada.

Ola @Orlando, parabéns pela divulgação, será muito útil.

Mas estou testando em Win10+LibO6.4.5.2 e esta aparecendo esta imagem, mesmo que limpo e salvo volta aparecer.

Descrição da imagem

São várias, ficam sobrepostas.

Oi, @schiavinatto

Eu vou comparar com o arquivo original: ResaltadoDeFilaColumaPruebas,
localizado na origem de Fonte informada no final da minha resposta.

Tudo indica que exclui o comando correspondente, quando tirei o destaque em colunas.

@Orlando, a dimensão da imagem e 5, x 0,3, esta dimensão aparece a partir da linha 64 da macro.

A macro não muda o fundo e sim coloca uma mascara semi transparente por cima, interessante…

Abraço.

@Orlando, de uma olhada na Plan2 e macros Module2.

A macro é só para lançar o numero da linha ativa em A1 e voltar para a célula de origem.

A cor é por validação, com base na célula A1.

Arquivo teste

É necessário clique duplo.

Ola @Orlando, @Conras, @WBastos

Uma sugestão bem simples, (usando uma pequena Macro, Formatação condicional e uma célula Base) para destacar Linha e Coluna ( ou só linha ou só coluna, alterando a Formatação Condicional)

Segue arquivo do exemplo.

Um adendo a sugestão acima, 4 opções de uso:

* Linha e Coluna destacada,

* Só a Linha destacada,

* Só a Coluna destacada,

* Só a Célula destacada.

DESTAQUE DE LINHA COLUNA CELULA.ods (13.1 KB)

@schiavinatto, sua contribuição mais uma vez foi muito útil.
Parabéns por sua dedicação!!

@Orlando

Segue o código corrigido e com explicações (rem) sobre as linhas de comando:

Option Explicit

Sub ResaltarSeleccion()
Dim oDoc As Object
Dim oControlador As Object
Dim oSel As Object
Dim oRango As Object
Dim oRango1 As Object
Dim oRango2 As Object
Dim oColunaInicio, oColunaFim, oLinhaInicio, oLinhaFim as Long
Dim Coluna, Linha as Long
Dim sPassword as String	
	
	oDoc = ThisComponent
	oControlador = oDoc.CurrentController
	oSel = oControlador.Selection
	
	rem Aqui você irá informar o tamanho da sua tabela. Coluna A = 0, Linha 1 = 0
	oColunaInicio = 0
	oColunaFim = 9
	oLinhaInicio = 5
	oLinhaFim = 2399
	
	rem Aqui coloque a senha da planilha 
	sPassword = ""
	
	If oSel.ImplementationName = "ScCellObj" Then
		oRango = oControlador.getVisibleRange
		
		rem Aqui é colocado o número da coluna e da linha selecionada
		Coluna = oSel.CellAddress.Column
		Linha = oSel.CellAddress.Row
		
		rem Rango1 ativa a formatação para Linha
		oRango1 = oSel.SpreadSheet.getCellRangeByPosition( oSel.CellAddress.Column, oLinhaInicio, oSel.CellAddress.Column, oLinhaFim )
		rem Rango2 ativa a formatação para Coluna
		oRango2 = oSel.SpreadSheet.getCellRangeByPosition( oColunaInicio, oSel.CellAddress.Row, oColunaFim, oSel.CellAddress.Row )
		oRango = oSel.SpreadSheet.createCursor()
		rem desativa a planilha com a senha
		oControlador.getActiveSheet.unprotect(sPassword)
		rem Reseta a Formatação
		oRango.CellStyle = "Default"
		
		rem Aplica a formatação desde que a célula selecionada esteja dentro do tamanho da tabela indicada
		if Coluna >= oColunaInicio and Coluna <= oColunaFim and Linha >= oLinhaInicio and Linha <= oLinhaFim Then
			oRango1.CellStyle = "Resaltado"
			oRango2.CellStyle = "Resaltado"
		End If
		
		rem ativa a planilha com a senha
		oControlador.getActiveSheet.protect(sPassword)
	End If

End Sub

Para manter a sua formatação, antes de mais nada, precisa criar as formatações no Calc.

Para criar as formatações, faça o seguinte:

1- F11 (Gerenciar Estilos)

2 - Em estilos de Célula, clique com o botão direito na área branca

3 - Clique em Novo ou Modificar o Estilo selecionado

4 - Dê um nome ao estilho (será utilizado na macro), e formate ao seu gosto

bom dia, @Conras!

sua sugestão destaca a coluna e não conserva a formatação na tabela, como segue:

@Orlando, para que sua formatação permaneça, como eu havia informado na reposta, você precisa criar um Estilo com a formatação utilizada e vincular à macro (substituir o “Default” pelo estilo criado. Apenas dessa forma a formatação se manterá na sua planilha, destacando a linha.

Oi, @Conras

Refiz o passo-passo na sua resposta e o resultado continua igual à planilha-modelo
que eu anexei no comentário anterior.

Obrigado!

Não sei se é exatamente isto que você precisa, mas vou deixar uma macro que fiz para destacar a linha selecionada. É uma pena que o LO Calc não tenha a opção de adicionar eventos com um clique na célula sem ser via macro, mas depois vou estudar sobre o assunto. Por enquanto tem que dar duplo clique. Teste duplo clique na tabela e fora da tabela para ver como funciona.

Option Explicit
'----------------------------------------
Public oPlan	As Object 
Public oCel		As Object
Public lSel		As Integer  
'-------------------------------------------------
'Insere o valor da célula selecionada na célula i1
'-------------------------------------------------
Public Sub SelecionaCelula
	oPlan = ThisComponent.Sheets(0)
	oCel = ThisComponent.getCurrentSelection()
	lSel = oCel.getRangeAddress.startRow 
	
	oPlan.getCellRangeByName("i1").Value = lSel + 1
End Sub

PlanilhaExemplo

Em tempo, o restante é com formatação condição com a seguinte condição aplicada a sua tabela:

A fórmula é: $I$1=LINHA()