Excel精英培训网

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

求助:改善循环运行效率

[复制链接]
发表于 2012-5-25 17:14 | 显示全部楼层 |阅读模式
目的是用sheet1里面的数据计算出sheet2的结果
各列计算的要求在sheet2标题的批注里

另外,sheet1里的数据每天会自动更新,新数据都是从第二行写入
比如,现在数据在2-10行,那么自动更新后数据就在2-11行,其中第2行是新数据,3-11行是前一天2-10行的旧数据

现在我完全用循环写的,由于数据量很大,程序非常慢
请问有什么好办法能提高效率吗?

感谢帮助!

工作簿1.zip (4.96 KB, 下载次数: 8)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-5-25 17:22 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2012-5-25 17:48 | 显示全部楼层
本帖最后由 令狐风 于 2012-5-25 17:49 编辑
play9091 发表于 2012-5-25 17:22
把你的代碼也付上來吧!


代码都是最笨的循环
见笑了!
不过这个是针对真实的文件的,跟上面那个举例子用的附件不完全吻合


  1. Sub CopyData()
  2.   
  3.     Dim i%, j%, sum!
  4.     With Sheets("修正数据")
  5.    
  6.         For i = 3 To Sheets("原始数据1").Cells(Rows.Count, 1).End(xlUp).Row
  7.             .Cells(i - 1, 1) = Sheets("原始数据1").Cells(i, 1)   '直接copy数据
  8.             For j = (i - 1) To Sheets("原始数据1").Cells(Rows.Count, 1).End(xlUp).Row     '需要填充空单元格
  9.                 If Sheets("原始数据1").Cells(j + 1, 2) <> "" Then
  10.                     .Cells(i - 1, 2) = Sheets("原始数据1").Cells(j + 1, 2)
  11.                     Exit For
  12.                 End If
  13.             Next j
  14.             .Cells(i - 1, 3) = Sheets("原始数据1").Cells(i, 3)
  15.             sum = 0                                                      
  16. '需要求20周期移动平均

  17.             For j = 1 To 20
  18.                 sum = sum + Sheets("原始数据1").Cells(i + j - 1, 4)
  19.             Next j
  20.             .Cells(i - 1, 4) = sum / 20
  21.             .Cells(i - 1, 5) = Sheets("原始数据1").Cells(i, 5)
  22.             For j = (i - 1) To Sheets("原始数据1").Cells(Rows.Count, 1).End(xlUp).Row
  23.                 If Sheets("原始数据1").Cells(j + 1, 6) <> "" Then
  24.                     .Cells(i - 1, 6) = Sheets("原始数据1").Cells(j + 1, 6)
  25.                     Exit For
  26.                 End If
  27.             Next j
  28.             For j = 7 To 11                                       '需要做加减计算
  29.                 .Cells(i - 1, j) = Sheets("原始数据1").Cells(i, j + 5) + .Cells(i - 1, 2) - Sheets("原始数据1").Cells(i, j)
  30.             Next j
  31.             For j = 12 To 15
  32.                  .Cells(i - 1, j) = Sheets("原始数据1").Cells(i, j + 5) + .Cells(i - 1, 5) - Sheets("原始数据1").Cells(i, j - 5)
  33.             Next j
  34.             For j = 16 To 20
  35.                 .Cells(i - 1, j) = Sheets("原始数据1").Cells(i, j + 10) + .Cells(i - 1, 2) - Sheets("原始数据1").Cells(i, j + 5)
  36.             Next j
  37.             For j = 21 To 24
  38.                  .Cells(i - 1, j) = Sheets("原始数据1").Cells(i, j + 10) + .Cells(i - 1, 5) - Sheets("原始数据1").Cells(i, j)
  39.             Next j
  40.         Next i
  41.       
  42. End With
  43.    
  44.     End Sub
复制代码


回复

使用道具 举报

发表于 2012-5-25 17:51 | 显示全部楼层
  1. Sub auto_sheet2()
  2.   Dim src, tmp1#, tmp2#, i&
  3.   src = Sheet1.Range("A2", Sheet1.[A65536].End(xlUp)).Resize(, 8)
  4.   For i = UBound(src) To 1 Step -1
  5.   '2
  6.      If IsEmpty(src(i, 3)) Then
  7.        src(i, 3) = tmp1
  8.      Else
  9.        tmp1 = src(i, 3)
  10.      End If
  11. '3
  12.    tmp2 = src(i, 4)
  13.    src(i, 4) = src(i, 5) - tmp2
  14.    src(i, 5) = src(i, 6) - tmp2
  15.    src(i, 6) = src(i, 8) + src(i, 3) - src(i, 7)
  16.   Next
  17.   Sheet2.Range("A2").Resize(UBound(src), 6) = src
  18. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 16:07 , Processed in 0.265272 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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