Excel2010:从IE复制粘贴特别失败

我正在build立一个模型,试图使用“全选”>“复制”跨不同网站从Web上获取数据。 下面是我有的代码,它似乎在某些地区工作在rest模式,而在其他地区,只有当我运行macros。

当时我困惑的部分是当它命中:“ActiveSheet.PasteSpecial格式:=”文本“,链接:= False,DisplayAsIcon:= False”,它失败,并给我错误1004“工作表类的PasteSpecial方法失败“。

在debugging完成后,代码继续执行(尽pipe显示“无法执行中断模式下的代码3次”),我尝试更改代码以显示“工作表”(“GOOGLE”)和其他方法直接定义工作表,我的直觉是可能不是问题,如果是这样的话,我不知道这里发生了什么,有人可以testing一下吗?

仅供参考我也使用这个代码之上的一个用户窗体(无模式)作为“等待”的消息,因为它可以是相当长的运行。 不确定这是否会干扰粘贴。

Dim IE As Object Dim PauseTime, Start PauseTime = 22 ' Set duration in seconds Start = Timer ' Set start time. Application.ScreenUpdating = False Worksheets("GOOGLE").Activate Worksheets("GOOGLE").Cells.Clear Worksheets("GOOGLE").Range("A1").Copy Application.CutCopyMode = False Set IE = CreateObject("InternetExplorer.Application") With IE .Navigate Range("GOOGLEURL").Value Do Until .ReadyState = 4: DoEvents: Loop End With Do While Timer < Start + PauseTime DoEvents Loop IE.ExecWB 17, 0 '// SelectAll IE.ExecWB 12, 2 '// Copy selection ActiveSheet.Range("A1").Select ActiveSheet.PasteSpecial Format:="Text", link:=False, DisplayAsIcon:=False IE.Quit On Error GoTo Ending IE.Quit Application.CutCopyMode = False Ending: Application.CutCopyMode = False Exit Sub 

尝试这种方法,而不是复制/粘贴应用程序之间。 像你一样,我尝试过,发现它不可靠,往往没有工作。

你可以用一个string来抓取页面的innerText ,然后使用它,或者,你可以将innerText分割成一个数组,并把它放在表单上,​​就像我在我的例子中那样。 这保留了换行符,并且比将所有文本放在一个单元格中更具可读性

我通过一个简单的示例( http://google.com )validation了这两个方法在工作表中返回完全相同的单元布局。

注意:当您在IE中安装ChromeFrameBHO加载项时,此方法可能不起作用(请参阅此处 )。

 Sub Test() Dim IE As Object Dim pageText As String Dim page As Variant Set IE = CreateObject("InternetExplorer.Application") With IE .Navigate "http://google.com" Do Until .ReadyState = 4: DoEvents: Loop End With pageText = IE.Document.body.innertext page = Split(pageText, vbCr) Range("A1").Resize(UBound(page)).Value = Application.Transpose(page) IE.Quit Set IE = Nothing End Sub 

另一种不依赖Internet Explorer的方法是QueryTables方法。 它可能会或可能不适合您的需求,但尝试这样的事情。

注意:此方法似乎工作(对我来说)是否安装了ChromeFrameBHO插件。

 Sub TestQueryTables() Dim googleURL as String googleURL = Range("GOOGLEURL") With ActiveSheet.QueryTables.Add(Connection:= _ "URL;" & googleURL _ , Destination:=Range("A1")) .Name = googleURL .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = True .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone 'or use xlWebFormattingAll to preserve formats .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub 

我实际上一直在努力从复制和粘贴一堆图像这个完全相同的问题。 Excel 2010显然在复制命令完成之前尝试粘贴有问题。 你可以做的是睡眠事件和error handling特定的1004错误的组合。 设置error handling程序来捕获1004错误,然后重新开始。 我所做的就是这样设置一个柜台:

 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) On Error GoTo ErrorHandler: Dim err_counter As Integer ErrorHandler: If Err.Number = 1004 Then err_counter = err_counter + 1 If err_counter > 10 Then MsgBox ("The copy function is taking too long. Consider using smaller images.") Exit Sub End If DoEvents Sleep 500 DoEvents ElseIf Err.Number <> 0 Then MsgBox ("Unknown error.") On Error GoTo 0 Resume End If 

你不需要使用一个错误计数器,但是我想保持未来的电子表格用户创build一个无限循环是一个好主意。 我也会清除每个图像粘贴后的剪贴板,如果您使用错误计数器,粘贴成功后重置为0。

它看起来像你正在复制,但你粘贴之前清除剪贴板,所以没有代码粘贴。

 Worksheets("GOOGLE").Range("A1").Copy Application.CutCopyMode = False 

另外,您是否从表格(“Google”)复制范围(“A1”)到表格(“Google”)范围(“A1”)? 我不明白这一点

我无法validation我的回应,但一年前我也遇到过类似的问题。 有问题的网页必须使用复制/粘贴而不是使用innertext。 看来你已经完成了我所做的大部分工作,包括暂停等待或复制完成。 (Readystate对我没有帮助。)

我记得最后一件事,允许代码工作,是把粘贴放在一个有限循环中。 在第三次和第八次尝试之间,粘贴通常是成功的。

我相信有更好的方法,但无法find它。 由于我的应用程序是我自己使用的代码是可以接受的。 由于该网页每隔几个月会发生变化,因此代码被放弃。