...
- あなたは常にあなたのコード内で明示的なオプションを使用する必要があります。これは、タイプの不一致によるエラーの捕捉に役立ちます。
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
コードのスクリーンショットは、行ったことの例を提供するうえでの貧弱な方法です。 – OldUgly
ご容赦ください!私は初心者です。それを再現可能な方法で表現する方法を学びます。そして、入力に感謝します。 –