数据透视表0总和显示为E-15科学计数法,如何筛选删除主表对应数据
你遇到的总和为0显示为E-15科学计数法的问题,是Excel浮点数运算的固有精度误差,属于软件本身特性,和你的VBA代码无关,手动创建透视表也会出现是因为小数累加时产生的极小偏差值,本质是近似0的数值,不是代码错误。
你不需要强制切换透视表以外的方案,现有逻辑稍作修改就能实现需求,也可以选择更高效的非透视表方案,两种实现方式如下:
方案1:修改现有透视表VBA逻辑
你现在的逻辑是把透视表结果复制为值后处理,只需要在粘贴为值的步骤后新增一段容错判断,把小于1E-6的数值统一判定为0,就可以正常筛选0值条目:
' 你原有粘贴为值的代码 Columns("A:B").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ' 新增以下判断逻辑 Dim rng As Range On Error Resume Next For Each rng In Range("B:B").SpecialCells(xlCellTypeConstants, xlNumbers) If Abs(rng.Value) < 0.000001 Then rng.Value = 0 Next On Error GoTo 0 ' 后续继续走你原有删除多余行、筛选0值Doc Number、回主表删除对应记录的逻辑即可
方案2:无需透视表的高效实现方案
如果你的数据量不大,可以直接用字典按Doc Number汇总金额,跳过透视表创建、复制粘贴的冗余步骤,运行效率更高,也不会碰到透视表浮点数显示的问题:
Sub DeleteZeroSumDoc() Dim arr, dic As Object, i As Long, key As String Set dic = CreateObject("Scripting.Dictionary") ' 读取ACCL表数据,注意修改下面的列号匹配你表的实际结构 arr = Sheets("ACCL").UsedRange.Value ' 第一步:按Doc Number汇总LT 1 Amount For i = 2 To UBound(arr) ' 假设Doc Number在第1列,不对请修改括号内的列号 key = CStr(arr(i, 1)) If Not dic.exists(key) Then dic(key) = 0 ' 假设LT 1 Amount在第3列,不对请修改括号内的列号 dic(key) = dic(key) + arr(i, 3) Next ' 第二步:倒序删除主表中汇总值近似为0的对应行 For i = UBound(arr) To 2 Step -1 key = CStr(arr(i, 1)) If Abs(dic(key)) < 0.000001 Then Sheets("ACCL").Rows(i).Delete End If Next Set dic = Nothing End Sub
内容的提问来源于stack exchange,提问作者kamal_hamad
相关产品推荐
相关产品推荐

