VBA - 在执行下一个子程序之前等待一段时间

3

我有一个子程序可以运行另外两个宏,但我需要它先运行第一个,等待1分钟后再运行第二个。

我在网上查找并收集到以下信息:

Sub MainExecute
stdB18
Application.Wait(Now + TimeValue(0:01:00"))
runB18
End Sub

问题在于,当我这样做时,它似乎不会等到stdB18 运行后再运行,而是在运行任何东西前等待1分钟。
我还尝试在runB18 顶部放置wait,但这将使整个应用程序也等待运行。有没有办法让我只能先运行stdB18 ,然后等待1分钟,再运行runB18
谢谢!
编辑:我需要等待的原因是因为我需要等待我的QueryTable(在stdB18 中刷新)加载完成,然后才能执行runB18,在其中我有for循环将从表中提取数据。

3
当然,这是一个XY问题,但我不认为它是一个重复的问题。 - M--
1
这是一个重复问题,因为实际问题相同,无论OP认为解决方案可能是什么。在其他关于QT刷新的线程中,至少有2或3种方法可以用来在表格刷新后运行过程,很难理解为什么这些不适合回答这个问题。当然,“Application.OnTime”是“如何在指定(未来)时间运行过程”的严格答案,但这并不是真正的问题(如果是,我可能会找到另一个不太适用的答案来重复它)。@Masoud - David Zemens
1
@Masoud 我同意你的观点。也许楼主不知道问题的根本原因,而是卡在了其他地方。 - Subodh Tiwari sktneer
@sktneer 或许 OP 不知道,但现在他/她知道了,并且(希望)至少学到了三件事情:Wait 和 OnTime 的区别,为什么两者都不是这个特定问题的理想解决方案,以及最终针对 OP 的具体问题陈述的实际解决方案。 :) - David Zemens
2
@DavidZemens,你的假设可能是正确的,但如果其他人遇到了同样的问题,关闭他们自我纠正的机会是没有意义的。 - Subodh Tiwari sktneer
2
@DavidZemens 我知道你的意思。我在这里的观点是,几乎不可能有人想知道如何在表格刷新后运行宏而落在这个帖子上。重复部分地帮助搜索引擎选择不同的措辞。这个问题实际上并没有问如何在表格刷新后运行子程序。所以,在我看来,它不是你指出的那个帖子的重复。但这并不太重要。只是表达我的观点。干杯。 - M--
3个回答

7
通常使用.Refresh来运行查询。只需添加BackgroundQuery:=False,这样代码将等待查询表刷新完成,您就不需要使用Application.Wait了,因为您不知道查询需要多长时间才能完成。
所以尝试...
.Refresh BackgroundQuery:=False

我在其他的QueryTables中一直在使用它,但实际上我从来没有弄清楚它到底是做什么的,我只知道它起作用,但现在我明白了!谢谢! :) - elguapo

6
您需要使用 Application.OnTime
Sub MainExecute

  Application.OnTime Now() + TimeValue("0:01:00"), "runB18"
  stdB18

End Sub

嘿,谢谢回复!不过这个方法给了我同样的问题,它让MainExecute等待一分钟,而不是先执行stdB18然后再运行B18。 - elguapo
@vba.Beginner 不行。如果在1分钟内stdB18完成,它将运行runB18。你不能同时运行两个模块。 - M--
哦,嘿,是的,第二次运行后它起作用了。谢谢! - elguapo

1
你让整个应用程序等待,相反地,设置一个定时器,在一分钟后创建一个事件,然后创建一个例程来捕获此事件并运行第二个例程。

提供一个答案。这是一条评论,由于您的声望超过50,因此可以在任何地方发布评论。 - M--
谢谢您的回复,但我对编程还很陌生(大约一周前开始学习VBA),不太确定如何执行此操作。您能给我提供一些指导吗? - elguapo
1
@PGCodeRider 请阅读这两篇文章:https://meta.stackexchange.com/questions/4217/why-do-some-people-answer-in-comments 和 https://meta.stackexchange.com/questions/17447/answer-or-comment-whats-the-etiquette - M--

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接