ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请前辈们看下怎么优化能让代码毒素更快

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-26 22:17 | 显示全部楼层 |阅读模式
  1. Sub 区域国家定价()
  2.     Dim i, x, d, wt As Long, f1, f2 As Double, sh As Worksheet
  3.     'wt = Cells(2, 9)      '克重值
  4.     For x = 5 To Cells(Rows.Count, 2).End(xlUp).Row      '统计商品id列表的行数
  5.     wt = Cells(x, 9)
  6.         For Each sh In Worksheets      '遍历工作表名称
  7.             If sh.Name = Cells(x, 7) Then      '查找符合邮寄方式的运费工作表
  8.                 For i = 2 To sh.Cells(Rows.Count, 3).End(xlUp).Row      '统计运费表国家列的行数
  9.                     For d = 11 To Sheet7.Cells(3, Columns.Count).End(xlToLeft).Column        '统计第三行区域国家的列数
  10.                         If Sheet7.Cells(3, d) = sh.Cells(i, 3) Then       '在符合邮寄方式的运费工作表中匹配目的国
  11.                         If wt > sh.Cells(i, 4) And wt <= sh.Cells(i, 5) Then       '判断重量的区间范围
  12.                             If wt <= sh.Cells(i, 6) Then       '判断重量的首重
  13.                                 f1 = sh.Cells(i, 7) + sh.Cells(i, 10)       '当前面条件成立并且小于等于首重的计算方法:首重运费+挂号费
  14.                                 Cells(x, d + 1) = ((Cells(x, 8) + f1 + Cells(2, 12)) / (1 - Cells(2, 5) - Cells(2, 7) - Cells(2, 9))) / 0.6   '根据25%利润率计算出来的售价价格
  15.                             Else
  16.                                 f2 = sh.Cells(i, 7) + Application.Ceiling(((wt - sh.Cells(i, 6)) / sh.Cells(i, 8)), 1) * sh.Cells(i, 9) + sh.Cells(i, 10)      '当前面条件成立并且大于首重的计算方法:首重运费+(克重-首重)/续重单位重量*续重单价+挂号费
  17.                                 Cells(x, d + 1) = ((Cells(x, 8) + f2 + Cells(2, 12)) / (1 - Cells(2, 5) - Cells(2, 7) - Cells(2, 9))) / 0.6    '根据25%利润率计算出来的售价价格
  18.                             End If
  19.                         End If
  20.                     End If
  21.                     Next d
  22.         
  23.                 Next i
  24.             End If
  25.         Next sh
  26.     Next x
  27. End Sub
复制代码
由于数据太多,此代码运行速度比较慢,要运行至少1分钟时间,各位前辈有没有什么好的思路能让代码运行速度更快

数据中心.zip

702.28 KB, 下载次数: 21

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-26 22:39 | 显示全部楼层
自己给自己顶一下

TA的精华主题

TA的得分主题

发表于 2024-8-27 03:19 | 显示全部楼层
频繁读写工作表单元格导致代码运行速度慢,请使用数组+字典提速

TA的精华主题

TA的得分主题

发表于 2024-8-27 07:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用字典+数组,速度会快很多。
就是你没有需求说明,光看你代码,要理解你的需求还是需要费不少时间的。建议还是你自己改一下吧。

TA的精华主题

TA的得分主题

发表于 2024-8-27 08:14 | 显示全部楼层
taller 发表于 2024-8-27 03:19
频繁读写工作表单元格导致代码运行速度慢,请使用数组+字典提速

3楼说的对。循环中去切记不要总是去频繁读写单元格,这是影响速度的最主要因素。一般的做法,都是先将工作表中要处理的单元格区域一次性读取到数组里,arr=range.value ,一条语句就可以。后续对单元格的操作都转向对数组元素的操作。cells(i,j) 完全可以对应数组元素 arr(i,j)。等数组操作完毕,就可以写回到单元格,range.value=arr 一条语句就可以完成。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-27 08:51 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
taller 发表于 2024-8-27 03:19
频繁读写工作表单元格导致代码运行速度慢,请使用数组+字典提速

谢谢 我尝试改一下试试

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-27 08:52 来自手机 | 显示全部楼层
ykcbf1100 发表于 2024-8-27 07:44
用字典+数组,速度会快很多。
就是你没有需求说明,光看你代码,要理解你的需求还是需要费不少时间的。建 ...

谢谢 我尝试改一下试试看

TA的精华主题

TA的得分主题

发表于 2024-8-27 09:29 | 显示全部楼层
  1. Sub test()
  2.     Dim r%, i%
  3.     Dim arr, brr
  4.     Dim ws As Worksheet
  5.     Dim d As Object
  6.     Application.ScreenUpdating = False
  7.     Application.DisplayAlerts = False
  8.     Set d = CreateObject("scripting.dictionary")
  9.     tt = Timer
  10.     For Each ws In Worksheets
  11.         If ws.Name <> "线上产品运营" Then
  12.             Set d(ws.Name) = CreateObject("scripting.dictionary")
  13.             With ws
  14.                 .AutoFilterMode = False
  15.                 r = .Cells(.Rows.Count, 1).End(xlUp).Row
  16.                 arr = .Range("a2:o" & r)
  17.                 For i = 1 To UBound(arr)
  18.                     d(ws.Name)(arr(i, 3)) = Array(arr(i, 4), arr(i, 5), arr(i, 6), arr(i, 7), arr(i, 8), arr(i, 9), arr(i, 10))
  19.                 Next
  20.             End With
  21.         End If
  22.     Next
  23.     With Worksheets("线上产品运营")
  24.         .AutoFilterMode = False
  25.         cs = .Range("a2:l2")
  26.         r = .Cells(.Rows.Count, 2).End(xlUp).Row
  27.         c = .Cells(4, .Columns.Count).End(xlToLeft).Column
  28.         arr = .Range("a3").Resize(r - 2, c)
  29.         For i = 3 To UBound(arr)
  30.             If d.exists(arr(i, 7)) Then
  31.                 For j = 11 To UBound(arr, 2) Step 2
  32.                     If d(arr(i, 7)).exists(arr(1, j)) Then
  33.                         brr = d(arr(i, 7))(arr(1, j))
  34.                         If arr(i, 9) > brr(0) And arr(i, 9) < brr(1) Then
  35.                             If arr(i, 9) <= brr(2) Then
  36.                                 arr(i, j + 1) = (arr(i, 8) + brr(3) + brr(6) + cs(1, 12)) / (1 - cs(1, 5) - cs(1, 7) - cs(1, 9)) / 0.6
  37.                             Else
  38.                                 f2 = brr(4) + Application.Ceiling((arr(i, 9) - brr(2)) / brr(4), 1) * brr(5) + brr(6)
  39.                                 arr(i, j + 1) = (arr(i, 8) + f2 + cs(1, 12)) / (1 - cs(1, 5) - cs(1, 7) - cs(1, 9)) / 0.6
  40.                             End If
  41.                         End If
  42.                     End If
  43.                 Next
  44.             End If
  45.         Next
  46.         .Range("a3").Resize(r - 2, c) = arr
  47.     End With
  48.     Application.ScreenUpdating = True
  49.     MsgBox Timer - tt
  50. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-8-27 09:29 | 显示全部楼层
参与一下。

数据中心.rar

717.4 KB, 下载次数: 25

TA的精华主题

TA的得分主题

发表于 2024-8-27 21:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
WPS里的JSA练习一下——


微信截图_20240827212737.png

微信截图_20240827213021.png


240827_数据中心.rar

671.16 KB, 下载次数: 5

用WPS打开并启用宏

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

本版积分规则

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

GMT+8, 2024-11-18 17:33 , Processed in 0.039929 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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