从模态窗体调用时,RTD.RefreshData崩溃

时间:2014-02-11 15:09:56

标签: excel vba modal-dialog rtd

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

崩溃
  

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

如果我将表单创建为无模式,则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

我已经搜索谷歌和SO以获取有关此信息的任何信息无济于事。这是Excel 2010的已知问题,还是我真的不允许从模式表单中调用Application.RTD.RefreshData

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

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

1 个答案:

答案 0 :(得分:1)

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

Excel通过抛出异常认为自己很忙,从而保护自己免受外部组件的攻击。这是有道理的,因为他们不希望他们的应用程序因为贪婪的插件或宏而变得不稳定或锁定。基本上所有调用代码访问Excel对象模型的任何部分的调用(包括对RefreshData()的调用)都会抛出异常,如果Excel认为它是“忙”的话。我怀疑在更高版本的Excel中他们已经收紧了“忙”的定义,这就是为什么你看到模态对话框的这种差异。