我有一个设置,其中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
是隐藏后台工作者的占位符,因此无需保持响应。)
不,gif中缺少 Option Explicit
并没有改变任何内容。
问题是每当单击一个单元格或工作表时,for循环都会抛出错误。确切地说50290 Application-defined or object-defined error
。真正奇怪的是,我尝试对targetApp
做的其他事情都很好。我可以:
错误似乎始终发生在targetWb.Sheets...
行,最终Debug.Print
返回正确的值。当然,我可以选择忽略On Error Resume Next
的错误,并且稍微暂停后流将恢复 - 但我仍然非常好奇什么使左键点击错误?
我在64位Windows 7上运行并使用Excel 2010 14.0.7151.5001(32位)
答案 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
)中创建它,则不会出现此问题。虽然您做然后遇到双击单元格会停止代码的问题。