在下面的宏中,计算
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)
下一行
下一行
将
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