Notifications
Clear all

Executar Módulo em várias planilhas

8 Posts
3 Usuários
0 Reactions
1,844 Visualizações
(@xmiguelx)
Posts: 34
Trusted Member
Topic starter
 

Olá pessoal, estou precisando de uma ajuda.

Tenho um arquivo de excel com várias planilhas ( Sheets ).
Em várias sheets (nem todas) eu tenho um botão que chama um macro, o código desse macro esta em um módulo.

Para executar, eu preciso ir em cada sheet, clicar no botão para atualizar.

Teria alguma forma de colocar um único botão em uma sheet e atualizar as demais?
Desafio: Indicar de alguma forma quais sheets deve ser atualizada de forma que não seja pelo nome da sheet, pois sempre é copiado uma das sheets e criado uma nova e alterado apenas as informações.

Segue abaixo o código do módulo:

  Sub Find_Square_Root()
     
 [S4].Formula = "=sum(Q3+S3)"
    
       Range("S4").Select
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
    
    
     SolverOk SetCell:="$S$4", MaxMinVal:=0, ValueOf:=0, ByChange:="$T$3", Engine:=1 _
        , EngineDesc:="GRG Nonlinear"
     SolverOk SetCell:="$S$4", MaxMinVal:=0, ValueOf:=0, ByChange:="$T$3", Engine:=1 _
        , EngineDesc:="GRG Nonlinear"
     SolverOk SetCell:="$S$4", MaxMinVal:=0, ValueOf:=0, ByChange:="$T$3", Engine:=1 _
        , EngineDesc:="GRG Nonlinear"

    
    SolverSolve UserFinish:=True

    SolverFinish KeepFinal:=1

Application.Calculation = xlCalculationAutomatic
 

    End Sub
 
Postado : 08/09/2016 4:32 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Achei meio confuso, primeiro você diz :

Tenho um arquivo de excel com várias planilhas ( Sheets ).
Em várias sheets (nem todas) eu tenho um botão que chama um macro, o código desse macro esta em um módulo.

Depois :
Para executar, eu preciso ir em cada sheet, clicar no botão para atualizar.
Como assim, se antes diz não ter Botão em todas as Sheets ?

Quanto a :
Desafio: Indicar de alguma forma quais sheets deve ser atualizada de forma que não seja pelo nome da sheet, pois sempre é copiado uma das sheets e criado uma nova e alterado apenas as informações.
Algumas sugestões :
Estar inserindo a chamada a macro Find_Square_Root na rotina em que cria a nova Sheet, assim apos a criação ela é executada.

Atribuir uma Tecla de Atalho para execução da rotina, assim não precisaria de botões e pode ser executada em qualquer aba.

Podemos ter outras formas, mas forneça mais detalhes, assim não ficamos em suposições.

E tambem não entendi a repetição de linhas iguais, talvez por não utilizar o Solver.

[]s

 
Postado : 08/09/2016 5:42 am
(@xmiguelx)
Posts: 34
Trusted Member
Topic starter
 

Mauro, bom dia!

Nem todas as Sheets é necessário ter a chamada do Macro, por isso não tem o botão.
Porém todas as Sheets que tem o botão, eu preciso entrar em cada um, clicar para executar.

Esse comando é exatamente para poder executar o Solver, porém quando faço o recalculo mais de uma vez, chego mais próximo do numero ideal, por isso repeti o comando.

Então, gostaria de poder executar nas sheets que tem o botão o solver.

Abs

 
Postado : 08/09/2016 6:00 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Miguel, para atualizar as abas sem identificar o nome podemos usar ActiveSheet, mas para isto a mesma tem de estar selecionada, se fossem todas as sheets poderiamos criar um loop das Sheets, mas como você disse, não é o caso pois nem todas necessitam, assim deveremos ter alguns parametros definidos para sabermos em quais temos de executar a rotina, por isso solicitei mais detalhes, tipo :

Como você faz a cópia e depois faz alterações e quer rodar a rotina, então :
Como é feita esta cópia ? Atraves de rotina ou manualmente ?
É dado nomes diferentes as sheets ou seguem o padrão do excel ?
A alteração das informações é feita logo após a cópia ou pode ser feita em tempos diferentes ?

Como pode ver, faltam detalhes, então se posível anexe seu modelo, detalhando melhor.

Quanto as repetições na linha que citei, e pelo que disse, você pode criar um Loop sem ter a necessidade de repetir, ficando assim, com 3 repetiçoes :

Sub Find_Square_Root()
         
    [S4].Formula = "=sum(Q3+S3)"
       
    Range("S4").Select
    
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
       
           
    'Fazemos um Loop com 3  Interaçoes, sem precisar repetir as linhas
    For i = 1 To 3
         
         SolverOk SetCell:="$S$4", MaxMinVal:=0, ValueOf:=0, ByChange:="$T$3", Engine:=1 _
            , EngineDesc:="GRG Nonlinear"
       
        SolverSolve UserFinish:=True

        SolverFinish KeepFinal:=1

    Next
    
    Application.Calculation = xlCalculationAutomatic

End Sub
 
Postado : 08/09/2016 7:56 am
(@xmiguelx)
Posts: 34
Trusted Member
Topic starter
 

Mauro, obrigado pela dica do Loop em vez de repetir o código várias vezes.

Para Facilitar o entendimento, montei uma planilha de exemplo conforme anexo:

Na Sheet CUSTO UNITÁRIO _ PREÇO DE VEND, sem estamos alterando o custo dos componentes ( entre as células C3 Á C7 ).

Sempre quando faço essa alteração do custo, tenho que entrar na Sheet de formação de preço de cada SKU e clicar no Botão Calcular para rodar o Solver.

Gostaria de poder clicar em um único botão, como exemplo coloquei na Sheet CUSTO UNITÁRIO _ PREÇO DE VEND o botão CALCULAR GERAL, e rodar o solver em cada Sheet dos sku, sem necessidade de entrar em cada sheet e clicar em calcular.

Abs

 
Postado : 12/09/2016 8:06 am
(@edsonbr)
Posts: 0
New Member
 

Boa tarde, Xmiguelx

Enquanto não surge uma ideia melhor, vc pode atribuir esta macro no seu botão "CALCULAR GERAL" que está na planilha "CUSTO UNITÁRIO _ PREÇO DE VENDA" (coloque-a no mesmo módulo que já existe):

Sub CalcularGeral()
  Dim ws As Worksheet, bt As Button
  For Each ws In ThisWorkbook.Worksheets
    If ws.Buttons.Count > 0 Then
      For Each bt In ws.Buttons
        If bt.OnAction = ThisWorkbook.Name & "!Find_Square_Root" Then
          ws.Activate
          Find_Square_Root
        End If
      Next bt
    End If
   Next ws
   Worksheets("CUSTO UNITÁRIO _ PREÇO DE VENDA").Activate
End Sub

O que ela faz é um loop por todas as planilhas e verifica em cada uma se existe algum botão que chame pela sua macro "Find_Square_Root". Se existir, ativa aquela planilha e executa a macro "Find_Square_Root" para ela, vai para a próxima planilha, etc.
Se não for isso, retorne.

Obs.: Estava realmente confuso e só ficou claro o que vc queria depois que o Mauro compilou as dúvidas e vc esclareceu anexando a pasta. Por isso é importante sempre anexar um modelo com o que espera resolver e o que é mais importante, detalhar e exemplificar bem o que precisa. Tenho percebido que a grande maioria dos tópicos que ficam sem resposta é por não terem sido suficientemente claros na descrição da situação-problema e do que espera como resposta já de início.

 
Postado : 12/09/2016 11:09 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

A dica do Edson é valida, só que mesmo assim, no meu entender ainda faltam alguns detalhes para poder deixar a rotina do jeitinho que pretende, ou seja executar sem precisar selecionar a aba e dispensar o Botão em cada uma delas.
No exemplo que anexou, as 3 abas tem botão, deveria ter colocado pelo menos uma que não teria botão e não precisaria ser calculada.

Na rotina abaixo, estou supondo que as abas que tenham de ser calculadas os nomes começam com "SKU", assim pegamos o nome de cada uma, realizamos a comparação das 3 primeiras letras e calculamos sem ser necessário seleciona-las.
Como eu questionei anteriormente sobre os nomes das abas e não citou, pois é importante para definirmos alguns parametros, então se todos os nomes das abas, tanto as que serão calculadas como as que não serão começarem com "SKU", necessitaremos de algum outro parametro para diferenciar na rotina.

Uma outra obs, é que em seu modelo nas celulas B12 a B14 temos a relação das 3 abas, se esta relação for somente das abas que deverão sofrer alteração e atualização, podemos utilizar estes nomes na rotina.

De qualquer forma, veja se atende da forma que estou supondo :

Sub Find_Square_Root_Mauro()
    Dim w As Worksheet
    Dim i As Long
    Dim wsSheet
    
    'Verificamos o nome cada aba
    For Each wsSheet In ActiveWorkbook.Worksheets
        
        'Se nos nomes das abas preceder "SKU" executa a rotina sem precisar
        'seleciona-las
        If Left(wsSheet.Name, 3) = "SKU" Then
            
            Set w = Worksheets(wsSheet.Name)
            
            w.Range("L8").Formula = "=sum(K8-M5)"
        
            For i = 1 To 3
        
               SolverOk SetCell:=w.Range("L8"), MaxMinVal:=0, ValueOf:=0, ByChange:=w.Range("K8"), Engine:=1 _
                    , EngineDesc:="GRG Nonlinear"
            
                SolverSolve UserFinish:=True
                SolverFinish KeepFinal:=1
    
                Application.Calculation = xlCalculationAutomatic
     
            Next i
        
        End If
        
    Next wsSheet
    
End Sub

[]s

 
Postado : 12/09/2016 1:10 pm
(@xmiguelx)
Posts: 34
Trusted Member
Topic starter
 

Edson, obrigado pela ajuda... funcionou perfeitamente.

Mauro, obrigado por sua ajuda... Com esse código, você me ajudou a resolver outras demanda que eu tinha.

Abs.

 
Postado : 12/09/2016 5:06 pm