Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Chamando Solver pelo VBA

Bom dia pessoa, tudo bem com vocês?

Então, estou com uma dúvida que a internet não me responde. Então recorri a vocês!

Bom, estou criando uma macro que faça análise de dados e testes usando a ferramente "Solver" do Excel. O Solver demora bastante no computador da empresa para terminar de rodar, uns 10 minutos, então que quero montar uma macro para abrir o Excel de madrugada e começar a rodar o Solver .

O Solver já está todo configurado com todas as restrições, fiz isso usando a janela dele, não usei programação VBA para isso.

Minha pergunta é: Como chamar o Solver dentro de uma macro do VBA para que ele execute com todas as minhas restrições previamente configuradas? É possível isso ou terei que cadastrar cada restrição através do VBA????

Obrigado, galera!!

12 respostas
solução!

Já consegui, pessoal. Era só configurar por fora do VBA, lá no Excel e depois chamar a função SolveSolver no VBA!

Eduardo, bom dia!

Achei interessante a sua ideia. Você poderia dizer como fez essa função? É necessário habilitar alguma biblioteca específica?

Obrigado :)

Rapaz, eu to procurando aqui como que eu liguei o Solver. Jaja eu volto com essa resposta.

Encontrei. Você vai no Excel, clica em "Arquivo" e depois em "Opções", clica em "Suplementos" e na janela do lado, encontre "Solver". Clica no Solver e lá em baixo, clica em "Ir", marca a caixinha do Solver e pronto, ele estará na sua janela principal do Excel lá na aba de "Dados".

Aaaah, habilitar o Solver eu sei, hahaha. Pensei que você havia feito um código em VBA para executar o solver em uma data e hora específica.

De qualquer maneira, obrigado pela atenção! :D

Ahh, eu fiz isso também. Sempre que dá aquela hora, o Solver é executado. Quer que te explique como fazer essa macro?

Sim, por gentileza!! ai já fica salvo aqui para o caso de alguém precisar também.

Rapaz, você pode fazer assim:

Sub Auto_Open()
    Call Application.OnTime(TimeValue("hora de execução no formato 00:00:00"), SolverSolve)
End Sub

E aí, se você quiser executar isso de madrugada, você programa pelo agendador de tarefas do Windows para abrir essa planilha um pouco antes do horário definido na macro. Aí é sucesso!

Qualquer coisa, só gritar.

Eduardo, boa tarde!

Desculpe, mas ainda não consegui executar essa função. Tentei colocar um MsgBox simples, apenas para ver o resultado, porém não rolou.

Eu devo declarar essa Sub em um módulo? No procedimento que você colocou o SolverSolve, eu devo chamar uma outra função, né?

Abraços!

Isso. Essa função Auto_Open você declara em um módulo. Ela faz você o código que está dentro dela ser executado assim que o arquivo é aberto.

O Call Application.OnTime() é uma função que você define a hora ou daqui a quanto tempo você quer que uma certa função seja executada. O TimeValue("hora de execução no formato 00:00:00") você digita exatamente a que horas quer que execute a função. E o SolverSolve é a função que executa o Solver, ele já estando configurado.

Ali onde eu coloquei SolverSolve você pode colocar qualquer outra função, ali é a função que será chamada naquela hora.

Rapaz, ainda não dei conta de fazer isso, hahahaha. Desculpe a ignorância. Parece simples, mas estou bugando aqui. Vamos lá:

(1ª dúvida): Se eu declarar uma Function ou Sub dentro do mesmo módulo da Auto_Open, ela será executada independentemente se a hora estiver certa ou não. Correto?

(2ª dúvida): É possível criar uma Sub ou Function dentro do módulo da Auto_Open e ela só ser executada ao ser chamada?

(3ª dúvida): se eu colocar essa Sub ou Function fora do módulo, em um formulário, por exemplo, dá um erro dizendo que o objeto não pode receber o foco. Aonde eu devo declarar essa Sub ou Function para ela ser executada?

(4ª dúvida): a planilha deve ser programada para ser aberta na hora exata em que está setado o TimeValue ou a cada vez que o sistema operacional atualizar a hora, a Sub ou Function contida no Módulo será executada?

Obrigado pela atenção, grande abraço! :)

Desculpe a demora.

Então, o Auto_Open é uma Sub, ela é declarada dentro de um módulo qualquer que você cria. Assim como qualquer outra Function ou Sub tem que ser declarada dentro de algum Módulo.

A função o Auto_Open é que quando você abrir a planilha, todo o código contido dentro dessa Sub será executado automaticamente assim que você abrir a planilha.

Sobre sua terceira dúvida, você tem que verificar se a Sub ou Function está como Private ou Public, pode ser isso.

Sobre a quarta dúvida, o ideal é abrir a planilha um pouco antes do horário setado no TimeValue. Por exemplo, você quer que uma macro seja executada todos os dias às 10 da manhã, você programa pelo agendador de tarefas do windows para a planilha ser aberta todos os dias às 09:55. Como no exemplo a seguir:

Public Sub Auto_Open()
    Call Application.OnTime(TimeValue("10:00:00"), funcao_que_vai_rodar_todo_dia_no_horario_programado)
End Sub

Como o código "Call Application.OnTime(...)" está dentro do Auto_Open, ele será executado assim que a planilha for aberta, quando der a hora definida(10 da manhã no exemplo), a macro "funcao_que_vai_rodar_todo_dia_no_horario_programado" será executada.

Se não conseguir entender, me manda um mensagem no WhatsApp que a gente troca uma ideia: 21 96471-7070.

Valeu!