我在Excel VBA中使用异步WinHTTP来向网站发出大量请求。收到回复后,会调用一个写入工作表的模块。
通常这样可以正常工作,但如果用户没有关注Excel,则会出现“运行时错误'50290':应用程序定义或对象定义错误”。
这一行特别错误:
pcol = ThisWorkbook.Worksheets("WHA").Cells.Find("PRODUCTA").Column
我也尝试了以下语法:
pcol = Sheet3.Cells.Find("PRODUCTA").Column
pcol = Sheet3.Rows(5).Find("PRODUCTA").Column
pcol = Sheet3.Rows(5).Find(What:="PRODUCTA").Column
pcol = Sheets("WHA").Cells.Find(What:="PRODUCTA", LookAt:=xlWhole, LookAfter:=Sheet3.Cells(5, 1)).Column
一切都无济于事......
我知道我可以在VBA中强制重点关注Excel,但理想情况下,我不介意当用户在stackoverflow.com上同时变得更智能时,宏是否在后台运行: - )
有人对如何克服这个问题有什么建议吗? 谢谢!
答案 0 :(得分:2)
您可以尝试捕获错误并继续执行代码,这可能有所帮助。
Sub Test()
...declarations...
On Error Goto Error_
...your code...
Exit Sub
Error_:
If (Err.Number = 50290) Then Resume
Stop
Resume
End Sub
答案 1 :(得分:1)
AppActivate "Microsoft Excel"
当你知道自己有焦点并在
之后激活它时存储你的WB答案 2 :(得分:0)
在运行宏时,尝试将这两个标志设置为false:
Application.ScreenUpdating = False
Application.DisplayAlerts = False
答案 3 :(得分:0)
在另一种情况下,我也遇到了此错误。从Access处理工作簿时。我将其发布以供将来参考。
AppActivate
需要将激活的应用程序的标题。
如果您在运行时不知道确切的标题,请编写以下内容:
AppActivate Application.Caption
如果您使用Access之类的其他应用程序,请在开始时将对象设置为Excel,然后用该对象替换Application
。
答案 4 :(得分:0)
我知道这是一个老问题,但是如果有人遇到这个问题...
我还使用异步http请求(蒂姆·霍尔(Tim Hall)制造的模块包装器)。
回调包装了Application.Run方法;我遇到的问题是,由于我访问的REST API的限制,我不得不在客户端对请求的速率进行限制。
我是通过Application.Wait完成的 当应用程序正在等待并尝试执行Application.Run
时,响应将触发http响应事件。因此,只需用另一个允许事件解决问题的“等待”替换Application.Wait。
.Wait的替代方法
Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
Sub Halt(Finish As Long)
'Finish in seconds
Dim NowTick As Long
Dim EndTick As Long
EndTick = GetTickCount + (Finish * 1000)
Do
NowTick = GetTickCount
DoEvents
Loop Until NowTick >= EndTick
End Sub