Notifications
Clear all

Chamar determinada MACRO

21 Posts
4 Usuários
0 Reactions
3,515 Visualizações
pfarias
(@pfarias)
Posts: 265
Reputable Member
Topic starter
 

Olá pessoal!

Minha dúvida acredito que seja simples.

Eu criei um userForm que ao abri-lo, ele da um CALL para um determinada macro que executou ela.
por exemplo:

Sub Macro01()
UserForm1.Show
Msgbox "OK"
End Sub
Public Sub UserForm_Activate()
Textbox1.txt = "Teste"
Call Macro01
End Sub

Até ai tudo bem.

mas só que eu não quero que seja determinada macro que execute após a abertura desse UserForm. A macro varia.
As vezes é Macro01, outras Macro02.

Quero que continue o Formulario aberto, e executando a macro junto com ele.

Existe alguma forma de eu escrever algo do tipo?

Public Sub UserForm_Activate()
Textbox1.txt = "Teste"
Call VOLTAR_PARA_MACRO_ATIVA
End Sub

Pietro Farias

Se foi resolvido suas dúvidas, lembre se de marcar o tópico como RESOLVIDO.

ANALISTA X

 
Postado : 11/08/2014 8:33 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vc pode passar variáveis e objetos como parâmetros...

Quando eu disse variáveis como parametros para o application.run, eu digo o seguinte:
Application.Run([Macro],[Arg1],[Arg2],[Arg3],[Arg4],[Arg5],[Arg6],[Arg7],[Arg8],[Arg9],[Arg10],[Arg11],[Arg12],[Arg13],[Arg14],[Arg15],[Arg16],[Arg17],[Arg18],[Arg19],[Arg20],[Arg21],[Arg22],[Arg23],[Arg24],[Arg25],[Arg26],[Arg27],[Arg28],[Arg29],[Arg30])

Vc confundiu e montou algo simples que nào mostra o que eu mencionei! rs

Seguinte... acima vc vê a assinatura do Application.Run, com todos os esus parâmetros (ou argumentos). O primeiro é o nome da macro, os seguintes, são os argumentos que vc pode usar, ou não.

Exemplos para clarear:

Sub FazQQuerCoisa()
     call MacroModelo1("Primeiro Argumento", "Segundo Argumento")
     Application.Run "MacroModelo1", "Primeiro Argumento","Segundo Argumento"
End Sub

Sub MacroModelo1(byval Argumento1 as string, byval argumento2 as string)
     'não faz nada
End Sub

Ambas as linhas de código fazem a mesma coisa. O próprio Run tem argumentos. Esses argumentos poderiam ser objetos e aí é que mora o perigo. Como passar objetos quando o Run só espera argumentos tipo texto ? E se os objetos estiverem em outro arquivo, qual o risco ? Enorme... o Run não vai funcionar... (Experiência própria...) ideal é passar os nomes dos objetos e instanciá-los novamento do lado de lá...

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 13/08/2014 3:04 pm
(@edcronos)
Posts: 1006
Noble Member
 

hum tá,
não vou rodar macros de outras pastas de trabalho e ainda estou meio fraco nisso de objetos
qualquer alteração de dados é feita na planilha ativa depois da importação, e depois exportado de volta "se for o caso".
eu estruturei as minhas macros para não fazerem alterações fora da plan ativa,

e a planilha se ajusta aos dados que vai receber para rodar as macros.

bem então posso usar sem medo né?

att.

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 13/08/2014 3:18 pm
(@edcronos)
Posts: 1006
Noble Member
 

fiz mais uns testes aqui e apareceu um fato estranho

Application.Run passa o argumento do tipo ByRef para a macro que chama, mas a macro não retorna esse valor alterado
parece que cria uma nova instância da variável

bx = 1
Application.Run "NomeMacro", bx
MsgBox bx <<<--aparece 1

Sub NomeMacro(ByRef dfS)
MsgBox dfS <<<--aparece 1
dfS = "B"
MsgBox dfS <<<---parece B

nem com variáveis publicas funcionou, o valor vai, mas não volta

...???

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 13/08/2014 4:35 pm
(@edcronos)
Posts: 1006
Noble Member
 

bem, achei algo mas ainda tenho que entender

http://www.tushar-mehta.com/publish_tra ... thod.shtml

o engraçado que já estava aberto aqui junto das dezenas de paginas que eu largo abertas depois de alguma pesquisa

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 13/08/2014 5:09 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pelo visto vc acabou de descobrirmais uma limitação do Application.Run...

Quando vc passa um parâmetro ByRef pelo Run, o ByRef não funciona. Ou seja, mais um bom motivo para não usá-lo.

o próprio link que vc postou já coloca algo que eu disse, nas primeiras frases:

The Application.Run method is a versatile mechanism to call a subroutine particularly in another workbook or add-in. Its one documented limitation, if we want to call it that, is that all arguments are passed by value (ByVal).

Traduzindo:

O método Application.Run é um mecanismo versátil para chamar subrptinas particularmente em outra pasta de trabalho ou suplemento (que nada mais é que um tipo de pasta de trabalho). É uma limitação documentada, se quisermos chamar assim, é que todos os agumentos são passados como ByVal.

O que pra mim faz TOTAL sentido. O Excel calcula o valor da variável e passa o valor para o Run, e não a referência em memória para ela. O que determina diretamente a diferença entre ByVal e ByRef.

Ou seja, o Run está de certa forma, decidindo por você que todos os parâmetros da assinatura de sua macro chamada, se forem ByRef, agora são ByVal.

PDM alto se vc depende do ByRef, não é ? Acredito que se a variável for global, o resultado seria satisfatório, desde que vc não use o mesmo nome. Mas daí vamos entrar na discussão do nome de novo. Vc parece gostar de usar mesmos nomes para variáveis globais e variáveis locais. Faça o teste ...

E a outra que eu também já mencionei nesse tópico:

The Run method returns whatever the called macro returns. Objects passed as arguments to the macro are converted to values (by applying the Value property to the object). This means that you cannot pass objects to macros by using the Run method.

traduzindo:

O metodo Run retornará o que a macro chamada retorna. Objetos passados como argumentos para a macro são convertido para valores (aplicando0se a propriedade Value para o objeto). Isso significa que você não pode passar objetos para macros usando o método Run.

Às vezes nas dicas, não é que não usamos ou não indicamos só pq "não gostamos do recurso e queremos ser chatos", mas muitos anos e muita pesquisa e muitos testes e levar muito susto e descobrir coisas novas o tempo todo. Há muitas limitações no Excel VBA.
Um dia vc vai querer criar nomes no Excel (Ctrl+F3). Daí vc vai se empolgar e vai criar mil nomes. E vai se empolgar e criar 10000 nomes. E vai descobrir que qto mais nomes vc cria, mais lenta a planilha fica. E mais, se tiver usando o formato antigo (XLS), descobrirá que a coleção de nomes, tem um limite que é 65.472,
Também havia um limite para a qtd de validações de qualquer tipo, e inclusive de formatações condicionais num arquivo. Aos poucos a MS vai resolvendo tudo, ou simplesmente aumentando os limites...

Mas amigo, são muitos anos, muito aprendizado. E a sua teimosia é importante, porque te guia e te leva a pesquisar. Só acho que você podia dar mais crédito para o que lê, e não lutar tanto contra os conselhos dos mestres online.

p.s.: esse link que vc mandou, é ótimo!

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 13/08/2014 10:19 pm
(@edcronos)
Posts: 1006
Noble Member
 

Vamos la...

Uma resposta que vai simplificar um pouco tudo isso.
( OFF Topic )-----------------------------------------------------------------------------
Não é teimosia...
E sim meu modo de Aprender e Entender as coisas,
Eu observo o funcionamento e assimilo,
Eu não decoro nomes (não consigo, e nunca consegui)

Para vc ter uma ideia, teve uma vez que tive que escrever um texto que tinha dezenas de "você" ,
toda hora eu tinha que voltar e ve onde ficava o "^" :? , parece algo ridículo não é.
Você falou que eu dependo muito da matemática, bem... eu não sei nem a tabuada, não decoro :oops: .

Deveria sentir vergonha de ser assim?
não sou disfuncional nem tenho um raciocínio inoperante, muito pelo contrario...
Bem, Apenas tenho um modo de funcionamento diferente :P. Ir contra isso, apenas seria ir contra minha própria natureza e dificultar ainda mais meu aprendizado.
------------------------------------------------------------( Fim OFF Topic )-----------------------------------------------

Sobre oq eu queria fazer com a chamada da macro pela variável,
eu passo os parâmetros comuns de funcionamento e uso a Array publica que já tenho.
eu estou usando com variável publica o tal "ColunO" que pega os setores da planilha

Apenas não xingue...
foi apenas um teste e não sei se vou usar assim, apesar de funcionar :P "complicou mais do que o necessário

essa parte fica dentro de um userform onde se escolhe os setores e aplicas algumas macros ...

  
  If ordemcM = True Then
        'If linha_ordem = True Then Ma = -1 Else Ma = 1
        If cresc_ordem = True Then Ab = 1 Else Ab = 2
        'If zigzag_ordem = True Then If incs <> "" Then Ac = incs Else Ac = 1 Else Ac = 0
        If ValXcres = True Then Ab = 3
        If VaLMencres = True Then Ab = 4
        Call DefineArray(Cs, "OrdenaARRAY", Ab, inCS.Value)
    End If


Essa macro chama a macro que localiza a range do setor e define a parte util "com valores" Na Array publica ColunO

Sub DefineArray(ByVal setor As Variant, ByVal NomeMacro As String, _
Optional ByVal tipo_chamada As Variant, Optional ByVal Valor_estimado As Variant)
    Call SetorL(setor)
    Li = Cells(Li - 1, Ti).End(xlDown).row - 1
    Lf = Cells(Rows.Count, Ti).End(xlUp).row + 1
    k = Range(Ti & Li, Ci & Lf).Rows.Count
    ColunO = Range(Ti & Li, Cf & Lf).Value2

    Application.Run NomeMacro, tipo_chamada, Valor_estimado

    Range(Ti & Li, Cf & Lf).Value2 = ColunO

End Sub

e essa ...Func=1 organiza a Array em ordem crescente
ou essas sem alterar a ordem dos valores...
desloca as linhas para que o valor escolhido fique no canto esquerdo x=9 ( 5,3,1,6,9)>(9,5,3,1,6,)
ou
o menor valor fique no canto esquerdo ( 5,3,1,6,9)>(1,6,9,5,3)

Sub OrdenaARRAY(ByVal cres1_decre2 As Byte, Optional ByVal Valor_vai_esqueda As Variant)
    Dim A As Variant, b As Variant, inC As Long, i As Long, Ci1 As Long, Cf1 As Long
    func = cres1_decre2
    If Limit = 1 Then Exit Sub
    x = Valor_vai_esqueda * 1

    Lfim = UBound(ColunO, 1): TCo = UBound(ColunO, 2)
    Ci1 = 4    ' coluna inicial de dados da array

    '-------------------------------------------------------------------------(inicio do loop )
    If func > 2 Then
        For L = 1 To Lfim
            If func = 3 Then    ' ---<<----( ORDEM POR VALOR X)---0
                Cx = Ci1
                For i = Ci1 To TCo
                    A = ColunO(L, i)
                    If A = x Then Cx = i
                Next
            End If
            If func = 4 Then    ' ---<<----(menor valor na esquerda )---0
                y = ColunO(L, Ci1)
                Cx = Ci1
                For i = Ci1 + 1 To TCo
                    A = ColunO(L, i)
                    If A < y Then y = A: Cx = i
                Next
            End If

            If Cx > 4 Then
                For QL = 1 To Cx - Ci1
                    A = ColunO(L, Ci1)
                    For cl = Ci1 To TCo - 1
                        ColunO(L, cl) = ColunO(L, cl + 1)
                    Next
                    ColunO(L, TCo) = A
                Next
            End If
        Next
    End If
    '-------------------------------------------------------------------------------------------------

    If func = 1 Then    ' ---<<----( ordena valor Crescente)---0
        For Lx = 1 To Lfim
            inC = Ci1:
            i = inC + 1
            Do
                A = ColunO(Lx, inC): b = ColunO(Lx, inC + 1)
                If A > b Then
                    ColunO(Lx, inC) = b: C = A
                    ColunO(Lx, inC + 1) = C
                    If inC > Ci1 Then inC = inC - 1
                Else
                    inC = i: i = i + 1
                End If
            Loop Until inC = TCo
        Next
    End If
    '----------------------------------------------------------------------------------------------------
End Sub

Repara não, apenas ideias malucas...

acabei tomando posso do tópico do cara,
mas como o assunto é referente pergunta dele..."Acho" que não tem importância.

Att.

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 14/08/2014 4:04 am
Página 2 / 2