Notifications
Clear all

MACRO + SOLVER

17 Posts
2 Usuários
0 Reactions
3,486 Visualizações
(@gilson-filho)
Posts: 16
Eminent Member
Topic starter
 

Caros, estou precisando de uma ajuda urgente. Inseri um botão para acionar o solver, entretanto minhas células variáveis podem alterar dependendo de uma escolha anterior em uma Tabela dinâmica, ou seja, se minha tabela dinâmica tiver mostrando 5 campos de A3:A8, gostaria que a macro reconhecesse as células para entrar na opção "Alterando células variáveis" do solver de B3:B8. Caso eu diminua para mostrar apenas 3 campos (A2:A5) gostaria que realizasse alterações para B3:B5 no solver. Estou o usando a seguinte macro.

Sub Chamar_solver()
'
' Chamar_solver Macro
SolverOk SetCell:="$D$16", MaxMinVal:=2, ValueOf:=0, ByChange:="$B$3:$B$5", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
End Sub

 
Postado : 21/05/2012 10:44 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Gilson,

Eu não tenho a menor ideia de para que serve o Solver, muito embora eu já tenha pesquisado sobre isso. Entretanto, deixo uma sugestão, meio que uma ideia, de como você pode fazer para a macro reconhecer os mesmos intervalos. Segue a "proto-macro" explicada:
OBS: Copie e cole no seu editor VBA desde "Sub Intervalo_Solver" até "End Sub"

Sub Intervalo_Solver()

'Por padrão, procuro sempre nomear minhas variáveis indicando se elas variam pela linha ou pela coluna...
'... por isso que a nomeei começando com 'Lin'
Dim Lin_AlturaSolver As Variant

'Aqui estou considerando que o primeiro valor SEMPRE estará na linha 3, pois vc disse que o intervalo é, por ex., A3:A8
Lin_AlturaSolver = 3

'Esta linha de código vai andar na tabela dinâmica até encontrar o nome que estiver na última linha...
'... geralmente as tabelas dinâmicas trazem o nome "Total Geral" na última linha, por isso o escolhi, mas...
'... você vai olhar qual nome está escrito na última linha da sua tabela dinâmica e vai alterar aqui na macro, se for o caso.
Do While Worksheets("Plan1").Cells(Lin_AlturaSolver, 1) <> "Total Geral"

'Neste 'bloco if' pedi para a macro aumentar 1 unidade caso ela não encontre o valor "Total Geral"...
'... Na verdade, este bloco if nunca vai encontrar o valor "Total Geral", pois quando chegarmos nele o 'Do While' vai pulá-lo.
If Worksheets("Plan1").Cells(Lin_AlturaSolver, 1) <> "Total Geral"
Lin_AlturaSolver = Lin_AlturaSolver + 1

End If

Loop

'Este é o comando para selecionar o intervalo da tabela dinâmica. lembrando que, se vc observar, nós...
'... tivemos que diminuir 1 unidade da variável Lin_AlturaSolver, pois ela, imagino, não deve selecionar a linha de total.
Worksheets("Plan1").Range(Cells(3, 2), Cells(Lin_AlturaSolver - 1, 2)).Select

'Acho que você deve inserir seu código aqui, pois, até agora, nós apenas selecionamos o intervalo que você queria...
'... para que o código do solver fosse executado.
'>>> INSIRA SEU CÓDIGO AQUI <<<

End Sub

Enfim Gilson, se eu entendi o que você precisa, acho que esta explicação pode te ajudar a ter uma "luz", rsrsrs.

Abraços!!!

 
Postado : 22/05/2012 9:44 am
(@gilson-filho)
Posts: 16
Eminent Member
Topic starter
 

Bruno muti obrigado por sua ajuda! Sou leigo em VBA e quando copiei o código como você disse a linha "If Worksheets("Plan1").Cells(Lin_AlturaSolver, 1) <> "Total Geral" fica vermelha, será que pode estar faltando algo? Minha tabela dinâmica não apresenta o campo "Total geral", na verdade ela termina como a ultima opção que seleciono nela. O campo que eu preciso que a macro do solver automaticamente modifique é esse: ByChange:="$B$3:$B$5" do código que citei inicialmente.

 
Postado : 22/05/2012 12:25 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Então... esqueci de um pequeno detalhe...

O nome "Plan1" deve ser o nome da sua aba. Mude isso em todos os parâmetros.
If Worksheets("Plan1").Cells(Lin_AlturaSolver, 1) <> "Total Geral"

De qualquer forma, mande um modelo >>> COMPACTADO <<< da sua planilha para que nós possamos te ajudar melhor ;) .

Abração!

 
Postado : 22/05/2012 5:02 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Gilson, tambem não lido com TD e com Solver, o ideal seria fazer o que o Bruno disse e anexar o seu modelo reduzido e compctado.

Quanto a Linha VERMELHA, quer dizer que a mesma contem um erro, e neste caso não seria pelo fator nome da Aba (Plan1), e sim pela falta da condição no final da linha, ou seja toda condição If .. termina com Then, ficando da seguinte forma a linha :

If Worksheets("Plan1").Cells(Lin_AlturaSolver, 1) <> "Total Geral" Then

[]s

 
Postado : 22/05/2012 6:04 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Isso aí Mauro! E olha que eu estava fazendo no meu editor do vba, mas passou batido, rsrsrs.

Gilson, manda a planilha aí pra gente =D!

Abraços!

 
Postado : 22/05/2012 7:41 pm
(@gilson-filho)
Posts: 16
Eminent Member
Topic starter
 

Caros, muito obrigado pela ajuda e paciência. Segue em anexo o arquivo reduzido. Estou trabalhando em um formulador de rações para animais. Então, o objetivo é conseguir formular uma ração com custo mínimo e é isso que o solver faz. O botão que chama o solver esta inserido na planilha "formulador mecanicista" quando clico ele chama o solver e realiza a análise apenas para as células B22:B28. Entretanto, se o usuário da planilha quiser inserir mais alguns alimentos na Tabela dinâmica que está em A2 você verá que automaticamente estes alimentos são inseridos nos campos entre A22:A34, ou seja, a pessoa pode inserir de A22:A34 mas o solver só irá modificar de B22:B28, assim os outros alimentos não entram na otimização.

 
Postado : 23/05/2012 6:34 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Gilson,

Como não entendo se Solver, não sei se está dando certo. Só sei que ele está calculando para o intervalo.

Dê uma olhada e um retorno.

Abraços!

 
Postado : 23/05/2012 9:49 am
(@gilson-filho)
Posts: 16
Eminent Member
Topic starter
 

Bruno, ta quase dando certo, realmente quando altero a quantidade de alimentos na tabela o solver cálcula apenas as linhas que estão na coluna A, mas quando aciono o botão diretamente na planilha ta abrindo o VBA e mostrando a palavra "stop" do código em amarelo. Apenas quando aciono o solver diretamente no VBA por aquele botão "Executar" é que calcula. Mas ta correto ele ta selecionando apenas as células que são relativa a tabela dinâmica!!!! Acredito que seja algum besteirinha apenas! Tem como você dar uma olhada? abs

 
Postado : 23/05/2012 11:47 am
(@gilson-filho)
Posts: 16
Eminent Member
Topic starter
 

Resolvido Bruno. Era só retirar o termo "stop" do código!!!! Ta fazendo tudo certo!!!!!!!! Muito obrigado mesmo cara!!!

 
Postado : 23/05/2012 11:51 am
(@gilson-filho)
Posts: 16
Eminent Member
Topic starter
 

Bruno, já abusando de sua boa vontade e paciência, me informa só se é possível antes de o solver ser acionado na macro, o excel limpar automaticamente os campos em B que não contenham os respectivos alimentos em A? Por exemplo se rodar a macro com 5 alimentos o solver pode preencher todos, como está acontecendo perfeitamente, mas se o usuário quiser diminuir 1 ou 2 alimentos em A os valores que foram anteriormente cálculados pelo solver continuam lá, mesmo os alimentos não estando mais, e isso pode atrapalhar em alguns cálculos para frente. Então o que eu queria a mais era que o botão fizesse o reconhecimento dos campos que tem alimentos, depois apagasse apenas os campos em B que não tenham nada "" e então calculasse da mesma forma! Tem como colocar isso, acredito que não seja difícil. Obrigado e desculpe pela minha ignorãncia em VBA. abs

 
Postado : 23/05/2012 12:12 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Hehehehe..... eu coloco o 'stop' pra testar a macro e o esqueci lá.

Mas que bom que deu certo cara! Precisando estamos aí!

Abração!

 
Postado : 23/05/2012 6:22 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Fala Gilson!

Respondendo à sua pergunta:

"Bruno, já abusando de sua boa vontade e paciência, me informa só se é possível antes de o solver ser acionado na macro, o excel limpar automaticamente os campos em B que não contenham os respectivos alimentos em A? Por exemplo se rodar a macro com 5 alimentos o solver pode preencher todos, como está acontecendo perfeitamente, mas se o usuário quiser diminuir 1 ou 2 alimentos em A os valores que foram anteriormente cálculados pelo solver continuam lá, mesmo os alimentos não estando mais, e isso pode atrapalhar em alguns cálculos para frente. Então o que eu queria a mais era que o botão fizesse o reconhecimento dos campos que tem alimentos, depois apagasse apenas os campos em B que não tenham nada "" e então calculasse da mesma forma! Tem como colocar isso, acredito que não seja difícil. Obrigado e desculpe pela minha ignorãncia em VBA. abs"

Tem sim. E não esquente, estamos aqui para ajudar ;). Faça o seguinte, copie e cole o código abaixo, dentro do VB, logo após a variável "Lin_AlturaSolver = 22":

'Este código vai apagar toda a coluna "B"
Range("B22:B34").ClearContents

Qualquer coisa dá o grito 8-) !

 
Postado : 25/05/2012 2:12 pm
(@gilson-filho)
Posts: 16
Eminent Member
Topic starter
 

Bruno, esse código apaga tudo, não é mesmo? Eu gostaria que ele apagasse apenas as células em B que não contenham nada em sua respectiva linha em A. Pois quando apaga tudo a otimização do solver fica bem mais difícil no programa.

 
Postado : 25/05/2012 4:07 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Opa!

Faz o seguinte:

1 - Apague o código "Range("B22:B34").ClearContents";
2 - Cole imediatamente antes do código do solver este código abaixo:

'Este código vai apagar na coluna "B" os que não estão preenchidos em "A"
Range("B" & Lin_AlturaSolver, "B34").ClearContents

Qualquer coisa sá o grito 8-) !

 
Postado : 25/05/2012 8:17 pm
Página 1 / 2