CreateObject Excel.Application在循环期间左键单击时抛出错误

时间:2015-06-30 14:19:16

标签: excel-vba vba excel

我有一个设置,其中sourceApp使用CreateObject创建第二个Excel实例,然后开始使用for循环发送数据。此代码位于空白工作簿中:

Option Explicit

Sub StreamToOtherWorkbook()
  Dim sourceApp As Excel.Application
  Dim targetApp As Excel.Application

  Set sourceApp = GetObject(, "excel.application")
  Set targetApp = CreateObject("excel.application")

  Dim targetWb As Workbook
  Set targetWb = targetApp.Workbooks.Add

  targetApp.Visible = True

  Dim i As Long
  For i = 1 To 100000
    Debug.Print "Value", targetWb.Sheets(1).Range("A1").Value
    targetWb.Sheets(1).Range("A1").Value = i
  Next i
End Sub

这按预期工作,数据流如下面的gif所示。 (sourceApp是隐藏后台工作者的占位符,因此无需保持响应。)

streaming 不,gif中缺少 Option Explicit 并没有改变任何内容。

问题是每当单击一个单元格或工作表时,for循环都会抛出错误。确切地说50290 Application-defined or object-defined error。真正奇怪的是,我尝试对targetApp做的其他事情都很好。我可以:

  • 右键单击并使用上下文菜单。
  • 使用VBA更改工作表。
  • 添加按钮或图片。
  • 从标签添加新表(但不选择表格)。
  • 使用键盘选择单元格。
  • 插入函数(甚至是引用更新单元格的函数)。
  • 保存工作簿。
  • 打开其他实例。
  • ...

错误似乎始终发生在targetWb.Sheets...行,最终Debug.Print返回正确的值。当然,我可以选择忽略On Error Resume Next的错误,并且稍微暂停后流将恢复 - 但我仍然非常好奇什么使左键点击错误?

我在64位Windows 7上运行并使用Excel 2010 14.0.7151.5001(32位)

1 个答案:

答案 0 :(得分:1)

当Excel没有准备好接受自动化时会抛出错误50290,因为它忙于用户输入(请参阅Jon Skeet's MinBy extension)。如果将targetApp.Ready添加到debug.Print语句中,则可以看到这一点 - 当返回False时,您将收到错误。

理论上,您可以在写入Application.Ready -

之前检查targetApp属性
For i = 1 To 100000
 Debug.Print "Value", targetWb.Sheets(1).Range("A1").Value
 Do
  DoEvents
 Loop Until targetApp.Ready
 targetWb.Sheets(1).Range("A1").Value = i
Next i

然而,当我测试它时,它只能工作(即你可以在没有问题的情况下左键单击,但有些时候你仍然会收到错误)。据推测,检索Application.Ready需要足够长的时间,以便状态有时间在读取它和执行下一个语句之间进行更改。

正如您所说,您可以捕获错误(您可以在继续之前检查Err.Number = 50290)。另一种选择 - 如果在单独的实例中使用targetWb并不重要 - 是将targetWb保留在同一个实例中。如果您在同一个实例(即Set targetWb = Workbooks.Add)中创建它,则不会出现此问题。虽然您然后遇到双击单元格会停止代码的问题。