问题自已已经解决
一个就够了:
DoEvents在循环结构中的技巧
--------------------------------------------------------------------------------
通常是将DoEvents加在循环结构中,以便于在运行循环的同时可以进行其他操作。举个例子:
例如我们需要求1+2+3+4+...+10000的值,我们可以写一个Sub如下
Sub MySub()
[a1] = 0
For i = 1 To 10000
[a1] = [a1] + i
Next
End Sub
这段代码肯定没有问题,绝对准确。不过在我们运行这段代码的时候,我们发现:
1、鼠标指针变成了忙碌状态
2、在运行的过程中不能移动Excel窗口或者在Excel中进行其他操作,也就是Excel处于“假死”状态
这时我们可以在For……Next循环中加入一个DoEvents语句,现在代码变成了下面这个样子:
Sub MySub()
[a1] = 0
For i = 1 To 10000
DoEvents
[a1] = [a1] + i
Next
End Sub
我们再次运行添加了DoEvents语句的代码。我们发现刚刚我们遇到的假死状态不存在了。系统运算他的,我们继续我们的工作,想怎么操作就怎么操作,是不是很爽呢?
不过事物都有两面性,有优点肯定也存在不足或者某种隐藏的危险。首先,加入DoEvents后,代码的运行效率会打折扣,这个很好理解,专专心心的干一件事总比三心二意强吧!其次,在关于DoEvents的帮助文件最后有这么一段:
小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。(这里的意思是:比如上面的MySub在用DoEvents转交控制权后,被另外一个过程接(假设是Sub1)管了控制权,Sub1中又调用MySub这种情况) 此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。(这一点也可以举个例子,也拿上面的那段代码做例子。那个代码的本意是在单元格A1中求1+2+3+...+10000的和,但现在我们加入一个Doevents后,程序每循环一次后都会释放一下控制权让系统有机会去处理其他的事情,就是因为这样我们才有机会在他运算时继续操作Excel。很不幸的是,我们在那个代码运算过程中手工在A1中输入了一个不知多大的数,然后那个代码继续运算,还是老老实实的[a1]=[a1]+i,结果可想而知,99%不会等于1到10000累加的和,因此在那种情况下释放控制权是有隐患的,虽然你可能不会去更改A1,但只要有1%的可能就是隐患)