求高手简化我这初学的的VBA代码。现在计算1550行1列的数据要1分钟才完成

Sub 分析()

rq = 2 '变量声明,表16起始基础变量
rw = 5 '变量声明,表2起始的基础变量
re = 0 '变量声明,给否定的基础变量
rt = 4 '变量声明,基数参照变量

Do Until Sheet16.Cells(rq, 3) = "" '开始进入循环判断,执行到空单元格跳出。
rq = rq + 1
rw = rw + 1
re = re + 1
rt = rt + 1
a = Sheet16.Cells(rq, 3) '获取表16(rq&3)单元格的值
pp = Cells(rt, 3) '获取表当前表(rq&3)单元格的值
oo = re
If a <> 1 And a <> pp Then '用于判断两个结果
Cells(rw, 3) = oo '如果表16中A3单元的值不等于表2中c5单元格的值并不能为1在表二A6单元格写入1

Else
Cells(rw, 3) = "●" '如果表16中A3单元的值不等于表2中c5单元格的值在表二A6单元格写入●
re = re - re '出现●符号后,否定变量RE重置为0
End If
Loop

End Sub
为什么说这代码慢,原因如下
本来使用=IF(data!B4="","",IF(COUNTIF(data!$C4:data!$H4,D$5),"●",IF(D6<>"●",D6+1,1)))
引用的DATA!就是表16,这表随时整页涮新,这种IF语句在5万多个单元格内使用。打开工作表后不不用等待,刷新也即刻完成!

以上VBA本人初学自写,能达到最终结果,但运算太慢,要等待1分钟才能操作,DATA!工作表每天加入数据。
求高人指点!

计算慢的原因是:

你的Excel中存在的大量的公式,而你每次使用VBA语句像表中写入数据时Excel会自动重新计算公式的值,计算完毕后又会刷新屏幕。虽然Excel的公式计算速度很快,但刷新屏幕也会耗时,你写入1000个数据就等于Excel中的公式重新计算1000次+刷新1000次屏幕。速度自然慢了。


解决方法(基于Excel2007或以上版本),代码更改如下:

Sub 分析()
    '这里你的dim语句(变量声明)
    Application.Calculation = xlCalculationManual  'Excel计算模式为当用户请求时才计算
    Application.ScreenUpdating = False  'Excel不刷新屏幕
    
    '这里你的其他代码
    Application.Calculation = xlCalculationAutomatic  'Excel计算模式恢复为自动计算
    Application.ScreenUpdating = True 'Excel执行屏幕刷新
End Sub

如果是Excel2003版,由于不支持Application.Calculation属性(我只是从帮助文件看到,没有亲自验证,个人觉得应该有等同的方法),可以在Excel工具→选项里将计算模式改为手动,代码执行完后按F9或者再把计算模式改回来。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-12
把表与代码发我邮箱,举例说清楚目的与要求![email protected]追问

已经发到给您,请查收,帮忙改一下,谢谢

拿data表中循环指定的单元格值到表“趋势图的进行运算分析”

按条件判断显示如下表:

第2个回答  2013-09-12
宏的运行速度比函数慢,但是提供了更多的功能,所以慢一些是肯定的。
不刷屏可以提速。
Application.DisplayAlerts = False 不显示屏幕变化

Application.DisplayAlerts = True 恢复显示

函数只有vlookup之类的运行较慢,其他函数是很快的,你用的是if函数,不应该慢。

在vb界面,按F8,逐行运行,可以监视运行过程,找出慢的原因。追问

在VB界面单步调试正常,
用VBA循环计算了1550个,(只计算了一列,共33列)
而用函数计算同时计算5万多个,反而比VBA代码快,不明白这点?
是不是我使用的代码不合适?

追答

我第一句就解释了,主要是你想要啥样的结果,宏可以自动完成不断的变化,函数只能变一次。

宏的运行速度比函数慢,但是提供了更多的功能,所以慢一些是肯定的。

你的语句没有问题,加上我写的前一句,可以加速。我用的是Excel2003