2017-02-04 11 views
0

私は二次最適化のためのマクロを書こうとしています。私は非常に限られたVBAのスキルを持っているが、私は手動でソルバーを使用してマクロを記録し、私のコードは、現在、次のようになります。セル参照、隣接する列を変更するソルバーループを設定する

Sub Macro2() 
' 
' Macro2 Macro 
' 

' 
    SolverReset 
    SolverAdd CellRef:="$C$179:$C$185", Relation:=3, FormulaText:="0" 
    SolverAdd CellRef:="$C$186", Relation:=2, FormulaText:="1" 
    SolverOk SetCell:="$C$174", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$179:$C$185" _ 
    , Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverSolve UserFinish:=True 
    SolverFinish KeepFinal:=1 

End Sub 

私は何をしようとしていますが、ソルバのループを作るです次回ようにC列セルの参照とターゲットセルがDに変わりますが、それ以外のものはそのままです。私はCからVへの20の隣接する列のためにこれをしたいと思います。どんな助けも大いに評価されるでしょう!

+0

こんにちは@orkanoidを、あなたがそうDO-しようとしているものを解読ハード少し時間を持つあなたが言うとき:「そう次にセルのC列が参照され、ターゲットセルがDに変更されると、それ以外のものはすべて同じままになります。「あなたはコードを拡張する必要があると言っていますか?上の列Bから列Vまで作業していますか? – TheSilkCode

+0

こんにちは@TheSilkCodeが、私は次のステップのようになり、これはCとV.間(および含む)すべての列のために仕事をしたい: サブMacro2では()マクロ ' ' Macro2では ' ' SolverReset SolverAdd CellRef:= "$ D $ 179:$ D $ 185"、Relation:= 3、FormulaText:= "0" SolverAdd CellRef:= "$ D $ 186"、関係:= 2、FormulaText:= "1" SolverOk SetCell: = "$ D $ 174"、MaxMinVal:= 2、ValueOf:= 0、ByChange:= "$ D $ 179:$ D $ 185" _ 、Engine:= 1、EngineDesc:= "GRG Nonlinear" SolverSolve UserFinish:= True ソルバーフィニッシュKeepFinal:= 1 End Sub 、次に列Eの順に続きます。速い返信をいただきありがとうございます! – orkanoid

+0

あなたの入力したものが元のコードと異なるのは見当たりませんが、下のサンプルコードを見て、うまくいけば、少しでも微調整してgoalineに近づけることができます – TheSilkCode

答えて

0

上記の私の前提を正しければ、次のコードはあなたが探していることを行うでしょう。しかし、私はソルバー用のコードを持っていないので、機能...以下を参照:このことができます

Public Sub sampleCode() 
Dim targetWS As Worksheet 
Dim colCounter As Long 
Dim colAddress As String 
Dim colLetter As String 

Set targetWS = ThisWorkbook.Sheets(1) 'Make sure to replace sheet(1) with sheet(<your sheet name>) 
For colCounter = 3 To 22 'Loop through columns C through V 
    'Get the column letter you want to run solver on 
    colAddress = Replace(targetWS.Range("A1")(1, colCounter).address, "$", "") 
    colLetter = Left(colAddress, InStr(1, colAddress, "1") - 1) 
    SolverReset 
    'Run solver but with the references being set by using colLetter 
    SolverAdd CellRef:=colLetter & "179:" & colLetter & "185", Relation:=3, FormulaText:="0" 
    SolverAdd CellRef:=colLetter & "186", Relation:=2, FormulaText:="1" 
    SolverOk SetCell:=colLetter & "174", MaxMinVal:=2, ValueOf:=0, ByChange:=colLetter & "179:" & colLetter & "185", Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverSolve UserFinish:=True 
    SolverFinish KeepFinal:=1 
Next 
End Sub 

希望、 TheSilkCode

+0

私は上記のコードを試して、それは "ランタイムエラー '9':範囲外の下付き文字"と述べた。その後、私はデバッグを押し、 "set targetWS"で始まる行が黄色にマークされました。 – orkanoid

+0

'Set targetWS = ThisWorkbook.Sheets(1)'の 'Sheets(1)'をあなたのシートへの参照で置き換えましたか? "'シート(1)をシート名前>) " – TheSilkCode

+0

ああええ!これは魅力的に機能しました!ありがとう@ TheSilkCode、括弧の間にシート名を置くと、「実行時エラー '9':下付き文字が範囲外です」という結果になりました。それから、 "ThisWorkbook.Sheets(1)"で試しました。とにかくブックに1枚のシートがありましたが、それは素晴らしい結果でした(数回のクラッシュ後)。あなたは本当に大きな時間を、本当に助けてくれてありがとう! – orkanoid

関連する問題