Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3255|回复: 10

[已解决][求助]127行后出错

[复制链接]
发表于 2010-7-28 18:58 | 显示全部楼层 |阅读模式


 

不知什么地方出错了?

yW5zdWJS.rar (105.26 KB, 下载次数: 0)

ena5zRLo.rar

98.2 KB, 下载次数: 1

多次运算后这个地方LEN(K1) 始终是=4

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2010-7-28 20:01 | 显示全部楼层

你将k1定义为long,帮助说得很清楚:

Long 数据类型

请参阅     示例     特性

Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647。Long类型声明字符为和号 (&)。

回复

使用道具 举报

 楼主| 发表于 2010-7-28 20:04 | 显示全部楼层

Long  定义过,这样的话 LEN(K1) 始终 = 4 了

查不出原因

回复

使用道具 举报

发表于 2010-7-28 20:06 | 显示全部楼层

咋查不出原因呢?“Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式”这不是原因吗?
回复

使用道具 举报

 楼主| 发表于 2010-7-28 20:17 | 显示全部楼层

你的意思 dim k1 as long

回复

使用道具 举报

 楼主| 发表于 2010-7-29 09:07 | 显示全部楼层

顶上去,

回复

使用道具 举报

发表于 2010-7-29 09:40 | 显示全部楼层

Sub d4()
    Dim qishi As Long, jieshu As Long, K1 As String
    qishi = Range("n7").Row
    jieshu = Range("g7").End(xlDown).Row
    Range("P" & qishi & ":bi65536") = ""
    For qishi = qishi To jieshu

        If Range("G" & qishi) = "本月合计" Then
        m = qishi - 1
        i = Range("C" & m + 1).End(xlUp).Row
        Range("H" & m + 1) = Evaluate("SUMPRODUCT(($B$6:$B" & i & "=$B" & i & ")*H$6:H" & i & ")")
        Range("J" & m + 1) = Evaluate("SUMPRODUCT(($B$6:$B" & i & "=$B" & i & ")*J$6:J" & i & ")")
        ElseIf Range("G" & qishi) = "本年累计" Then
        n = qishi - 2
        Range("H" & n + 2) = Evaluate("SUMPRODUCT(($B$6:$B" & n & ">0)*H$6:H" & n & ")")
        Range("J" & n + 2) = Evaluate("SUMPRODUCT(($B$6:$B" & n & ">0)*J$6:J" & n & ")")
        End If


        Range("p" & qishi & ":u" & qishi) = Range("b" & qishi & ":g" & qishi).Value
        Range("ah" & qishi) = Range("i" & qishi)
        Range("au" & qishi) = Range("k" & qishi)
        Range("bh" & qishi) = Range("m" & qishi)

        If Range("h" & qishi) <> "" Then
            K1 = CStr(Range("h" & qishi) * 100)
            For i = 1 To Len(K1)
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 33 - Len(K1) + i
                    Cells(qishi, f) = Mid(K1, i, 1)
                End If
            Next i
        End If

        If Range("j" & qishi) <> "" Then
            K1 = CStr(Range("j" & qishi) * 100)
            For i = 1 To Len(K1)
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 46 - Len(K1) + i
                    Cells(qishi, f) = Mid(K1, i, 1)

                End If
            Next i
        End If

        If Range("l" & qishi) <> "" Then
            K1 = CStr(Range("l" & qishi) * 100)
            For i = 1 To Len(K1)           '多次运算后这个地方LEN(K1) 始终是=4
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 59 - Len(K1) + i
                    Cells(qishi, f) = Mid(K1, i, 1)
                End If
            Next i
        End If
    Next qishi
    Range("N2") = qishi


End Sub

回复

使用道具 举报

 楼主| 发表于 2010-7-29 14:05 | 显示全部楼层

俺使用您的代码

在127行还是错误。我纳闷的是在单元格J127以前有比88000大的数,也有比88000小的数。这些数都对了。为什么唯一这个错误。如果把J127改为 2000 所有的数据又都对了。包括J127以后的数值

希望高手们给个答案


[此贴子已经被作者于2010-7-29 14:12:14编辑过]
回复

使用道具 举报

发表于 2010-7-29 14:33 | 显示全部楼层    本楼为最佳答案   

计算精度问题

Sub d4()
    Application.ScreenUpdating = False
    Dim qishi As Long, jieshu As Long, K1 As String
    qishi = Range("n7").Row
    jieshu = Range("g7").End(xlDown).Row
    Range("P" & qishi & ":bi65536") = ""
    For qishi = qishi To jieshu

        If Range("G" & qishi) = "本月合计" Then
        m = qishi - 1
        i = Range("C" & m + 1).End(xlUp).Row
        Range("H" & m + 1) = Evaluate("SUMPRODUCT(($B$6:$B" & i & "=$B" & i & ")*H$6:H" & i & ")")
        Range("J" & m + 1) = Evaluate("SUMPRODUCT(($B$6:$B" & i & "=$B" & i & ")*J$6:J" & i & ")")
        ElseIf Range("G" & qishi) = "本年累计" Then
        n = qishi - 2
        Range("H" & n + 2) = Evaluate("SUMPRODUCT(($B$6:$B" & n & ">0)*H$6:H" & n & ")")
        Range("J" & n + 2) = Evaluate("SUMPRODUCT(($B$6:$B" & n & ">0)*J$6:J" & n & ")")
        End If


        Range("p" & qishi & ":u" & qishi) = Range("b" & qishi & ":g" & qishi).Value
        Range("ah" & qishi) = Range("i" & qishi)
        Range("au" & qishi) = Range("k" & qishi)
        Range("bh" & qishi) = Range("m" & qishi)

        If Range("h" & qishi) <> "" Then
            K1 = CStr(WorksheetFunction.Round(Range("h" & qishi) * 100, 0))
            For i = 1 To Len(K1)
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 33 - Len(K1) + i
                    Cells(qishi, f) = Mid(K1, i, 1)
                End If
            Next i
        End If

        If Range("j" & qishi) <> "" Then
            K1 = CStr(WorksheetFunction.Round(Range("j" & qishi) * 100, 0))
            For i = 1 To Len(K1)
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 46 - Len(K1) + i
                    Cells(qishi, f) = Mid(K1, i, 1)

                End If
            Next i
        End If

        If Range("l" & qishi) <> "" Then
            K1 = CStr(WorksheetFunction.Round(Range("l" & qishi) * 100, 0))
            For i = 1 To Len(K1)           '多次运算后这个地方LEN(K1) 始终是=4
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 59 - Len(K1) + i
                    Cells(qishi, f) = Mid(K1, i, 1)
                End If
            Next i
        End If
    Next qishi
    Range("N2") = qishi

    Application.ScreenUpdating = True
End Sub

回复

使用道具 举报

发表于 2010-7-29 15:01 | 显示全部楼层

好象是因为浮点计算的原因吧

 


Option Explicit

Sub d4()
    Dim lStart As Long
    Dim lEnd As Long
    Dim lLoop As Long
    Dim i As Long
    Dim m As Long, n As Long, f As Long
    Dim K1 As String
    
    lStart = Range("N2").Value            ' 起始
    lEnd = Range("G7").End(xlDown).Row    ' 结束
    Range("P" & lStart & ":BI65536").ClearContents
    'Range("P" & lStart & ":BI65536") = ""
    For lLoop = lStart To lEnd

        If Range("G" & lLoop) = "本月合计" Then
            m = lLoop - 1
            i = Range("C" & m + 1).End(xlUp).Row
            Range("H" & m + 1) = Evaluate("SUMPRODUCT(($B$6:$B" & i & "=$B" & i & ")*H$6:H" & i & ")")
            Range("J" & m + 1) = Evaluate("SUMPRODUCT(($B$6:$B" & i & "=$B" & i & ")*J$6:J" & i & ")")
        ElseIf Range("G" & lLoop) = "本年累计" Then
            n = lLoop - 2
            Range("H" & n + 2) = Evaluate("SUMPRODUCT(($B$6:$B" & n & ">0)*H$6:H" & n & ")")
            Range("J" & n + 2) = Evaluate("SUMPRODUCT(($B$6:$B" & n & ">0)*J$6:J" & n & ")")
        End If


        Range("P" & lLoop & ":U" & lLoop) = Range("B" & lLoop & ":G" & lLoop).Value
        Range("AH" & lLoop) = Range("I" & lLoop)
        Range("AU" & lLoop) = Range("K" & lLoop)
        Range("BH" & lLoop) = Range("M" & lLoop)

        ' 写入借方
        If Range("H" & lLoop) <> "" Then
            K1 = Format(Range("h" & lLoop) * 100, "0")
            For i = 1 To Len(K1)
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 33 - Len(K1) + i
                    Cells(lLoop, f) = Mid(K1, i, 1)
                End If
            Next i
        End If

        ' 写入贷方
        If Range("j" & lLoop) <> "" Then
            K1 = Format(Range("j" & lLoop) * 100, "0")
            For i = 1 To Len(K1)
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 46 - Len(K1) + i
                    Cells(lLoop, f) = Mid(K1, i, 1)

                End If
            Next i
        End If

        ' 写入余额
        If Range("l" & lLoop) <> "" Then
            K1 = Format(Range("l" & lLoop) * 100, "0")
            For i = 1 To Len(K1)           '多次运算后这个地方LEN(K1) 始终是=4
                If VBA.IsNumeric(Mid(K1, i, 1)) = True Then
                    f = 59 - Len(K1) + i
                    Cells(lLoop, f) = Mid(K1, i, 1)

                End If
            Next i
        End If
    Next lLoop
    Range("N2") = lStart


End Sub
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-17 03:46 , Processed in 0.290747 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表