从模态表单调用时 RTD.RefreshData 崩溃

Posted

技术标签:

【中文标题】从模态表单调用时 RTD.RefreshData 崩溃【英文标题】:RTD.RefreshData crashes when invoked from modal form 【发布时间】:2014-02-11 15:09:55 【问题描述】:

我创建了一个非常简单的 modal 表单,其中包含两个按钮:一个只是关闭表单,另一个调用 Application.RTD.RefreshData。在 Excel 2003 中,这一切正常,但在 Excel 2010 中,Application.RTD.RefreshData 崩溃了

运行时错误“1004”:应用程序定义或对象定义错误

如果我将表单创建为 modeless,则在 Excel 2003 和 Excel 2010 中一切正常。

不管怎样,这就是表单背后的所有代码:

Private Sub RefreshDataButton_Click()
  Application.RTD.RefreshData
End Sub

Private Sub CloseButton_Click()
  Call Unload(Me)
End Sub

我在工作表中使用此代码调用表单:

Private Sub CommandButton1_Click()
  Dim form As UserForm1
  Set form = New UserForm1
  form.Show vbModal
End Sub

我已经在 Google 和 SO 上搜索了有关这方面的任何信息,但无济于事。这是 Excel 2010 的一个已知问题,还是我真的不允许从模式表单调用 Application.RTD.RefreshData

编辑:我应该补充一点,据我所知,我的 Excel 会话中有 没有 RTD 服务器。

EDIT2:进一步调查:在 Excel 2003 或 2007 中不会出现该错误;它确实发生在 2010 年和 2013 年。

【问题讨论】:

【参考方案1】:

在普通的 RTD 服务器中,您使用 excel 回调调用 UpdateNotify(),然后 Excel 将根据油门设置和当前的“忙碌”程度来决定何时调用 RefreshData()。 “忙碌”的定义通常包括公式重新计算、保存工作表和打开模式对话框等内容。

当 Excel 认为自己很忙时,它会通过抛出异常来保护自己免受外部组件的影响。这是有道理的,因为他们不希望他们的应用程序因为贪婪的插件或宏而变得不稳定或锁定。本质上,如果 Excel 确定它“忙”,则您在代码中放置的所有访问 Excel 对象模型的任何部分的调用(包括您对 RefreshData() 的调用)都可能引发异常。我怀疑在更高版本的 Excel 中,他们已经收紧了对“忙碌”的定义,这就是为什么您会看到与模式对话框存在这种差异的原因。

【讨论】:

以上是关于从模态表单调用时 RTD.RefreshData 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Tornado之接口调用时方式执行顺序

有没有办法模拟从模态/弹出表单激活的表单

从 Vue js 中的模态提交表单

从模态表单中检索值并更新数据库php

magnific popup:以编程方式将内容从弹出表单更改为模态微调器,然后返回表单

python print() 在同时调用时如何实际工作?