2016-11-02 35 views
0

まず、私が見つけた解決策(たとえば、here、私のために働いていない)を調べてみました。私は(通常)値を解決するソルバーの簡単な機能を使用するマクロを記述しようとしています。次のようにVBAソルバーの制約が設定されていないエラー

私が持っているコードは次のとおりです。

Sub SolverAEP() 

    Dim GeneratedPower As Double 
    GeneratedPower = Worksheets("AEP").Range("D57") 

    SolverReset 

    SolverOk SetCell:="$D$58", _ 
     MaxMinVal:=3, _ 
     ValueOf:=GeneratedPower, _ 
     ByChange:="$D$65" _ 
     , Engine:=1, EngineDesc:="GRG Nonlinear" 

    SolverSolve userFinish:=False  

End Sub 

現時点でのエラーは、私が試してみましたSolver could not find a feasible solution. Sovler can not find a point for which all Constraints are satisified.

何ということです:

  • をいくつかのオンラインの案内がVALUEOFことを言います文字列にする必要があります - 私はRange("D57")Cells(57,"D").Valueの両方にCStrのアプローチを試みましたが、両方ともソルバーエラーが出てきました。
  • 私は手動でソルバーを開こうとすると、常に完全停止ではなくカンマで開きます。小さなスクリプトを使用してすべてのカンマを完全停止に置き換えましたが、何も変更されませんでした。私はValueOfという文字列を扱っていました。なぜこのようなことが起こっているのかよくわかりませんが、コンチネンタルと英国の両方のキーボードを使用しているためローカリゼーションの設定がかなり乱雑であるため文化紛争が起こっていると思います。
  • Sub Macro2() 
        SolverOk SetCell:="$D$58", MaxMinVal:=3, ValueOf:=21000#, ByChange:="$D$65" _ 
         , Engine:=1, EngineDesc:="GRG Nonlinear" 
    
        SolverOk SetCell:="$D$58", MaxMinVal:=3, ValueOf:=21000#, ByChange:="$D$65" _ 
         , Engine:=1, EngineDesc:="GRG Nonlinear" 
    
        SolverSolve 
    End Sub 
    
  • VA:ソルバーに手動で同じことをやって、マクロの記録

  • は私に以下のようにソルバーのコードを与えます私が現在必要としている丸みを帯びている可能性がある - 私は書かれたマクロの中で小数点がまだ完全な停止の代わりにコンマを使用していたようだ。私は値を丸めてそこに入れてみましたが、同じエラーが出ました。

最後に、ソルバーでこれを手動で解決することに問題はないことを付け加えておきます。参照セルD58は他のセルの合計であり、その値はD65の値に依存する。

私が間違っていることを強調してもらえますか?あなたの式が存在したシートを活性化するため、どのような現在アクティブなシート上のプロセスをやっている解決されていないかのように、それは重要な場合には

、私はエクセル2016

+0

(a) 'ValueOf:= GeneratedPower'ではなく、' ValueOf:= Worksheets( "AEP")Range( "D57") 'を使ってみましたか? (なぜそれが助けになるのか分かりませんが、試してみる価値があります)(b)マクロ実行時に "AEP"がアクティブシートですか? – YowE3K

+0

できればそれを試してみます。そして、いいえ、アクティブシートではありません。それが違いを生むかもしれないと思いますか? – gktscrk

+0

セル$ D $ 58と$ D $ 65はアクティブなシートを参照するものですか?またはAEPシートに?現在設定されているので、アクティブシートを参照します。 – YowE3K

答えて

1

を使用していることが表示されます。です。

私はあなたのコードを変更することをお勧め:ソルバーを実行しているときActivateが正しいシートが選択されていることを確認します

Sub SolverAEP() 

    With Worksheets("AEP") 
     .Activate 

     SolverReset 

     SolverOk SetCell:="$D$58", _ 
       MaxMinVal:=3, _ 
       ValueOf:=[$D$57], _ 
       ByChange:="$D$65", _ 
       Engine:=1, _ 
       EngineDesc:="GRG Nonlinear" 

     SolverSolve userFinish:=False 
    End With 

End Sub 

。 (私はなどActivateSelectSelectionの使用を嫌うよう多くは、これは、それを必要とする当時の一つです - ソルバーは、アクティブなシートだけで動作します。)の値についてコメント再


ありませんApplication.ScreenUpdating = Falseステートメントが含まれている場合は、ソルバーをもう一度実行するまで更新されていますが、かなり明白な質問以外の理由は考えられません。 "Application.ScreenUpdating = Trueステートメントも含まれていますか?"

ちょうど=Falseで実行しようとしましたが、​​を実行すると、マクロが終了すると画面が更新されました。私は次のような別のサブルーチンを書いた場合

しかし、:

Sub Test 
    SolverAEP 
    MsgBox "Finished first solve" 
    SolverAEP 
    MsgBox "Finished second solve" 
End Sub 

と(ちょうど=Falseなし対応=Trueで)、その後、それを実行したSub TestEnd Subに到達するまで、画面は更新されません。 。これは、停止したと予想される動作ですScreenUpdating

+0

両方のカウントに感謝します。あなたが正しいと思います。私はscreenactivatingに対応する '= True'を持っていますが、最適に配置されていないと思います。あなたのバージョンのワークシートを起動し、その動作を確認します。しかし、主な問題は解決されました。 – gktscrk

関連する問題