2017-10-04 12 views
0

下の値にstucked取得:VBAのマクロは、私はこのマクロを持っている1

Sub SolverPaulo() 

    Dim listo As Boolean 
    Dim min As Single 
    Dim max As Single 
    Dim beta As Single 
    Dim tolerancia As Single 
    Dim deficit As Single 
    Dim prom As Single 

    listo = False 
    min = 0 
    max = 1 
    beta = 0 
    tolerancia = 0.1 

    While listo = False 
     prom = (min + max)/2 
     Cells(6, "CJ") = prom 
     deficit = Cells(6, "CI") 

     If (deficit > 0) Then 
      If (deficit < tolerancia) Then 
       beta = prom 
       listo = True 
      Else: min = prom 
      End If 

     Else 
      If (Abs(deficit) < tolerancia) Then 
       beta = prom 
       listo = True 
      Else: max = prom 
      End If 
     End If 
    Wend 

Application.ScreenUpdating = True 
End Sub 

Iが1よりtolerancia = 1または任意の値が高いほど定義した場合、マクロが正常に動作しますが、私は1の下tolerancia = 0.1または劣るような値を定義する場合マクロは無限ループで動作し続けます。私は使用する必要がありますtolerancia = 0.00001

Singleは私が使用しているVARSの正しいデータ型であるかわからない、これは私がVBAで作業するのは初めてです。

アイデアは、マクロがdeficitは、特定の時点でtolerancia

よりもマイナーになったときに、マクロがこれを決める停止する必要がある。

If (0.33 < tolerancia) 

toleranciaが実際にあるならば、それは...クラッシュしたときにあります0.33より小さい。 toleranciaと1以上の数字を比較すると、問題はありません。昏睡とポイントを比較

if (0,33 < 0.5) 

小数が.,ずに分離しているので、今、私のExcelファイルに、コンフィギュレーションは、スペイン語であるがそれを行うに失敗している理由かもしれません?

ヒント?

+1

は '赤字=細胞(6、 "CI")を使用してみvalue2'。私が知っていた限り、VBAは小数点区切り記号に '.'を使用し、ロケール設定を行わないので、セルがコンマ区切りを使用しても、VBAはポイント区切り記号として表示されます。 '.Value2'を使うとフォーマットが取り除かれ、' Range'の基になる値が返されます – Tom

+0

小数点区切りとしてロケールで使われているカンマは、セルに数値のように見えるテキストが含まれていない限り、実際の数よりも – YowE3K

+0

CJ6を変更したときにCI6がゼロに収束するように、Excelの式が設定されていますか? CJ6に入れられている値と新しい値に基づいてCI6で計算されている値を見ながら、コードを一歩進んでみてください。 – YowE3K

答えて

1

浮動小数点値を扱うときには、数値を参照するときは浮動小数点を使用するのがリテラルであっても、想定されるデータ型はリテラルとして入力されるタイプにするのが最善です。 0 = INT、0.0 =浮動小数点。

1

問題は、数値の値の型に問題がありました.Loをtrueに設定した場合に、赤字が発生することはありません。コードは次のとおり

Sub SolverPaulo() 

    Dim listo As Boolean 
    Dim min As Double 
    Dim max As Double 
    Dim beta As Double 
    Dim tolerancia As Double 
    Dim deficit As Double 
    Dim prom As Double 

    listo = False 
    min = 0 
    max = 1 
    beta = 0 
    tolerancia = 0.1 

    While listo = False 
     prom = (min + max)/2 
     Cells(6, "CJ") = prom 
     deficit = Cells(6, "CI").Value2 

     If (deficit > 0) Then 
      If (deficit < tolerancia) Then 
       beta = prom 
       listo = True 
      Else: min = prom 
      End If 

     Else 
      If (Abs(deficit) < tolerancia) Then 
       beta = prom 
       listo = True 
      Else: max = prom 
      End If 
     End If 
    Wend 

Application.ScreenUpdating = True 
End Sub 

ビデオ作業:

https://i.imgur.com/qRRXZ4Y.gif

関連する問題