Excel 2010 VBA:运行时错误1004,Microsoft Excel无法粘贴数据

Excel 2010 VBA:运行时错误1004,Microsoft Excel无法粘贴数据,excel,vba,runtime-error,copy-paste,Excel,Vba,Runtime Error,Copy Paste,我已经运行了一段时间的剪切粘贴图片例程,突然Excel开始给我这个运行时错误。到目前为止,它已经工作了好几天了(没有操作系统更新或重新启动,不过我确实尝试过关闭并重新打开Excel,看看是否有帮助)。更奇怪的是,脚本执行了批复制和粘贴。picture,相同的范围(具有重新计算的值)被复制和粘贴了13次,错误消息通常在最后一个循环中或偶尔在某个随机点弹出 我查找了support.microsoft.com/en-us/kb/905164: “如果以下任一条件为真,则可能发生此问题: The Mic

我已经运行了一段时间的剪切粘贴图片例程,突然Excel开始给我这个运行时错误。到目前为止,它已经工作了好几天了(没有操作系统更新或重新启动,不过我确实尝试过关闭并重新打开Excel,看看是否有帮助)。更奇怪的是,脚本执行了批复制和粘贴。picture,相同的范围(具有重新计算的值)被复制和粘贴了13次,错误消息通常在最后一个循环中或偶尔在某个随机点弹出

我查找了support.microsoft.com/en-us/kb/905164: “如果以下任一条件为真,则可能发生此问题:

The Microsoft Visual Basic for Applications (VBA) macro copies and pastes one whole row in an Excel 2003 workbook.
The Microsoft VBA macro copies and pastes a range of 2,516 rows or more rows in an Excel 2003 workbook."
但是,我复制了12,12个单元格的范围,精确地说是从A1到L12,甚至不接近整行。我尝试使用range.offset、xldown、range(单元格(1,1)、单元格(12,12)),但这些都没有帮助

有没有人经历过类似的事情

Sub PutPic(ByRef FN As String)


 Dim fname As String
 fname = "E:\Users\ABCD\Documents\EFGH\" & FN
 Worksheets(2).Range(Cells(1, 1), Cells(12, 12)).Select
 'Sheets("sheet2").Range("A1:l12").Select
 Selection.Copy
 'Sheets("sheet2").Range("a1").Select
 ActiveSheet.Pictures.Paste(Link:=False).Select
 Selection.Name = "Pic"
 Selection.ShapeRange.ScaleWidth 2, msoFalse, msoScaleFromTopLeft
 Selection.ShapeRange.ScaleHeight 2, msoFalse, msoScaleFromMiddle

 Dim ChtObj As ChartObject
 With ThisWorkbook.Worksheets(2)
    .Activate
    Set ChtObj = .ChartObjects.Add(100, 100, 400, 400)
    ChtObj.Name = "PicFrame"
    ChtObj.Width = .Shapes("Pic").Width
    ChtObj.Height = .Shapes("Pic").Height

    ActiveSheet.Shapes.Range(Array("Pic")).Select
    Selection.Copy

    ActiveSheet.ChartObjects("PicFrame").Activate
    ActiveChart.Paste

    ActiveChart.Export Filename:=fname, FilterName:="png"
    ChtObj.Delete
    ActiveSheet.Shapes.Range(Array("Pic")).Delete

 End With
End Sub
带有循环例程的子例程,完全普通,它向子例程提供文件名

Public Sub MainRun()
 Dim i, j, k As Long
 Dim NMG, NMB As String

 Dim FNGBSig As String
 Dim FNUnivSig As String
 Dim BatchStart, Batch As Long
 BatchStart = ThisWorkbook.Worksheets(2).Cells(15, 1).Value + 1
 Batch = 13
 For i = BatchStart To BatchStart + Batch - 1

'Some calculations that refresh values in range A1:L12

FNGBSig = i & "GoodBad.png"

        PutPic FNGBSig

 Next i

End Sub

我怀疑是循环导致了问题,因为
.Export
方法本身正在运行。请使用WinAPI
Sleep
函数插入一个小延迟(1秒可能就足够了)。此外,我已稍微清理了代码:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For use in timer function

Sub PutPic(FN)

Dim fname As String
Dim shp As Picture
Dim ChtObj As ChartObject
Dim ws As Worksheet

Set ws = ThisWorkbook.Worksheets(2)

fname = "E:\Users\ABCD\Documents\EFGH\" & FN

'Copy the range of cells
With ws
    .Range(.Cells(1, 1), .Cells(12, 12)).Copy

    'Paste & get a handle on the resulting picture:
    Set shp = .Pictures.Paste(Link:=False)
End With

'Scale your picture:
With shp
    .ShapeRange.ScaleWidth 2, msoFalse, msoScaleFromTopLeft
    .ShapeRange.ScaleHeight 2, msoFalse, msoScaleFromMiddle
End With

'Add the ChtObj frame:
Set ChtObj = ws.ChartObjects.Add(100, 100, 400, 400)
'Size the chart, paste the picture in the chart, export
With ChtObj
    .Width = shp.Width
    .Height = shp.Height
    shp.Copy
    Sleep 1000  '1000 milliseconds = 1 second
    .Chart.Paste
    .Chart.Export Filename:=fname, FilterName:="png"
    .Delete
End With

shp.Delete

End Sub
请注意,这通常是不赞成的:

 Dim i, j, k As Long
 Dim NMG, NMB As String

 Dim FNGBSig As String
 Dim FNUnivSig As String
 Dim BatchStart, Batch As Long
这将
i声明为Variant,j声明为Variant,k声明为Long
,等等。要内联执行多个声明,仍然需要指定数据类型:

Dim i as Long, j as Long, k as Long
Dim NMG as String, NMB as String
' etc...

请发布您正在使用的代码。只需使用左上角的单元格作为目标。其余单元格将粘贴到相邻的单元格中。此外,在错误消息之后(并进入调试),我可以手动粘贴图片。请修改您的问题,使其包含引发错误的代码。这听起来可能是一个缓冲区问题,可以通过一个小的延迟来解决。MS Support白皮书是关于xl2003的。谢谢@davidzemens。也感谢您对不良做法的指导。不用担心,这是一个常见的错误ht:)很抱歉,我还不能运行你的代码,但我会在几个小时内完成。你对DIM的指导实际上帮助解决了另一个问题——尽管我这样做了,但在调用SUB和函数时,我一直在错误地使用未声明的变量。我必须将每个变量分离到自己的DIM中。现在我明白为什么我会这样做了不赞成这样做!您的代码只做了一个更改就可以很好地工作-粘贴之前需要睡眠,导出之后似乎不需要睡眠。我可以毫无怨言地将其降到100ms。非常感谢。我终于弄清了这种行为的根源。本机电子表格中有一个动态名称范围,它在后台更新每次循环后。随着范围变长,重新计算工作表所需的时间也会变长。删除名称范围并将工作表上的计算移到VBA可以消除此问题。我在代码中保留200个睡眠,以防万一。