运行时错误溢出

我正在尝试做以下事情。 我有两张床单。

从sheet1中,我根据条件计数0,并复制到sheet2中的表中。

我正在做不同的条件。 当我执行代码时,我得到一个运行时错误,溢出。 有人可以帮我什么理由。

Sub result() Dim i As Integer Dim j As Integer Dim k As Integer Dim cnt As Integer Dim cntU As Integer Dim Sht As Worksheet Dim totalrows As Long Set Sht = Sheets("CTT") Sheets("Sheet1").Select totalrows = Range("A5").End(xlDown).Row n = Worksheets("Sheet1").Range("A5:A" & totalrows).Cells.SpecialCells(xlCellTypeConstants).Count For i = 2 To WorksheetFunction.Count(Sht.Columns(1)) cntT = 0 cntU = 0 Cnts = 0 cntV = 0 cntZ = 0 cntW = 0 cntA = 0 Cntb = 0 cntC = 0 cntD = 0 cntE = 0 cntF = 0 If Sht.Range("A" & i) = Val(Format(Now, "WW")) Then Exit For Next i For j = 5 To Sheets("Sheet1").Cells(Rows.Count, 17).End(xlUp).Row If Sht.Range("A" & i) = Range("W" & j) And Range("Q" & j) = "D" Then cntT = cntT + 1 If Sht.Range("A" & i) = Range("W" & j) And Range("Q" & j) = "K" Then cntU = cntU + 1 If Sht.Range("A" & i) = Range("W" & j) And Range("Q" & j) = "A" Then Cnts = Cnts + 1 If Sht.Range("A" & i) = Range("W" & j) And Range("Q" & j) = "M" Then cntV = cntV + 1 If Sht.Range("A" & i) = Range("W" & j) And Range("Q" & j) = "C" Then cntW = cntW + 1 If Sht.Range("A" & i) = Range("W" & j) And Range("Q" & j) = "E" Then cntZ = cntZ + 1 If cntU <> 0 Then Sht.Range("K" & i) = cntU If Cnts <> 0 Then Sht.Range("B" & i) = Cnts If cntT <> 0 Then Sht.Range("E" & i) = cntT If n <> 0 Then Sht.Range("T" & i) = n If cntV <> 0 Then Sht.Range("N" & i) = cntV If cntZ <> 0 Then Sht.Range("H" & i) = cntZ If cntZ <> 0 Then Sht.Range("Q" & i) = cntW Next j For k = 5 To Sheets("CTT_Report").Cells(Rows.Count, 17).End(xlUp).Row If Sht.Range("A" & i) = Range("W" & k) And Range("Q" & k) = "A" And Range("U" & k) = "0" Then cntA = cntA + 1 If Sht.Range("A" & i) = Range("W" & k) And Range("Q" & k) = "D" And Range("U" & k) = "0" Then Cntb = Cntb + 1 If Sht.Range("A" & i) = Range("W" & k) And Range("Q" & k) = "E" And Range("U" & k) = "0" Then cntC = cntC + 1 If Sht.Range("A" & i) = Range("W" & k) And Range("Q" & k) = "K" And Range("U" & k) = "0" Then cntD = cntD + 1 If Sht.Range("A" & i) = Range("W" & k) And Range("Q" & k) = "M" And Range("U" & k) = "0" Then cntE = cntE + 1 If Sht.Range("A" & i) = Range("W" & k) And Range("Q" & k) = "C" And Range("U" & k) = "0" Then cntF = cntF + 1 If cntA <> 0 Then Sht.Range("C" & i) = cntA If Cntb <> 0 Then Sht.Range("F" & i) = Cntb If cntC <> 0 Then Sht.Range("I" & i) = cntC If cntD <> 0 Then Sht.Range("L" & i) = cntD If cntE <> 0 Then Sht.Range("O" & i) = cntE If cntF <> 0 Then Sht.Range("R" & i) = cntF Next k If cntA + Cnts + Cntb + cntC + cntD + cntE + cntF + cntT + cntU + cntV + cntZ <> 0 Then Sht.Range("D" & i) = cntA / Cnts Sht.Range("G" & i) = Cntb / cntT Sht.Range("J" & i) = cntC / cntZ Sht.Range("M" & i) = cntD / cntU Sht.Range("P" & i) = cntE / cntV Sht.Range("S" & i) = cntF / cntW End If End Sub 

我非常愿意打赌,你在这个位置得到你的错误:

 If cntA + Cnts + Cntb + cntC + cntD + cntE + cntF + cntT + cntU + cntV + cntZ <> 0 Then Sht.Range("D" & i) = cntA / Cnts Sht.Range("G" & i) = Cntb / cntT Sht.Range("J" & i) = cntC / cntZ Sht.Range("M" & i) = cntD / cntU Sht.Range("P" & i) = cntE / cntV Sht.Range("S" & i) = cntF / cntW End If 

虽然Sam发布的build议是首先看的(Integer的最大值为32,000,而Longs的最大值为20亿),但总是看的第二位是0。

虽然存在一个由0除法的错误代码,但是您可能会遇到除0的情况,导致溢出错误。 解决这个问题的最好方法是这样的:

 If cntA + Cnts + Cntb + cntC + cntD + cntE + cntF + cntT + cntU + cntV + cntZ <> 0 Then If Cnts <> 0 Then Sht.Range("D" & i).value = cntA / Cnts Else Sht.Range("D" & i).value = 0 End If If cntT <> 0 Then Sht.Range("G" & i).value = Cntb / cntT Else Sht.Range("G" & i).value = 0 End If If cntZ <> 0 Then Sht.Range("J" & i).value = cntC / cntZ Else Sht.Range("J" & i).value = 0 End If If cntU <> 0 Then Sht.Range("M" & i).value = cntD / cntU Else Sht.Range("M" & i).value = 0 End If If cntV <> 0 Then Sht.Range("P" & i).value = cntE / cntV Else Sht.Range("P" & i).value = 0 End If If cntW <> 0 Then Sht.Range("S" & i).value = cntF / cntW Else Sht.Range("S" & i).value = 0 End If End If 

虽然这将做到这一点,如果我正在编写的代码,我可能会试图包装在某种function。 你甚至可以编写一个将两个数字相除的函数,如果分母是0,则返回0。

另外,我强烈build议重构这段代码。 你应该检查出Rubberduck: http: //rubberduckvba.com/。 这是一个很棒的工具,可以帮助您更好地编写更好的代码。

我希望这有帮助!

最可能的是cntW = 0 ,因此在行上删除( Sht.Range("S" & i) = cntF / cntW )是不可能的,只要不可能被零除。

修复您的代码,以确保不会发生。 像这样: If cntW <> 0 then Sht.Range("S" & i) = cntF / cntW

要检查cntW的值是cntW ,写下面的内容:

MsgBox cntW在错误之前的某处。

将所有Integervariables更改为Long,然后重试