Excel精英培训网

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

[已解决]求助帮忙优化这段FOR循环,我这样条数多了直接execl未响应

[复制链接]
发表于 2017-8-7 14:27 | 显示全部楼层 |阅读模式
本帖最后由 ccc919 于 2017-8-7 14:34 编辑

  1. '=================================起始===============================
  2. ar = Sheet3.Range("d5:d" & Sheet3.[a65536].End(3).Row)
  3. For i = 1 To UBound(ar)
  4.     If ar(i, 1) Like "*Φ*×*" Then
  5.         a = Split(ar(i, 1), "Φ")(1)
  6.         b = Split(a, "×")
  7.         c1 = Val(b(0))
  8.         c2 = Val(b(1))
  9.         c3 = Val(b(2))
  10.          '============================计算工作量===================
  11.             ar1 = Sheet1.Range("o5:o" & Sheet1.[a65536].End(3).Row)
  12.             ar2 = Sheet1.Range("p5:p" & Sheet1.[a65536].End(3).Row)
  13.             ar3 = Sheet1.Range("q5:q" & Sheet1.[a65536].End(3).Row)
  14.             ar4 = Sheet1.Range("r5:r" & Sheet1.[a65536].End(3).Row)
  15.             ar5 = Sheet1.Range("s5:s" & Sheet1.[a65536].End(3).Row)
  16.             ar6 = Sheet1.Range("t5:t" & Sheet1.[a65536].End(3).Row)
  17.             ar7 = Sheet1.Range("u5:u" & Sheet1.[a65536].End(3).Row)
  18.             ar8 = Sheet1.Range("v5:v" & Sheet1.[a65536].End(3).Row)
  19.             For ii = 1 To UBound(ar1)
  20.             For iii = 1 To UBound(ar2)
  21.             For iiii = 1 To UBound(ar3)
  22.             For iiiii = 1 To UBound(ar4)
  23.             For iiiiii = 1 To UBound(ar5)
  24.             For iiiiiii = 1 To UBound(ar6)
  25.             For iiiiiiii = 1 To UBound(ar7)
  26.             If c3 >= 0 And c3 < 65535 Then
  27.             ar(i, 1) = Format(((3.14 * (c1 / 1000)) * ar1(i, 1)) + (2 * ar2(i, 1)) + (3.14 * (c1 / 1000) * (0.5 * ar3(i, 1))) + (2 * ar4(i, 1)) + (3 * ar5(i, 1)) + (1.5 * ar6(i, 1)) + (1.5 * ar7(i, 1)) + (1 * ar8(i, 1)), "0.00")
  28.             Else
  29.             ar(i, 1) = ""
  30.             End If
  31.             Next
  32.             Next
  33.             Next
  34.             Next
  35.             Next
  36.             Next
  37.             Next

  38.         '============================================================
  39.     Else
  40.         ar(i, 1) = ""
  41.     End If
  42. Next
  43. Sheet3.Range("o5").Resize(UBound(ar), 1) = ar
复制代码



求各位帮忙优化FOR循环,谢谢

最佳答案
2017-8-7 16:01
本帖最后由 大灰狼1976 于 2017-8-7 16:02 编辑

至少简化成这样估计运行也没有问题。
  1. '=================================起始===============================
  2. ar = Sheet3.Range("d5:d" & Sheet3.[a65536].End(3).Row)
  3. ar1 = Sheet1.Range("o5:v" & Sheet1.[a65536].End(3).Row)
  4. For i = 1 To UBound(ar)
  5.     If ar(i, 1) Like "*Φ*×*" Then
  6.         a = Split(ar(i, 1), "Φ")(1)
  7.         b = Split(a, "×")
  8.         c1 = Val(b(0))
  9.         c2 = Val(b(1))
  10.         c3 = Val(b(2))
  11.          '============================计算工作量===================
  12.             If c3 >= 0 And c3 < 65535 Then
  13.                 ar(i, 1) = Format(((3.14 * (c1 / 1000)) * ar1(i, 1)) + (2 * ar1(i, 2)) + (3.14 * (c1 / 1000) * (0.5 * ar1(i, 3))) + (2 * ar1(i, 4)) + (3 * ar1(i, 5)) + (1.5 * ar1(i, 6)) + (1.5 * ar1(i, 7)) + (1 * ar1(i, 8)), "0.00")
  14.             Else
  15.                 ar(i, 1) = ""
  16.             End If

  17.         '============================================================
  18.     Else
  19.         ar(i, 1) = ""
  20.     End If
  21. Next
  22. Sheet3.Range("o5").Resize(UBound(ar), 1) = ar
复制代码
发表于 2017-8-7 14:53 | 显示全部楼层
我去 那么多for,我还重来没有用过那么多循环
回复

使用道具 举报

发表于 2017-8-7 15:50 | 显示全部楼层
首先,你判断末行用了[a65536].end(3).row,那么意味着ar1~ar8的结构是一模一样的,而且各列相邻,所以ar1~ar8用一个数组就能代替了,其次,代码太复杂,看起来费劲,不如上个附件,说明一下要求,说不定有更简单高效的方法。
回复

使用道具 举报

发表于 2017-8-7 15:55 | 显示全部楼层
还有,你的ii、iii、iiii....变量很多,循环很多,实际上这些变量都没有参与计算,那就意味着不需要这些循环。
虽然没有看到你的文件,但我估计你的要求在15~20行代码之间可以完成。
回复

使用道具 举报

发表于 2017-8-7 16:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 大灰狼1976 于 2017-8-7 16:02 编辑

至少简化成这样估计运行也没有问题。
  1. '=================================起始===============================
  2. ar = Sheet3.Range("d5:d" & Sheet3.[a65536].End(3).Row)
  3. ar1 = Sheet1.Range("o5:v" & Sheet1.[a65536].End(3).Row)
  4. For i = 1 To UBound(ar)
  5.     If ar(i, 1) Like "*Φ*×*" Then
  6.         a = Split(ar(i, 1), "Φ")(1)
  7.         b = Split(a, "×")
  8.         c1 = Val(b(0))
  9.         c2 = Val(b(1))
  10.         c3 = Val(b(2))
  11.          '============================计算工作量===================
  12.             If c3 >= 0 And c3 < 65535 Then
  13.                 ar(i, 1) = Format(((3.14 * (c1 / 1000)) * ar1(i, 1)) + (2 * ar1(i, 2)) + (3.14 * (c1 / 1000) * (0.5 * ar1(i, 3))) + (2 * ar1(i, 4)) + (3 * ar1(i, 5)) + (1.5 * ar1(i, 6)) + (1.5 * ar1(i, 7)) + (1 * ar1(i, 8)), "0.00")
  14.             Else
  15.                 ar(i, 1) = ""
  16.             End If

  17.         '============================================================
  18.     Else
  19.         ar(i, 1) = ""
  20.     End If
  21. Next
  22. Sheet3.Range("o5").Resize(UBound(ar), 1) = ar
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-8-7 16:29 | 显示全部楼层
大灰狼1976 发表于 2017-8-7 16:01
至少简化成这样估计运行也没有问题。

谢谢,原来多个列数组可以这样循环表示。这样一个for就可以搞定了
回复

使用道具 举报

发表于 2017-10-10 09:54 | 显示全部楼层
学习中
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 12:39 , Processed in 0.661366 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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