Função chama macro ...
 
Notifications
Clear all

Função chama macro que altera planilha

9 Posts
3 Usuários
0 Reactions
1,066 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Bem,
tentei uma ideia que não deu certo

sei que funções não executam mudanças na planilha pq iria virar um loop demorado

como funções retornam oq se programa, tipo resultados de formulas ou se ranges
não se precisa fixa em células especificas

mas minha ideia é que a função somente chamaria a macro que executaria mudança na planilha com uma situação especifica ou comando direto
Ex.
tenho 3 funções na planilha que varre 3 ranges diferentes e dinâmicas por formulas
a função é a mesma,
as formulas estão em áreas diferentes da planilha,
Para ser VERDADEIRO e executar a macro uma tem que ser "SIM" a outra "NAO" e a outra tem que ter um valor especifico.
para executar a macro poderia ser por botão que ativaria a chamada da sub ou automático quando se atingisse os quesitos das formulas.

não sei se isso é possível, tentei chamar uma macro de dentro de uma função mas não consegui nada...

se alguém tiver uma ideia a respeito

até

 
Postado : 29/07/2014 2:37 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

o pior que para piorar funções não fazer atribuições de variaveis publicas

até chama um msgbox se tiver um valor especifico tipo um "OK"
mas se colocar uma variavel nem aparece a caixa de msg

não entendi para que tanta limitação
besteira se faz até com um simples loop for next

o pessoal fala que para a boa programação se deve usar isso fazer aquilo e não usar aquilo outro
tipo o goto e gosub li um bocado de blog e tutoriais que repudiam o uso deles
mas como disse, besteira se faz com qualquer coisa se não se estruturar bem o código.

agora essa com funções, bloquearam tudo que não fosse para retomar valores

...

 
Postado : 29/07/2014 3:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Como você está declarando essa variável pública?
E sim, funções em VBA qdo disparadas por uma celula, as UDF, não fazem alteração nenhuma em nenhuma celula, nem ela, nem outras...
Mesmo q vc tente enganar o Excel, ele sabe que o q disparou aquele tempo de execução foi uma celula. Então não vai funcionar (acredite, já testei isso a fundo)...
Função por definição, retorna valor. Lembra?
f(x) =x+1

Mesmo assim fazemos atrocidades com as funções... Mas se uma celula a disparar, o comportamento pode ser diferente, como vc já viu.

*eu *acreditaria no q dizem, qdo falam: não faça isso, não faça aquilo, rs, é que normalmente há uma boa razão por trás...

 
Postado : 29/07/2014 5:47 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Bem,
particularmente não uso funções na minha planilha, acho que o troca troca de informação com o vba deixa a planilha pesada,
mas em uma situação de comparar valores de tabelas dinâmicas para transporte dos mesmo caso atingissem certa situação viria a calhar.
--------------------------------------------------------------------------------------------------------------------
uma boa razão para um não usar, pode ser uma ótima solução para outros outros usarem.

coisas que todo mundo usa só pq falam ser o ideal, em mãos despreparadas pode levar ao caos
acredito que a melhor ferramenta é aquela que sabemos usar sendo conveniente ou não

sabe aquela rotina que falei que tá com centenas de linhas?
tentei usar outras soluções, mas não achei algo que coubesse em meus conhecimentos
então usei gosub para fazer loop.

       For w = 1 To K
        'Origem --( Leitura )--
        If Op = 0 Then GoSub OCoL: If t = 1 Then t = 0: GoSub OLin
        If Op = 1 Then GoSub OLin: If t = 1 Then t = 0: GoSub OCoL
        Ddo = Cells(Loi, Coi).Value2    '= w
        FiltroValor
        'Destino --(Escrita )--
        If Dp = 0 Then GoSub DCoL: If t = 1 Then t = 0: GoSub DLin
        If Dp = 1 Then GoSub DLin: If t = 1 Then t = 0: GoSub DCoL
        Cells(Ldi, Cdi).Value2 = Ddo
    Next
    GoTo Final

...
...
OLin:
...
...
    If Op = 1 Then
        t = 0: Loi = Loi + Lig
        If OZig_L = False Then
            If Loi = OLf Then
                t = 1
                If Oquadante_L = True Then GoSub OCoL: If t = 1 Then OLf = OLf + OqL: OLi = OLi + OqL: t = 0
                Loi = OLi + Lig
            End If
        Else
            If Ldi = OLi Or Loi = DLf Then
                t = 1
                If Oquadante_L = True Then GoSub DCoL: If t = 1 Then OLf = OLf + DqL: OLi = OLi + DqL: t = 0: Loi = Loi + OqL
                Lig = Zig * -1: Ldi = Loi + Lig
            End If
        End If
    End If
    Return
...

Como pode ve, criei um loop condicionado com gosub

eu não tinha conhecimentos de outras ferramentas,
se fosse deixar de usar pq outros falam para não usar, ou eu estaria com uma macro com mais de 1200 linhas para cobrir todas a situações, ou não faria a macro.

A não ser que se tenha um bom motivo operacional para não usar, Tipo "instabilidade",
mas por simples questão de lógica não é um bom argumento

Claro que eu estou falando em termo de programação " não vou beber veneno só de pirraça :P "

acho que vc teve a mesma ideia que eu

(acredite, já testei isso a fundo)...

" A mico bobeou nesse quesito, era pra ter implementado a possibilidade e deixado os programadores decidirem se vale a pena usar ou não"

att.

 
Postado : 29/07/2014 6:35 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Como você está declarando essa variável pública?

Public Suo As Variant
no escopo do modulo

tentei gravar o valor do retorno da função na variavel para usar em uma macro posteriormente
mas a variavel sai da função sem atributos.

 
Postado : 29/07/2014 7:06 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Assim, não é aquela maravilha, mas essa gambiarra que eu fiz pega o endereço da célula que contém a função UDF em uma variável que vai ser usada pelo evento calculate da planilha. Esse evento usa a variável para ver o resultado da UDF, e com base nele chama uma macro específica.

Vai que ajuda...

 
Postado : 29/07/2014 8:51 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

gtsalikis

eu tinha pensado numa solução parecida com event change
mas a sua é muito mais pratica

será que com isso consigo fazer a planilha decidir por conta propria dependendo dos valores se executa as macros requeridas sem pesar na performance?

 
Postado : 29/07/2014 9:11 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Olha, na verdade, eu fiz esse exemplo, mas não consegui visualizar um uso prático para ele. Dependendo do que vc fizer, poderia usar apenas o evento calculate, sem precisar da UDF.

Por outro lado, quando vc fala em "sem pesar na performance", está se referindo ao uso dos eventos? Se for, eu acho (isso mesmo, é só achismo), que vai depender muito do que vc projetar na planilha. Um evento selection_change vai disparar bem mais vezes que o change, e o calculate normalmente dispararia ainda menos, mas, se vc tiver uma função volátil, o calculate e o change vão disparar na mesma proporção.

 
Postado : 29/07/2014 9:43 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

ainda vou precisar analisar a estrutura de funcionamento
fui executar aqui e a acabou escrevendo verdade em todas as planilhas abertas

a minha ideia é a função retornar a range onde certa condição é dita como verdadeira
então a macro executa em cima dessa range

Ex. uma coluna onde valores são adicionados constantemente,
a função varre somando esses valores se atingir a meta, os valores são transportados para outra coluna ou planilha

o ideal seria a função fazer chamada de macro diretamente passando os valores diretamente
assim se poderia fazer funções de automação personalizadas,
tipo,
se escreveria uma formula que nela mesmo se teria a (regra de execução) a (range de origem) e a (range de destino)
mas talvez de para adaptar.

até

 
Postado : 30/07/2014 12:43 am