Pergunte aqui
0

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

perguntadas 2016-05-05 02:27:08 +0200

Esta pergunta esta parecendo cópia de uma anterior porém e mais refinada....

Alo @Grafeno acredito que tenha alguma dica...de novo...

Existe maneira de uma Macro executar automaticamente uma fórmula do Calc escrita (arquivada) em uma célula.

Ou seja a Macro não efetuara o cálculo e sim calculará a fórmula contida em uma célula, seja qual for a fórmula existindo referencias relativas e absolutas, comportando-se igual a cópia de fórmulas.

Grato.

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

Uma macro pode acessar (ler ou escrever) o conteúdo da célula, seja o valor numérico, na forma de string ou até mesmo a expressão da fórmula que está na célula. É isso que você quer?

imagem do gravatar de OlivierOlivier ( 2016-05-05 03:32:11 +0200 )editar

Não entendi muito bem o que você quer. Talvez com uma planilha de exemplo... Mas, pensei no que o Olivier comentou e também no que respondi aqui: Macro procv.

imagem do gravatar de GrafenoGrafeno ( 2016-05-05 16:34:11 +0200 )editar

@Grafeno / @Olivier, com base nesta macro https://ask.libreoffice.org/pt-br/que... (excelente pois não tenho que repetir formula célula por célula), tomando como exemplo o caso da "question/61432", onde o cálculo foi "escrito na Macro", existe alguma possibilidade de uma MACRO executar uma formula que esta em uma célula? Se isto for possível seria ótimo, pois com uma MACRO seria possível executar qualquer comando do Calc. (continua)..

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-06 02:34:35 +0200 )editar

(continuando).. Ou seja nesta MACRO as únicas variáveis seriam a área que ela deve atuar e o endereço da célula que está a formula à executar.

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-06 02:37:15 +0200 )editar

Talvez eu ainda não tenha entendido o que vc quer, mas vou arriscar colocar o que penso: sem "transcrever" a fórmula no próprio código da macro, ela não a "executará". De outro modo, sempre será necessário um método para servir de ponte ente a macro e o Calc, que é quem de fato "executará" a fórmula.

imagem do gravatar de GrafenoGrafeno ( 2016-05-08 17:40:41 +0200 )editar

"[...]seja qual for a fórmula existindo referencias relativas e absolutas, comportando-se igual a cópia de fórmulas." ==> Uma macro que funcione como uma espécie de ctrl+C e ctrl+V da fórmula atenderia seu objetivo? Na célula de destino vc quer a fórmula com as referências ajustadas ou só o valor já processado?

imagem do gravatar de GrafenoGrafeno ( 2016-05-08 17:44:06 +0200 )editar

Oi @Grafeno, sim só o valor. Esclarecendo a necessidade: A intenção é ter uma planilha que execute grande quantidade de formulas, porém não gostaria que estivessem na planilha milhares de células com fórmulas a espera de informações para cálculo. Então, pegando como modelo a Macro da questão 61432, já mencionada, onde foi definida a área de abrangência do evento (coluna A e B) se positiva executa a operação (Ax+Bx) e grava na coluna C correspondente, que funciona perfeitamente OK. (continua...)

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-09 03:08:48 +0200 )editar

(...continuando) A Macro seria semelhante, porém na Macro só teria a informação da abrangência do evento (exemplo: G45:K78) e indicaria na Macro a célula da formula a executar (exemplo: AA2) na qual estaria a formula por exemplo: =SE(G45<>0;PROCV(G45;matriz;Indice;Ordem);""). Desta maneira uma Macro atenderia diversas situações pois a "área de abrangência" e "a célula da formula a executar" seriam facilmente alteráveis nesta Macro, não teria que a cada caso definir o cálculo na Macro.

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-09 03:28:01 +0200 )editar

Oi @Grafeno, pensando bem, poderia até ter a opção de gravar a formula ajustada ou só o valor, ficaria mais completa.

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-09 03:33:51 +0200 )editar

@Gilberto: Se seu objetivo é economizar fórmulas com uma macro, eu sugiro você usar uma fórmula de matriz no intervalo, por que com formula de matriz, temos 1 fórmula que se aplica N células ao invés de N formulas para N células. A redução do tamanho do arquivo e a velocidade do calculo melhoram.

imagem do gravatar de OlivierOlivier ( 2016-05-09 03:45:14 +0200 )editar

3 Respostas

0

respondidas 2016-05-10 19:12:09 +0200

imagem do gravatar de Grafeno

[...] 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

editar assinalar como ofensivo Excluir Link mais
0

respondidas 2016-05-06 17:18:12 +0200

imagem do gravatar de Olivier

Segue o trecho colocando uma formula qualquer na sua célula A1 da Planilha1

oPlanilha  = ThisComponent.Sheets.getByName("Planilha1")
oCell = oPlanilha.getCellRangeByName("A1")
oCell.Formula = "=SIN(PI()*B3/A20)"

Note que a expressão da fórmula tem de ser como se fosse no idioma inglês, sempre. Na célula A1 ela vai aparecer em português.

editar assinalar como ofensivo Excluir Link mais

Comentários

Não quero colocar a formula na célula e sim "ter possibilidade de uma MACRO executar uma FORMULA que esta em uma célula?".

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-06 22:16:05 +0200 )editar

Não é copiar a formula para a célula e sim executar a que esta em uma célula...vide arquivo anexo com a macro escrita por @Grafeno com exemplo básico, observações no arquivo...

https://dl.dropboxusercontent.com/u/1...

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-06 22:55:32 +0200 )editar

Pode explicar por que precisa de uma macro para fazer a soma de dois números em colunas diferentes? Não ficou v

imagem do gravatar de OlivierOlivier ( 2016-05-07 01:54:25 +0200 )editar

Como disse acima "exemplo básico" a pergunta é simples: É possível uma macro executar a FORMULA, seja qual for, que esteja inserida em uma célula?

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-07 02:10:44 +0200 )editar

Penso, só penso! Uma fórmula tem o sinal "=" (sinal de igual) para valer. Então, se a macro, sob determinada condição substituir uma sequência de caracteres pelo sinal de "=" irá "disparar a fórmula. Ou seja, acredito que sim. Tudo depende mais de como tratar o evento, ou seja: em que situação isso ocorreria.

imagem do gravatar de BetoBeto ( 2016-05-07 03:34:42 +0200 )editar
0

respondidas 2016-05-07 13:45:50 +0200

imagem do gravatar de Beto

updated 2016-05-07 15:12:41 +0200

Gilberto, Isso é o que você quer: a diferença que você atinge por concatenação de células o que a torna extremamente versátil, no meu ponto de vista. Resposta/colaboração do Olivier

Na prática seria isso que pensei: Um exemplo de uso da funcao BETO ;) criada pelo Olivier para baixar

editar assinalar como ofensivo Excluir Link mais

Comentários

Um vídeo e um texto: Meu blog

imagem do gravatar de BetoBeto ( 2016-05-07 15:21:36 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2016-05-05 02:27:08 +0200

Lidas: 1,794 vezes

Última atualização: May 10 '16