私は大きなセットアップの一部であるVBAの機能を持っています。この関数はClass Module
の内部にあり、基本的には賞賛される減算です。私はなぜ奇妙な結果が得られたのか疑問に思ったので、デバッグのために関数を単純化しました。変数の1つには値が割り当てられるのではなく、一見ランダムな値が割り当てられることが分かります。どのように単純な割り当てが間違って行くことができますか?VBAは変数に不正な値を割り当てます
さらに奇妙なことに、なぜそれが間違った値を割り当てるのではないのですか?それはときどき起こるだけです。それ以外の時は正しい。そして時々、何も評価されていないようで、関数はちょうど0(ゼロ)を返します。
私のコードでは問題ではありませんが、VBAの仕組み(舞台裏で)は非常に面白いです。しかし、私がそれを理解していない限り、軽減することは非常に困難です。
コード:
Public Property Get MySubtractionFunction() As Double
Dim tmpValue1 As Double
Dim tmpValue2 As Double
Dim tmpOutput As Double
'When debugging, sometimes CDbl(Me.Value2) evaluates to approximately 18.000
'However tmpValue2 evaluates to approximately 10.000
tmpValue1 = CDbl(Me.Value1)
tmpValue2 = CDbl(Me.Value2)
tmpOutput = tmpValue1 - tmpValue2 'Breakpoint is set at this line
tmpOutput = Application.WorksheetFunction.Min(tmpOutput , tmpValue1)
'Return output
MySubtractionFunction= tmpOutput
End Property
アップデート1 私がブレークポイントに到達する前にMe.Value2
の上にマウスを置くと、それは実際にtmpValue2
に割り当てられている値を示しています。私がマウスを外してMe.Value2
の上に再び戻ると、別の値が表示されます。どのようにコードが実行されることなく、プロパティ値はちょうどそのように変更できますか?
更新2 多分私は、ループ内でクラスオブジェクトを使用するときにのみ問題が発生することを言及する必要があります。このように呼ばれている:
For i = 1 To 1000
Dim myObject As myClass
Set myObject = New myClass
'Some initialization
result = myObject.MySubtractionFunction
'A bunch of other stuff
Set myObject = Nothing
Next i
Me.Value1'と 'Me.Value2'は、どのようなタイプですか'?それらは 'String'型ですか?もしそうなら、実際の価値は「Double」に変換される前には何ですか? – user3598756
両方のプロパティのタイプが「Double」です。私は 'CDbl'をデバッグの試みとして追加しましたが、これは必須ではありません。 – Noceo
時間の値を計算しているようです。そのような値は誤って変換されていることで有名です。 '01:10:15'のような値がユーザフォームのDblとしてどのように終わるかを見てください。 – Variatus