Board logo

標題: [發問] 溢位處理 [打印本頁]

作者: caichen3    時間: 2012-4-18 12:44     標題: 溢位處理

以下是大大的程式,變數a,b為小數(例:4.5、3.8),執行結果出現溢位問題,請各位大大幫我看看
sub ex()
Dim a As Single, b As Single, c As Single, d As Double
dim kkk as String
ccc = Chr(67)
ddd = Chr(68)
ggg = Chr(71)

For i = 3 To k                        
  xxx = i
  a = Range(ccc + xxx).Value
  b = Range(ddd + xxx).Value
  c = a + (a - b)
  d = c / a
  Range(ggg + xxx).Value = Format(d, "00.00")
Next

End sub
作者: c_c_lai    時間: 2012-4-18 12:51

回復 1# caichen3
For i = 3 To k                        
請問 k 為多少?
作者: chin15    時間: 2012-4-18 14:01

1.先給k賦值
2.把+換成&
作者: c_c_lai    時間: 2012-4-18 17:05

回復 1# caichen3
  1. Sub ex()
  2.     Dim a As Single, b As Single, c As Single, d As Double
  3.     Dim kkk As String
  4.     Dim k As Integer
  5.    
  6.     k = 3
  7.     ccc = Chr(67)
  8.     ddd = Chr(68)
  9.     ggg = Chr(71)

  10.     For i = 1 To k
  11.         a = Range(ccc & i).Value
  12.         b = Range(ddd & i).Value
  13.         c = a + (a - b)
  14.         d = c / a
  15.         Range(ggg & i).Value = Format(d, "00.00")
  16.     Next

  17. End Sub
複製代碼
[attach]10490[/attach]
作者: Hsieh    時間: 2012-4-19 08:39

本帖最後由 Hsieh 於 2012-4-19 08:41 編輯

回復 1# caichen3
問題有幾個部分
1)迴圈的k值未指定
2)Range語法錯誤
3)a,b宣告為單精準數,若儲存格數值超出單精準數範圍(它的範圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38。)就會造成溢位
a = CSng(Range(ccc & xxx).Value)
b = CSng(Range(ddd & xxx).Value)
作者: c_c_lai    時間: 2012-4-19 12:27

回復 5# Hsieh
原來真正問題是出在欄位儲存值的精準度的容許範圍。

3)a,b宣告為單精準數,若儲存格數值超出單精準數範圍(它的範圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38。)就會造成溢位
a = CSng(Range(ccc & xxx).Value)
b = CSng(Range(ddd & xxx).Value)

謝謝!
作者: caichen3    時間: 2012-4-19 13:15

本帖最後由 caichen3 於 2012-4-19 13:25 編輯

請教問題
3)a,b宣告為單精準數,若儲存格數值超出單精準數範圍(它的範圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38。)

為什麼已經宣告Dim a As Single, b As Single
後面還要加上
a = CSng(Range(ccc & xxx).Value)
b = CSng(Range(ddd & xxx).Value)

感謝大大們的幫助,我知道為什麼了:)
作者: caichen3    時間: 2012-4-19 14:41

在創新商機指數G欄中有若干的數值,我想從中選出2個最大的數值並有紅色網底。
選出來的數值放置於range(M1:M2), range("I1")=2是我將選出的個數。
如果 G欄中的數值等於range(M1:M2)就給予紅色網底
以下是相關程式碼:
sub ex()
Dim myrange As Range
Dim U As Range  
Dim zzz as string,sss as string
Dim w As Single
Dim q As Single
mmm = Chr(77)

Set myrange = Range("G3:G11" )            '設定範圍
w = Application.WorksheetFunction.Max(myrange)    '取最大數值
Range("M1").Value = w

For Z = 2 To 2                                                                           '取第二大數值         
zzz = Z
q = Application.WorksheetFunction.Large(myrange, Z)
Range(mmm & zzz).Value = Format(q, "00.00")
Next
                                    
With ActiveSheet
    For Each U In .Range("G3:G200")
           For s = 1 To 2
               sss = s
               If U = Range(mmm & sss).Value Then
                  U.Interior.ColorIndex = 3
               Else
                  U.Interior.ColorIndex = xlNone
               End If
           Next
    Next
End With
End sub
執行結果卻只有g欄中1.42的數值底色為紅色,1.5卻沒有,一直找不出原因!!
作者: Hsieh    時間: 2012-4-19 15:45

回復 8# caichen3

想得太複雜了
  1. Private Sub CommandButton1_Click()
  2. Dim Ar(), A As Range, s&
  3. For Each A In Range([C3], [C3].End(xlDown))
  4. k = (A + (A - A.Offset(, 1))) / A
  5.   A.Offset(, 4) = k
  6.   ReDim Preserve Ar(s)
  7.   Ar(s) = k
  8.   s = s + 1
  9. Next
  10. For Each A In Range([G3], [G3].End(xlDown))
  11. If A > Application.Large(Ar, 3) Then
  12. A.Interior.ColorIndex = 3
  13. Else
  14. A.Interior.ColorIndex = xlNo
  15. End If
  16. Next
  17. End Sub
複製代碼

作者: caichen3    時間: 2012-4-19 17:29

請教h大大
k = (A + (A - A.Offset(, 1))) / A
  A.Offset(, 4) = k
  ReDim Preserve Ar(s)
  Ar(s) = k
  s = s + 1
Next
這段程式碼是在做什麼呢??
k = (A + (A - A.Offset(, 1))) / A   k值的作用是什麼
作者: Hsieh    時間: 2012-4-19 18:01

回復 10# caichen3
k就是你要算的G欄值
把這些值放在陣列中
最後只要大於陣列第三大值的G欄通通上底色
作者: caichen3    時間: 2012-4-20 11:58

感謝H大大的教學,好像我搞得太複雜了點
重新思考




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)