如何从打开工作簿中提取处理%以进行状态栏更新?

时间:2017-09-13 16:09:26

标签: excel vba excel-vba

所以我有一些大的宏可以打开/关闭大型工作簿,不幸的是这些工作簿需要一些时间来打开/加载/计算。当我手动打开它时,我可以在初始屏幕上看到开头百分比:

enter image description here

此处文件状态栏上的计算%:

Processing picture

我想知道的是我如何抓住这些百分比并将其转发到我的主要工作簿的状态栏,以达到以下效果:

Application.DisplayStatusBar = True
Application.StatusBar = "Opening production file... " & Workbooks("Book1").LoadingPercentage & " of the way complete..."

我非常喜欢通过状态栏更新我的用户,所以当状态栏只显示Opening production file...并挂起20秒时,他们可能会担心程序会冻结。我可以只有一个计数器,每秒递增一次,但这将是不一致的,并不一定证明程序没有冻结/崩溃。

有没有办法可以从开放的工作簿中获取这个数字?或者有任何一种聪明的解决方法吗?我浏览了Workbooks("Book1").的属性,并没有看到我可以使用的任何内容。

1 个答案:

答案 0 :(得分:2)

你不能。

该指令同步运行:

Set wb = Workbooks.Open(path)

之后的指令只会在文件加载完毕后运行并且设置wb对象引用。

据我所知,无法在Excel中异步打开工作簿。如果有,那么API可能会暴露事件,例如OnOpenProgress或类似事件,您可以处理这些事件,比如说:

Private WithEvents app As Excel.Application

'...

Private Sub app_OnOpenProgress(ByVal path As String, ByVal percentComplete As Double, ByRef Cancel As Boolean)
    Application.StatusBar = "Opening " & path & "... (" & Format(percentComplete, "0.0%") & ")"
End Sub

但这不是目前可能的AFAIK。

我能看到这一点的唯一方法是实现自己的Workbooks.Open方法,该方法返回Excel.Workbook个对象。毋庸置疑,成本/收益比率是天文数字(而不是支持利益)。

最好的解决方案是尽量减少工作簿文件的大小,主要是将数据存储在数据库中,而不是存储在Excel工作簿中。