VBA计算(除法)时出现溢出错误

问题描述 投票:0回答:1

在下面的宏中,计算

Rate = cell.Offset(0, 7).Value / cell.Offset(0, 2).Value
时出现溢出错误 - 无论 Rate 是否声明为 Long 还是 Double。请帮忙找出错误。

Sub Apply_ProRata()
Dim DistVal As Integer
Dim Rate As Long
Dim ID As String
Dim cell As Range
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Test")

For Each cell In ws.Range("B9:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row)
    If Len(cell.Value) = 20 Then
        ID = cell.Value
        
        DistVal = cell.Offset(0, 2).Value - cell.Offset(0, 7).Value
        Rate = cell.Offset(0, 7).Value / cell.Offset(0, 2).Value
        
        cell.Offset(0, 13).Value = DistVal
        cell.Offset(0, 14).Value = Format(Rate, "00.0%")
        
        For Each cell2 In ws.Range("B9:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row)
            If Len(cell2.Value) > 20 And InStr(cell2.Value, ID) = 1 Then
                cell2.Offset(0, 15).Value = cell2.Value / (DistVal * Rate)
            End If
        Next cell2
    End If
Next cell 
End Sub

在自然语言中,宏要做的是:

对于 B 列中的每个单元格,其中单元格值的长度 = 20 个字符

设置 ID = B 列单元格中的值

将单元格 O 中的值设置为单元格 D 中的值减去单元格 I 中的值

将单元格 P 中的值设置为等于单元格 I 中的值除以单元格 D 中的值,数字格式为百分比“00.0%”

设置 DistVal = 单元格 O 中的值

设置速率 = 单元格 P 中的值

对于 B 列中的每一行,如果单元格值的长度 > 20 个字符并且 InStr 单元格值以 ID 字符串开头

将单元格 Q 中的值设置为等于单元格 D 的值除以 (DistVal * Rate)

下一行

下一行

excel vba integer-division
1个回答
0
投票

Rate
DistVal
声明为 Double 应该可以解决问题。

Sub Apply_ProRata()
    Dim DistVal As Double
    Dim Rate As Double
    Dim ID As String
    Dim cell As Range
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Test")
    
    On Error GoTo ErrorHandler ' Add error handling

    For Each cell In ws.Range("B9:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row)
        If Len(cell.Value) = 20 Then
            ID = cell.Value
            
            If cell.Offset(0, 2).Value <> 0 Then ' Ensure no division by zero
                DistVal = cell.Offset(0, 2).Value - cell.Offset(0, 7).Value
                Rate = cell.Offset(0, 7).Value / cell.Offset(0, 2).Value
                
                cell.Offset(0, 13).Value = DistVal
                cell.Offset(0, 14).Value = Format(Rate, "00.0%")
                
                For Each cell2 In ws.Range("B9:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row)
                    If Len(cell2.Value) > 20 And InStr(cell2.Value, ID) = 1 Then
                        cell2.Offset(0, 15).Value = cell2.Value / (DistVal * Rate)
                    End If
                Next cell2
            Else
                cell.Offset(0, 14).Value = "Div/0 Error"
            End If
        End If
    Next cell
    
    Exit Sub

ErrorHandler:
    MsgBox "An error occurred: " & Err.Description
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.