1

Visual Basic で 10 進数が切り捨てられるのを防ぎ、科学的表記法で切り捨てられた数値ではなく完全な 10 進数として保持するにはどうすればよいですか?

誰かのために変更している Excel マクロからのこの小さなコードがあります (Debug.Print ステートメントのみが私のものです)。

rttime = asht.Cells(i, timecol).Value
Debug.Print "rttime=" & rttime
Debug.Print "To string: " & CStr(CDec(rttime))
rtdelta = rttime - wavonset_value 'searchcol="AOISlide2"
Debug.Print "rtdelta=" & rtdelta

Debug.Print ステートメントは私に与えます:

rttime=1.343301E+12
To string: 1343301000000
rtdelta=0

つまり、基本的にここで起こっていることは、値が科学表記法で Excel ワークシートから取得され、その表記法に表示されていないものはすべて切り捨てられているということです。

実際の数値は1343300687515.39である必要がありますが、強制的に1.343301E+12に下げられており、科学表記法から強制しても1343301000000になります。

小数点とすべてを含む実際の数値にするにはどうすればよいですか? 場合によっては 20 程度の差しかない場合もあるため、この側面は実際には必要ですが、数百万の位に切り捨てられるため、まったく役に立ちません。

編集:参照用の関数全体を次に示します

Function GetAOIRowStart(asht As Worksheet, startrow&, endrow&, searchstr$, searchcol&, 

AOItime_start As Single) As Long
Dim i&
Dim rtdelta As Single
Dim rttime As Single
Dim wavonset_value As Single
Dim timecol&


timecol = 4
wavonset_value = asht.Cells(startrow, timecol).Value 'tettime
Debug.Print "wavonset_value=" & wavonset_value

i = startrow
Do Until i >= endrow

    'scan down TeTTime' column to find nearest look of interest
    rttime = asht.Cells(i, timecol).Value
    Debug.Print "rttime=" & rttime
    Debug.Print "To string: " & CStr(CDec(rttime))
    rtdelta = CDec(Right(rttime, 9)) - CDec(Right(wavonset_value, 9)) 'searchcol="AOISlide2"
    Debug.Print "rtdelta=" & rtdelta
    If rtdelta >= AOItime_start Then
         Exit Do
    End If


    i = i + 1
Loop

GetAOIRowStart = i
'Debug.Print asht.Cells(i, sound_playing_col).Value
End Function
4

1 に答える 1

1

あなたの問題は、変数のサイズに関係しています。の場合、必要なデータを保持するのに十分な大きさではありませんrttimeSingle変数の型を に変更Doubleすると、問題が解決するはずです。

経験則として、メモリの制約が非常に厳しい場合を除き、 を使用Longして整数値Doubleを保持し、浮動小数点値を保持します。Decimal非常に正確な計算のために型を予約します。また、タイプを避けることをお勧めしますVariant

于 2013-05-08T05:33:11.477 に答える