Cálculo automático por Macro de fórmula arquivada em célula

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