2017-01-13 3 views
-1

私はVBA、MACROを完全に新しくしました。私はそれが制約セル(R10) 制約で目的のセルを最適化するループでソルバーを実行するExcelで

  • が、それは客観的制約の両方のために、次の列に移行すべきであるとの目的関数セル(N10)を実行する必要がありますまず

    • を最適化するためにループする必要があります。すなわちセルO10 &セルS10についても、同様に2回以上繰り返す。
    • 次にi + 9行目に移動し、同じステップ分析を繰り返します。

    正確には2つのループがあります.1つは、4回の列ループと1つのループループで、最後に到達するまでです。いくつかの問題があります

    Excel snapshot of Data

  • +0

    コードのスクリーンショットは、行ったことの例を提供するうえでの貧弱な方法です。 – OldUgly

    +0

    ご容赦ください!私は初心者です。それを再現可能な方法で表現する方法を学びます。そして、入力に感謝します。 –

    答えて

    0

    ...

    • あなたは常にあなたのコード内で明示的なオプションを使用する必要があります。これは、タイプの不一致によるエラーの捕捉に役立ちます。
    • Cells(x,y)を使用する場合は、必ずワークシートで修飾する必要があります。
    • ソルバールーチンへの入力として範囲を使用することは時々動作するように見えますが、常に文字列を使用することをお勧めします。
    • SolverResetを実行すると、Excelが手動計算モードに切り替わります。このようなループで使用する場合は、最初に呼び出す必要があります。
    • SolverOKでは、EngineとEngineDescの両方を指定すると、不一致が発生して失敗する可能性があります。私は常にEngineDescを省略することをお勧めします。
    • SolverOKの "ByChange"フィールドがどのようにすべきかは不明です。私はあなたの制約と同じだと思っていますが、これを解決する必要があります。
    • サンプルデータがありませんが、これはテストされていません。

    次のコードは、適切な修正を加えて目的を達成する必要があります。

    Option Explicit 
    Sub mySolve() 
    Dim totalrows As Long 
    totalrows = 1000 ' *** use whatever formula finds your last row 
    
    Dim row As Long 
    Dim col As Long 
    Dim myWS As Worksheet 
    Dim SetAddr As String, ChgAddr As String, ConAddr As String 
    
    Set myWS = ActiveSheet 
    For row = 10 To totalrows Step 9 
        For col = 14 To 17 Step 1 
         SetAddr = myWS.Cells(row, col).Address 
         ChgAddr = myWS.Cells(row, col + 4).Address '*** you don't specify in your question 
         ConAddr = myWS.Cells(row, col + 4).Address 
         SolverReset 
         SolverOk SetCell:=SetAddr, MaxMinVal:=2, ByChange:=ChgAddr, Engine:=3 
         SolverAdd CellRef:=ConAddr, Relation:=1, FormulaText:="2" '*** what is your constraint 
         SolverSolve Userfinish:=True 
        Next col 
    Next row 
    
    End Sub 
    
    関連する問題