ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: ghq200101

相同帐号的正负值抵消,如何提高VBA执行速度?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-2-11 10:07 | 显示全部楼层
  1. Sub 排序后对冲()
  2.     Application.ScreenUpdating = False
  3.     Set d = CreateObject("scripting.dictionary")
  4.     r = [a65536].End(3).Row
  5.     Range("a1:d" & r).Copy [f1]   '数据复制
  6.     Range("f2:i" & r).Sort key1:=[g2]       '按帐号排序
  7.     arr = Range("f1:i" & r)        'arr为源数组
  8.     For i = 2 To UBound(arr)
  9.         x = "'" & arr(i, 2)
  10.        d(x) = d(x) & "+" & i        '以账号为key,以账号所在行数为item(字符串累加)
  11.     Next
  12.     dk = d.keys: dt = d.items
  13.     For i = 0 To UBound(dk)
  14.         x = Split(dt(i), "+")      '行数分列
  15.         s1 = Val(x(1)): s2 = Val(x(UBound(x)))      's1为该账号的起始行,s2为结束行
  16.         For j = s1 To s2 - 1              '在起始行和结束行之间对冲,如果对冲,把金额置0
  17.             For k = j + 1 To s2
  18.                 If arr(j, 4) + arr(k, 4) = 0 Then
  19.                     arr(k, 4) = 0: arr(j, 4) = 0
  20.                     Exit For
  21.                 End If
  22.             Next
  23.         Next
  24.     Next
  25.     ReDim brr(1 To UBound(arr), 1 To 4)        'brr为显示数组
  26.     brr(1, 1) = arr(1, 1): brr(1, 2) = arr(1, 2)
  27.     brr(1, 3) = arr(1, 3): brr(1, 4) = arr(1, 4)
  28.     p = 1
  29.     For i = 2 To UBound(arr)
  30.         If arr(i, 4) <> 0 Then          '如果金额不为0(表示未经过对冲),则存入Brr用于最终显示
  31.             p = p + 1
  32.             brr(p, 1) = arr(i, 1): brr(p, 2) = arr(i, 2)
  33.             brr(p, 3) = arr(i, 3): brr(p, 4) = arr(i, 4)
  34.         End If
  35.     Next
  36.     Range("f:i").ClearContents
  37.     [f1].Resize(p, 4) = brr         '显示
  38.     Range("f2:i" & r).Sort key1:=[f2]        '重新按序号排序
  39.     Application.ScreenUpdating = True
  40. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-2-11 10:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请看附件。

Book2.rar

181.16 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2014-2-11 10:26 | 显示全部楼层
给个更快的,少了两重排序。
  1. Sub 分组后对冲()
  2.     Set d = CreateObject("Scripting.Dictionary")
  3.     arr = [a1].CurrentRegion  'arr为源数组
  4.     ra = UBound(arr)
  5.     For i = 2 To ra       '以账号为key,以账号所在行数为item(字符串累加)
  6.          d(arr(i, 2)) = d(arr(i, 2)) & "," & i
  7.     Next
  8.    
  9.     dk = d.keys: dt = d.items
  10.     p = 1
  11.     For i = 0 To UBound(dk)
  12.       x = Split(dt(i), ",")    '行数分列
  13.       s = UBound(x)
  14.       For j = 1 To s - 1      '在账号对应的各行之间对冲,如果对冲,把对应行的金额置0
  15.           h1 = Val(x(j)): a1 = arr(h1, 4)         '表示行h1对应的金额
  16.           For k = j + 1 To s
  17.               h2 = Val(x(k)): a2 = arr(h2, 4)    '表示行h2对应的金额
  18.               If a1 + a2 = 0 Then
  19.                   arr(h1, 4) = 0          '对应行的金额置0
  20.                   arr(h2, 4) = 0
  21.                   Exit For
  22.               End If
  23.           Next
  24.       Next
  25.     Next
  26.          
  27.     ReDim brr(1 To UBound(arr), 1 To 4)        'brr为显示数组
  28.       brr(1, 1) = arr(1, 1): brr(1, 2) = arr(1, 2)
  29.       brr(1, 3) = arr(1, 3): brr(1, 4) = arr(1, 4)
  30.       p = 1
  31.       For i = 2 To UBound(arr)
  32.           If arr(i, 4) <> 0 Then          '如果金额不为0(表示未经过对冲),则存入Brr用于最终显示
  33.               p = p + 1
  34.               brr(p, 1) = arr(i, 1): brr(p, 2) = arr(i, 2)
  35.               brr(p, 3) = arr(i, 3): brr(p, 4) = arr(i, 4)
  36.           End If
  37.       Next
  38.               
  39.     [f1].Resize(p, 4) = brr
  40. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-2-11 10:31 | 显示全部楼层
请看附件。分组对冲0.15秒,排序对冲0.20秒,快了25%。如果数据量再大点的话,估计对比会更明显。

Book2.rar

136.06 KB, 下载次数: 44

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-11 10:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
grf1973 发表于 2014-2-11 10:08
请看附件。

由衷的感谢,完全达到我理解中的要求,速度快,代码精练,佩服!{:soso_e179:}
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 11:43 , Processed in 0.027818 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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