我的电子表格上有一个按钮,点击后会触发一系列嵌套的潜艇。例如:
data t_lookup /view= t_lookup;
set monthlytable;
by subjID;
if first.subjID then id_range_count = 0;
id_range_count + 1;
run;
data want;
set eventstable;
if _n_ = 1 then do;
if 0 then set monthlytable(keep = subjID startdate enddate); /*Add extra lookup vars here as needed*/
declare hash h(dataset:"t_lookup");
rc = h.definekey("subjID","id_range_count");
rc = h.definedata("startdate","enddate"); /*Add extra lookup vars here as needed*/
rc = h.definedone();
end;
match = 0;
rc = 0;
do id_range_count = 1 by 1 while(rc = 0 and match = 0);
rc = h.find();
match = startdate < eventdate <= enddate;
end;
if match = 0 then call missing(startdate,enddate);
drop rc match id_range_count;
run;
因为运行所有这些子例程的时间可能相当冗长,并且用户在运行时无法在excel中执行任何其他操作,我想知道是否有一种方法可以创建一个按钮,单击该按钮时可以停止运行所有这些潜艇?我已经看到了在代码中添加Sub Button1_Click()
Macro1
Macro2
Macro3
Macro4
Macro5
Macro6
End Sub
的建议,但是,我不确定我的代码在哪里实现它。
非常感谢任何见解。
答案 0 :(得分:2)
DoEvents
语句将允许任何滞后的用户输入和事件处理。
您可能想要做的是重载OnKey
事件处理程序并使用它来设置全局变量的值。接下来在上面的代码中,您需要验证是否设置了该变量。如果是中止执行。请务必在代码中的任何时刻添加DoEvents
语句,以便运行它。
(可选),没有OnKey
处理程序,DoEvents
将允许用户点击 ESC 来停止执行宏。但它将恢复为调试模式并突出显示过程中当前执行的行。不确定这是你想要的。
说完......我个人认为你应该做的 FIRST 是优化你的VBA代码。我认为可能有很大的空间来改善程序的执行时间(my tutorial)。
答案 1 :(得分:0)
您可以创建宏以执行以下步骤/操作,并在想要中止其他正在运行的宏时调用:
步骤1-菜单栏->运行->重置
第2步-菜单栏->运行->中断