Notifications
Clear all

Macro para SOLVER

3 Posts
2 Usuários
0 Reactions
1,279 Visualizações
(@guilhermepedro)
Posts: 10
Active Member
Topic starter
 

Galera,
Criei uma macro pra rodar o solver mas ele acaba por não resolver o problema.
Não acusa nenhum erro.

A unica coisa que está funcionando é a adição das restrições.
Depois de executar a macro, voltei para a planilha e cliquei no ícone do solver como se fosse fornecer seus parâmetros. Acontece que lá constam somente as restrições. Todos os outros parâmetros ficam em branco.

Sub Solver()

'
' MACRO para utilizar o solver
'
    
    '#########################################################################################
    '
    ' Parâmetros iniciais do solver: Célula destino, Otimização, Intervalo de variáveis, etc..
        
        Dim n As Integer    ' Procura a última linha preenchida das variáveis

        
        n = Plan1.Range("B65000").End(xlUp).Row
        

        
        'Seta os parâmetros iniciais
        SolverOk SetCell:="$E$5", MaxMinVal:="$T$4", ValueOf:=0, ByChange:="$E$8:$E$" & n, _
            Engine:=2, EngineDesc:="Simplex LP"
    
    
    
    '#########################################################################################
    '
    'Adição das Restrições
        
        Dim h As Integer  'Número de restrições
        Dim w As Integer  'Referência para o Loop
        Dim q As String   'Referência para localizar célula que deve ser lida
        Dim R As Long
        
        
            h = Plan1.Range("T8") - 1
        
            q = 7 + Plan1.Range("E2")
        
            For w = 1 To h
                R = Range("$I$" & q + 1).Value
                SolverAdd CellRef:="$I$" & q, Relation:="" & R, FormulaText:="$I$" & q + 2
                q = q + 5 + Plan1.Range("E2")
            Next w
    
    
    '##########################################################################################
    '
    ' Finaliza o Solver
        SolverSolve True
    '
    ' Define ação e tipo de relatórios
        SolverFinish KeepFinal:=1, ReportArray:=1, OutlineReports:=1


End Sub

Alguma ideia do que seja?

 
Postado : 05/10/2012 1:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

não tenho "intimidade" com o sover, porem lendo o help para a função solver, no exemplo dado as referencias são passadas como range:

Exemplo do help da Função SoverOK
Worksheets("Sheet1").Activate
SolverReset
SolverOptions precision:=0.001
SolverOK SetCell:=Range("TotalProfit"), _
    MaxMinVal:=1, _
    ByChange:=Range("C4:E6")
SolverAdd CellRef:=Range("F4:F6"), _
    Relation:=1, _
    FormulaText:=100
SolverAdd CellRef:=Range("C4:E6"), _
    Relation:=3, _
    FormulaText:=0
SolverAdd CellRef:=Range("C4:E6"), _
    Relation:=4
SolverSolve UserFinish:=False
SolverSave SaveArea:=Range("A33")

Então talvez deva ser utilizada assim:

    Sub Solver()

    '
    ' MACRO para utilizar o solver
    '
        '#########################################################################################
        '
        ' Parâmetros iniciais do solver: Célula destino, Otimização, Intervalo de variáveis, etc..
           
       
            Dim n As Integer    ' Procura a última linha preenchida das variáveis

           
            n = Plan1.Range("B65000").End(xlUp).Row
           

           
            'Seta os parâmetros iniciais
            SolverOK SetCell:=Range("E5"), MaxMinVal:=Range("T4"), ValueOf:=0, ByChange:=Range("E8:E" & n), _
                Engine:=2, EngineDesc:="Simplex LP"
       
       
       
        '#########################################################################################
        '
        'Adição das Restrições
           
            Dim h As Integer  'Número de restrições
            Dim w As Integer  'Referência para o Loop
            Dim q As String   'Referência para localizar célula que deve ser lida
            Dim R As Long
           
           
                h = Plan1.Range("T8") - 1
           
                q = 7 + Plan1.Range("E2")
           
                For w = 1 To h
                    R = Range("$I$" & q + 1).Value
                    SolverAdd CellRef:=Range("I" & q), Relation:="" & R, FormulaText:=Range("I" & q + 2)
                    q = q + 5 + Plan1.Range("E2")
                Next w
       
       
        '##########################################################################################
        '
        ' Finaliza o Solver
            SolverSolve True
        '
        ' Define ação e tipo de relatórios
            SolverFinish KeepFinal:=1, ReportArray:=1, OutlineReports:=1


    End Sub
 
Postado : 05/10/2012 2:00 pm
(@guilhermepedro)
Posts: 10
Active Member
Topic starter
 

Consegui resolver..

Parece que quando se quer adicionar uma sequencia ou fórmula tem que criar uma variável e usar: = "" & nomedavariável...
embora não sei se é o melhor jeito mas funcionou aki.

olha como ficou:

Dim Change As String, MaxMinVal As Long
Dim n As Integer

n = Plan1.Range("B65000").End(xlUp).Row
Change = "$E$8:$E$" & n
MaxMinVal = Range("T4").Value


'Seta os parâmetros iniciais
SolverOk SetCell:="$E$5", MaxMinVal:="" & MaxMinVal, ValueOf:=0, ByChange:="" & Change, _
Engine:=2, EngineDesc:="Simplex LP"

Fica a dica aí

 
Postado : 06/10/2012 8:02 am