Vba 运行时错误溢出
我正在努力做到以下几点。我有两张床单 从sheet1中,我根据条件计算0的数量,并将其复制到sheet2的表中 我在不同的条件下也这样做。当我执行代码时,我得到一个运行时错误,溢出。有人能帮我一下原因是什么吗Vba 运行时错误溢出,vba,excel,Vba,Excel,我正在努力做到以下几点。我有两张床单 从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 Workshe
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
子结果()
作为整数的Dim i
作为整数的Dim j
将k变为整数
作为整数的Dim cnt
作为整数的Dim cntU
将Sht变暗为工作表
所有行的长度相同
设置Sht=板材(“CTT”)
图纸(“图纸1”)。选择
totalrows=范围(“A5”)。结束(xlDown)。行
n=工作表(“Sheet1”).范围(“A5:A”和totalrows).单元格.特殊单元格(xlCellTypeConstants).计数
对于i=2到工作表function.Count(短列(1))
cntT=0
cntU=0
碳纳米管=0
cntV=0
cntZ=0
cntW=0
cntA=0
Cntb=0
cntC=0
cntD=0
cntE=0
cntF=0
如果Sht.Range(“A”&i)=Val(格式(现在为“WW”)),则退出
接下来我
对于j=5至板材(“板材1”)。单元格(行数,17)。结束(xlUp)。行
如果短程(“A”&i)=短程(“W”&j)和短程(“Q”&j)=“D”,则cntT=cntT+1
如果短程(“A”&i)=短程(“W”&j)和短程(“Q”&j)=K,则cntU=cntU+1
如果短程(“A”&i)=短程(“W”&j)和短程(“Q”&j)=“A”,则碳纳米管=碳纳米管+1
如果短程(“A”&i)=短程(“W”&j)和短程(“Q”&j)=“M”,则cntV=cntV+1
如果短程(“A”&i)=短程(“W”&j)和短程(“Q”&j)=“C”,则cntW=cntW+1
如果短程(“A”&i)=短程(“W”&j)和短程(“Q”&j)=“E”,则cntZ=cntZ+1
如果cntU为0,则短范围(“K”&i)=cntU
如果碳纳米管为0,则短范围(“B”&i)=碳纳米管
如果cntT为0,则短范围(“E”&i)=cntT
如果n为0,则短程范围(“T”&i)=n
如果cntV为0,则短范围(“N”&i)=cntV
如果cntZ为0,则短范围(“H”&i)=cntZ
如果cntZ为0,则短范围(“Q”&i)=cntW
下一个j
对于k=5到页(“CTT_报告”)。单元格(行数,17)。结束(xlUp)。行
如果短程(“A”&i)=短程(“W”&k)和短程(“Q”&k)=“A”和短程(“U”&k)=“0”,则cntA=cntA+1
如果短程(“A”&i)=短程(“W”&k)和短程(“Q”&k)=“D”和短程(“U”&k)=“0”,则Cntb=Cntb+1
如果短程(“A”&i)=短程(“W”&k)和短程(“Q”&k)=“E”和短程(“U”&k)=“0”,则cntC=cntC+1
如果短程(“A”&i)=短程(“W”&k)和短程(“Q”&k)=“k”和短程(“U”&k)=“0”,则cntD=cntD+1
如果短程(“A”&i)=短程(“W”&k)和短程(“Q”&k)=“M”和短程(“U”&k)=“0”,则cntE=cntE+1
如果短程(“A”&i)=短程(“W”&k)和短程(“Q”&k)=“C”和短程(“U”&k)=“0”,则cntF=cntF+1
如果cntA为0,则短范围(“C”&i)=cntA
如果Cntb为0,则短范围(“F”&i)=Cntb
如果cntC为0,则短范围(“I”&I)=cntC
如果cntD为0,则短范围(“L”&i)=cntD
如果cntE为0,则短范围(“O”&i)=cntE
如果cntF为0,则短范围(“R”&i)=cntF
下一个k
如果cntA+Cnts+Cntb+cntC+cntD+cntE+cntF+cntT+cntU+cntV+cntZ为0,则
短量程(“D”&i)=碳纳米管/碳纳米管
短范围(“G”&i)=碳纳米管/碳纳米管
短程范围(“J”&i)=cntC/cntZ
短量程(“M”和i)=cntD/cntU
短程范围(“P”&i)=碳当量/碳当量
短范围(“S”&i)=cntF/cntW
如果结束
端接头
将所有整型变量更改为Long,然后再试一次将所有整型变量更改为Long,然后再试一次我非常愿意打赌,您在这个位置会遇到错误:
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
如果cntA+Cnts+Cntb+cntC+cntD+cntE+cntF+cntT+cntU+cntV+cntZ为0,则
短量程(“D”&i)=碳纳米管/碳纳米管
短范围(“G”&i)=碳纳米管/碳纳米管
短程范围(“J”&i)=cntC/cntZ
短量程(“M”和i)=cntD/cntU
短程范围(“P”&i)=碳当量/碳当量
短范围(“S”&i)=cntF/cntW
如果结束
虽然Sam发布的建议是第一个要查看的位置(整数的最大值约为32000,而long的最大值约为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
如果cntA+Cnts+Cntb+cntC+cntD+cntE+cntF+cntT+cntU+cntV+cntZ为0,则
如果Cnts为0,则
短范围(“D”和i).值=碳纳米管/碳纳米管
其他的
短程范围(“D”和i)。值=0
如果结束
如果cntT为0,则
短程范围(“G”和i).值=Cntb/cntT
其他的
短程范围(“G”和i)。值=0
如果结束
如果cntZ为0,则
短程范围(“J”和i).值=cntC/cntZ
其他的
短程范围(“J”和i).值=0
如果结束
如果cntU为0,则
短范围(“M”和i).值=cntD/cntU
其他的
短程范围(“M”和i).值=0
如果结束
如果cntV为0,则
短范围(“P”和i).值=碳当量/碳当量
其他的
短程范围(“P”和i)。值=0
如果结束
如果cntW为0,则
短范围(“S”和i).值=cntF/cntW
其他的
短程范围(“S”和i).值=0
如果结束
如果结束
虽然这样可以做到,但如果我正在编写代码,我可能会尝试将其封装在某种函数中。您甚至可以编写一个将两个数字相除的函数,如果分母为0,则返回0。不过我会让你决定的
此外,我强烈建议重构此代码。您应该查看Rubberduck:。这是一个非常好的工具,可以帮助您编写更好的代码
我希望这有帮助 我非常愿意打赌,您在这个位置会遇到错误:
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
如果cntA+Cnts+Cntb+cntC+c