发布网友
共1个回答
热心网友
凡事有利必有弊,在用时较长的循环中,可能会造成假死现象。
DoEvents可以把控制权转让给操作系统,程序转到后台运行,可以避免假死,让你可以在你的电脑上做一些其他的事情。
但是隐患也很大,在程序未执行完之前,请不要对EXCLE工作簿进行任何操作,如括不要切换工作表、不要对表格进行编辑等等,以免造成不可预知的错误。
另外,专心做一件事,肯定比三心二意更省时间,让系统专心运行程序,比你在运行程序的同时再在电脑上做其他的事情更节省时间。
还有就是,你说每次重算需要45秒,这样每单次的循环需要重算三次,大约需要2至3分钟,你要循环360次的话,需要12至18小时,这个是硬伤,你要有心理准备,能打持久止战就行。
代码和图片如下:
Sub 循环重算处理()
Dim i&, iZhi1$, iZhi2$, iCs$
'索要初始值1
Application.Speech.Speak "请输入第一个初始数值"
iZhi1 = InputBox("请输入第一个初始数值", "初始数值1")
If iZhi1 = "" Then Exit Sub
'索要初始值2
Application.Speech.Speak "请输入第二个初始数值"
iZhi2 = InputBox("请输入第二个初始数值", "初始数值2")
If iZhi2 = "" Then Exit Sub
'索要循环次数
Application.Speech.Speak "请输入循环次数"
iCs = InputBox("请输入循环次数", "循环次数")
If iCs = "" Then
Exit Sub
ElseIf Val(iCs) < 1 Then
MsgBox "循环次数不能<1,程序已中止!", , "提示"
Exit Sub
End If
'确认参数,如果参数有误,给予取消执行的机会
Application.Speech.Speak "请确认参数,若参数有误可取消执行"
If MsgBox("请确认仨参数:" & vbLf & vbLf & _
"初始值1:" & iZhi1 & vbLf & "初始值2:" & iZhi2 & vbLf & _
"循环次数:" & iCs, vbOKCancel, "请确认参数") = vbCancel Then Exit Sub
'开始循环
For i = 1 To Val(iCs) '遍历1到iCs
Range("D3") = iZhi1 '把第一个值写入D3
Application.Calculate '所有工作簿重算
If Not Application.CalculationState = xlDone Then DoEvents '转让控制权
Application.Calculate '所有工作簿重算
If Not Application.CalculationState = xlDone Then DoEvents '转让控制权
Range("C9") = iZhi2 '把第二个值写入C9
Application.Calculate '所有工作簿重算
If Not Application.CalculationState = xlDone Then DoEvents '转让控制权
iZhi1 = iZhi1 + 1 '累加
iZhi2 = iZhi2 + 1 '累加
Next
Application.Speech.Speak "处理完毕"
MsgBox "处理完毕!", , "提示"
End Sub