問題:當 C 或 D 列中的任何值超過 4 位小數時,撰寫 VBA 時會給出錯誤訊息框和紅色字體。回圈遍歷這些值,似乎完全隨機的值正在獲得紅色字體。
代碼('date' if's 正在作業,但仍然包含它們) NB2:Msgbox 是在這段代碼之后撰寫的:
With ThisWorkbook.Worksheets("Blad1")
Do While .Range("B" & x).Value <> "" 'checken tot er een lege rij tussen zit
If .Range("B" & x).Value 1 <= Date Then .Range("B" & x).Font.Color = vbRed 'maak de datum rood als deze in het verleden ligt
If .Range("B" & x).Value 1 <= Date Then .Range("E999").Value = "TRUE" 'cel vullen met WAAR wanneer datum in het verleden ligt
If .Range("C" & x).Value > Round((.Range("C" & x).Value), 4) Then .Range("C" & x).Font.Color = vbRed
If .Range("D" & x).Value > Round((.Range("C" & x).Value), 4) Then .Range("D" & x).Font.Color = vbRed
x = x 1
Loop
End With
uj5u.com熱心網友回復:
例如,您需要檢查該值是否是有效日期
If IsDate(.Range("B" & x).Value) Then...,以及是否執行 4 個 IF。
此外,您應該檢查 C 和 D 單元格是否為數字IsNumeric(...)且不為空,因為IsNumeric空單元格為真。
@FaneDuru 正確指出了關于舍入的另一件事,您應該改為執行以下操作if Len(.Range("D" & x).Value) - Len(Fix(.Range("D" & x).Value)) > 5 then...
請記住,如果值不是數字,則修復失敗
uj5u.com熱心網友回復:
你不能在這里使用 Round - 它是尾數的長度來測量:
' Returns the mantissa of a decimal number as
' a string to preserve leading zeroes.
'
' Examples:
' Mantissa(1234.56789) -> "56789"
' Mantissa(-1234.56789) -> "56789"
' Mantissa(1234.056789) -> "056789"
' Mantissa(-1234.056789) -> "056789"
' Mantissa(123456789) -> ""
'
' 2017-10-15. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function Mantissa( _
ByVal Number As Double) _
As String
Dim Result As String
Dim Fraction As Variant
Fraction = CDec(Number) - CDec(Fix(Number))
If Fraction <> 0 Then
Result = Mid(Str(Abs(Fraction)), 3)
End If
Mantissa = Result
End Function
然后:
If DateDiff("d", .Range("B" & x).Value, Date) >= 1 Then .Range("B" & x).Font.Color = vbRed 'maak de datum rood als deze in het verleden ligt
If DateDiff("d", .Range("B" & x).Value, Date) >= 1 Then .Range("E999").Value = "TRUE" 'cel vullen met WAAR wanneer datum in het verleden ligt
If Len(Mantissa(.Range("C" & x).Value)) > 4 Then .Range("C" & x).Font.Color = vbRed
If Len(Mantissa(.Range("D" & x).Value)) > 4 Then .Range("D" & x).Font.Color = vbRed
uj5u.com熱心網友回復:
由于錯誤的檢查方法,您會收到這樣的“隨機值”...
Round做這個詞所暗示的:它對數字進行四舍五入。小于 5 向下取整,大于或等于 5 向上取整。你需要一個Truncate小數的函式......
讓我們采取:
Sub TestTruncateDecimals()
Dim x As Double
x = 1.12345
Debug.Print x, Round(x, 4) '1.12345 1.1234 - OK
x = 1.45678
Debug.Print x, Round(x, 4) '1.45678 1.4568 - ? 1.4568 is bigger than 1.45678...
Debug.Print x, truncDecimals(x, 4) '1.45678 1.4567 !!!
End Sub
Function truncDecimals(x As Double, decNo As Long) As Double
Dim strX As String: strX = CStr(x)
Dim sep As String: sep = Application.International(xlDecimalSeparator)
If InStr(1, strX, sep) Then
truncDecimals = Split(strX, sep)(0) & sep & left(Split(strX, sep)(1), decNo)
Else
truncDecimals = x
End If
End Function
所以,請復制上面的函式并使用:
If .Range("D" & x).Value > truncDecimals(.Range("C" & x).Value, 4) Then
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/518034.html
標籤:擅长vba
