Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA循环在40或60个循环后崩溃_Excel_Vba_Loops_Do While - Fatal编程技术网

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

Excel VBA循环在40或60个循环后崩溃,excel,vba,loops,do-while,Excel,Vba,Loops,Do While,我一直在用谷歌搜索我的眼睛,我是个新手 我正在使用一个宏来运行一个客户id列表,用id过滤一个透视图,将一个工作表导出为pdf,然后重复循环 几天后,我终于让它运行了60次,但大约在那时它重新启动excel。我刚刚将页面文件从2gb增加到16gb 我正在使用do while循环,我试图设置objects=nothing来清理资源,我正在保存文件,我还使用DoEvents,将screenupdate设置为false,将microsoft xps设置为默认打印机,将print comms设置为fal

我一直在用谷歌搜索我的眼睛,我是个新手

我正在使用一个宏来运行一个客户id列表,用id过滤一个透视图,将一个工作表导出为pdf,然后重复循环

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

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

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


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

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

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

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

我要感谢所有的评论者,感谢他们当时的时间和帮助,我让这一切都运作起来了,现在它生成了900-1000个PDF文件,并附上一封电子邮件给他们发送

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

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

  • 将我的图像保存在文件夹中

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

  • 在vba中创建一个变量,即:imgfile=path&value&
    “.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

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

试着看看以下任何一项是否有帮助:你可以试着看看如何尽量减少代码来重现这个问题。我的猜测(根据我2002年的经验)是,添加许多新对象可能会导致崩溃。那时我完全按照你的建议做了。@HilaDG对不起,我不确定你的建议是什么?:)我一直在想,将“exportaspdf”放在一个单独的模块中并调用它会更聪明吗。我的推理是,当子模块在该模块中结束时,应该清除资源?为什么要使用
DoEvents
?@MichaelChristensen:您遇到的问题是Excel正在崩溃。我的想法是尝试找出重现此问题所需的最低代码量。是电子邮件创建还是PDF创建?此外,可能是这个问题没有解决方案。我希望你能找到一个!