Excel VBA循环在40或60个循环后崩溃
我一直在用谷歌搜索我的眼睛,我是个新手 我正在使用一个宏来运行一个客户id列表,用id过滤一个透视图,将一个工作表导出为pdf,然后重复循环 几天后,我终于让它运行了60次,但大约在那时它重新启动excel。我刚刚将页面文件从2gb增加到16gb 我正在使用do while循环,我试图设置objects=nothing来清理资源,我正在保存文件,我还使用DoEvents,将screenupdate设置为false,将microsoft xps设置为默认打印机,将print comms设置为false,所有范围都存储在变量中而不是选定的,工作表也存储在变量中,而不是被激活。我尝试过单步通过,使用断点等。。。看到它运行了60次没有错误 我的猜测是,由于它在崩溃前从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
删除了代码,因为我发现崩溃与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
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创建?此外,可能是这个问题没有解决方案。我希望你能找到一个!