Um vídeo e um texto: Meu blog
[…] pensando bem, poderia até ter a opção de gravar a formula ajustada ou só o valor, ficaria mais completa.
Adaptei o código da outra resposta para incluir uma chamada (Call) a uma sub-rotina (InserirValorFormula) que copia a fórmula da célula “C1” e cola (ajustando as referências) na célula “Cn”, onde “n” é a linha do evento que dispara a marcro principal. A sub-rotina ainda faz a “conversão” da fórmula de “Cn” em seu valor.
REM >>> Evento de Planilha => Conteúdo Alterado <<<
Sub Plan1_ConteudoAlterado( oCelula )
Dim oPlan as Object, oControl As Object
Dim oCelFor As Object, oDestino As Object
Dim nLin as Long, nCol as Long
Dim vCel As Double, vCelA As Double, vCelB As Double
' Sair se não for uma célula
If oCelula.ImplementationName <> "ScCellObj" Then Exit Sub
nLin = oCelula.CellAddress.Row
nCol = oCelula.CellAddress.Column
vCel = oCelula.Value
oPlan = oCelula.getSpreadsheet
' Sair se a cél. estiver na linha 1 ou
' se o valor da cél. for 0
If vCel = 0 or nLin = 0 Then Exit Sub
' Controlador e a célula com a fórmula
oControl = ThisComponent.CurrentController
oCelFor = oPlan.getCellRangeByName( "C1" )
' Verificar se a cél. está na col. A
If nCol = 0 Then
vCelB = oPlan.getCellByPosition( 1,nLin ).Value
' Inserir o ValorFormula na col. C se a col. B não estiver vazia
If vCelB <> 0 Then
oDestino = oPlan.getCellByPosition( 2,nLin )
Call InserirValorFormula(oControl, oCelFor, oDestino )
oControl.Select( oCelula )
End Sub
End If
' Verificar se a cél. está na col. B
If nCol = 1 Then
vCelA = oPlan.getCellByPosition( 0,nLin ).Value
' Inserir o ValorFormula na col. C se a col. A não estiver vazia
If vCelA <> 0 Then
oDestino = oPlan.getCellByPosition( 2,nLin )
Call InserirValorFormula(oControl, oCelFor, oDestino )
oControl.Select( oCelula ) ' Fica
End Sub
End If
End Sub
Sub InserirValorFormula (oControlador, oCelFormula, oCelDestino)
' Copiar e colar a fórmula
oControlador.Select( oCelFormula )
oFormula = oControlador.getTransferable()
oControlador.Select( oCelDestino )
oControlador.insertTransferable( oFormula )
'Apagar o formato da célula que veio com a fórmula
oCelDestino.clearContents( 32 )
' Converter a fórmula em valor na célula
' Exclua ou comente as duas linhas abaixo para que na célula
' fique a fórmula
v = oCelDestino.Value
oCelDestino.Value = v
End Sub
Acredito que seja o mais próximo que posso chegar do que você pretente.
Atte,
Grafeno
1 Like