VBA循环在40或60个循环后崩溃



我一直在谷歌上搜索,我是个新手。

我使用一个宏来运行一个客户id列表,用id过滤一个数据透视表,将一张表导出为pdf,然后重复这个循环。

几天后,我终于设法让它运行了60次,但大约在那时,它重新启动了excel。我刚刚将页面文件从2gb增加到16gb。

我使用了一个do while循环,我试图设置objects=none来清理资源,并在某一点上保存文件,我还使用了DoEvents,将screenupdate设置为false,将microsoft xps设置为默认打印机,将comms打印为false,所有范围都存储在变量中,而不是选择,工作表也存储在变量内,而不是激活。我试过逐步通过,使用断点等……并看到它运行了60次没有错误。。

我的猜测是,由于它在崩溃前从40增加到60,这可能与随着时间的推移资源膨胀有关。

删除了代码,因为我发现崩溃与VBA代码无关,而是链接了图像。

删除导出的工作表中的链接图像解决了我的问题。

我不确定我是否完全理解我找到的解决方案,但粗略地说:显然,导出功能在链接图像的内核中留下了一个位或字节,这在宏的每次传递中都会累积起来,最终会分解。

不幸的是,当我像疯子一样在谷歌上搜索时,我只发现了另外一个类似的问题,所以我无法链接到我在哪里找到这些信息。

我要感谢所有评论者当时的时间和帮助,我让一切都发挥了作用,现在它产生了900-1000个个人PDF,并给他们附上了一封电子邮件并发送出去。

因此,在结论中:如果使用VBA宏将工作表导出为pdf,其中包含链接的图像,则可能会导致不稳定,并最终导致宏崩溃。尝试不链接图像。

如果您需要图像:我使用链接图像,因为我需要它们是动态的,并根据需要进行更改。我找到了另一种方法,即插入合适的图像(如果存在以前插入的图像,请先使用删除功能(。如果我没有记错的话,我没有自己写那个代码,但它涉及:

  • 将我的图像放在文件夹中。

  • 命名每个图像以匹配excel中的值。

  • 在vba中创建一个变量:imgfile=path&值&
    "。png";。

  • 然后我设置IMG=ws.pictures.insert(imgfile(然后插入这是一个img对象。

    With img
    .ShapeRange.LockAspectRatio = msoFalse
    .Left = ws.Range("g15").Left
    .Top = ws.Range("g15").Top
    .Width = R.Width
    .Height = R.Height
    .Placement = 1
    .PrintObject = True
    nameofpicture = .Name
    End With
    

在我使用它之前,我称之为deletepicture sub,请注意只删除需要更改的图像。

Sub deletepictures()
Dim pic As Shape
Dim radd As String
radd = Range("g14").Address
For Each pic In Worksheets("Rapport").Shapes        
If Left(pic.Name, 3) = "Pic" Then pic.Delete    
Next pic
End Sub

我希望其他人会发现这很有用,这是一件棘手的事情,谷歌花了我整整两周的工作时间来寻找有用的信息。

最新更新