Vba 运行时错误溢出

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

我正在努力做到以下几点。我有两张床单

从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 
子结果()
作为整数的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