MS Excel VBA zum Exportieren nach PDF wird plötzlich beendet und erzwingt einen Neustart des Computers

674
Cliff

Ich habe einen VBA-Code (siehe unten), der im Wesentlichen benannte Bereiche in einer Excel-Datei als PDF druckt. Ich habe Befehlsschaltflächen für jedes Makro und es funktioniert gut, aber wenn ich sie nacheinander drucke, werden Sie (group1, group2, group3 ....), wenn ich zu group6 komme, die Datei schließt sich plötzlich und zwingt den Computer zum Neustart ?? ?

Was mache ich falsch? Jede Hilfe wird sehr geschätzt.

Vielen Dank

Cris


Option Explicit   Sub Print_Group1()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("ReportGroups").Activate Set r = ThisWorkbook.Worksheets("ReportGroups").Range("Groups_Reports") r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group1.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub  Sub Print_Group2()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("Reports").Activate Set r = ThisWorkbook.Worksheets("Reports").Range("All_Reports") r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group2.pdf.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub  Sub Print_Group3()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("Reports").Activate  Set r = ThisWorkbook.Worksheets("Reports").Range("Report___000001, Report___000002, Report___000003, Report___000004, Report___000005, Report___000006") Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000007, Report___000008, Report___000009, Report___000010, Report___000011")) Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000012, Report___000013, Report___000014, Report___000015, Report___000016")) r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group3.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub   Sub Print_Group4()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("Reports").Activate  Set r = ThisWorkbook.Worksheets("Reports").Range("Report___000017, Report___000018, Report___000019, Report___000020") Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000021, Report___000022, Report___000023, Report___000024")) Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000025, Report___000026, Report___000027, Report___000028")) r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group4.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub  Sub Print_Group5()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("Reports").Activate  Set r = ThisWorkbook.Worksheets("Reports").Range("Report___000029, Report___000030, Report___000031, Report___000032, Report___000033, Report___000034") Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000035, Report___000036, Report___000037, Report___000038, Report___000039, Report___000040")) Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000041, Report___000042, Report___000043, Report___000044, Report___000045")) r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group5.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub  Sub Print_Group6()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("Reports").Activate  Set r = ThisWorkbook.Worksheets("Reports").Range("Report___000046, Report___000047, Report___000048, Report___000049, Report___000050, Report___000051, Report___000052, Report___000053") Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000054, Report___000055, Report___000056, Report___000057, Report___000058, Report___000059, Report___000060, Report___000061")) Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000062, Report___000063, Report___000064, Report___000065, Report___000066, Report___000067")) r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group6.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub  Sub Print_Group7()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("Reports").Activate  Set r = ThisWorkbook.Worksheets("Reports").Range("Report___000068, Report___000069, Report___000070, Report___000071") Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000072, Report___000073, Report___000074, Report___000075")) Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000076, Report___000077, Report___000078, Report___000079")) r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group7.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub  Sub Print_Group8()  Dim r As Range Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").Value  ThisWorkbook.Worksheets("Reports").Activate  Set r = ThisWorkbook.Worksheets("Reports").Range("Report___000080, Report___000081, Report___000082, Report___000083") Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000084, Report___000085, Report___000086")) Set r = Union(r, ThisWorkbook.Worksheets("Reports").Range("Report___000087, Report___000088, Report___000089")) r.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group8.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  Worksheets("Index").Activate ActiveWorkbook.Save MsgBox "Done!", vbOKOnly  End Sub 
0
Meine Vermutung ist, dass der Vorgang des Erstellens der PDF-Datei den Arbeitsspeicher belegt und der nächste beginnt, bevor der vorherige beendet ist. Sie müssen warten oder Ereignisse ausführen, um den Code zu verlangsamen, um auf die Erstellung der einzelnen PDF-Dateien zu warten bevor Sie den nächsten Code starten. Scott Craner vor 5 Jahren 0
@ScottCraner - Am Ende eines jeden `Sub` steht ein` MsgBox () `- Aufruf. Wenn der Vorgang nicht wirklich langsam ist (Speichern über ein Blechdosen-Draht-Netzwerk nach Nordsibirien), sollte er zu dem Zeitpunkt abgeschlossen sein, zu dem der Benutzer auf OK geklickt hat. Außerdem ist dies VBA `.ExportAsFixedFormat`, das nicht in einem Hintergrundthread ausgeführt wird, oder? Heck, manuelles Klicken auf "Speichern" blockiert die VBE, während die Datei gespeichert wird ... FreeMan vor 5 Jahren 1
@FreeMan ist abgeschlossen, wenn die `.Save`-Methode zurückkehrt und sogar die` MsgBox` angezeigt wird Mathieu Guindon vor 5 Jahren 0
Nun, ich habe gesagt, es war eine Vermutung. :) Scott Craner vor 5 Jahren 0
Haben Sie dies mit `OpenAfterPublish: = False` versucht? Dies würde helfen, einzugrenzen, ob es sich um ein Excel-Problem oder ein PDF-Reader-Problem handelt. Comintern vor 5 Jahren 0

1 Antwort auf die Frage

0
FreeMan

Dies wird Ihr Problem wahrscheinlich nicht lösen, aber es macht Ihren Code viel einfacher zu verwalten.

Public Sub PrintReportGroup(ByVal groupID As Long, ByVal startReport As Long, ByVal endReport As Long)  'consider making this a named range too! Dim fDrive As String fDrive = ThisWorkbook.Worksheets("Index").Range("S3").value  'you're working with named sheets, you don't need to .Activate them 'ThisWorkbook.Worksheets("Reports").Activate  With ThisWorkbook.Worksheets("Reports") Dim counter As Long For counter = startReport To endReport Dim reportRange As Range Set reportRange = Union(reportRange, .Range("reportReport___" & CStr(Format(counter, "000000")))) Next End With  reportRange.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ fDrive & "MyReports\PDF_Reports\Group" & CStr(groupID) & ".pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True  'You'll still be on the sheet you started with, so no need to return "home"  'Worksheets("Index").Activate 'Not sure why you're saving here - nothing you did during printing needs a save, but, this could be an oddly placed save for other changes made. ActiveWorkbook.Save 'get rid of this MsgBox once it's all working ok MsgBox "Done!", vbOKOnly  End Sub 

Jetzt haben Sie eine Prozedur, die Sie aufrufen können, um mehrere PDFs zu erstellen:

Public Sub PrintReports() PrintReportGroup 3, 1, 16 PrintReportGroup 4, 17, 28 PrintReportGroup 5, 29, 45 PrintReportGroup 6, 46, 67 'etc... End Sub 

Es erleichtert auch das Debuggen durch Ändern der PrintReportGroup 6, 46 67Zeile. Ändern Sie das zu

PrintReportGroup 6, 46, 46 

und sehen, ob es funktioniert. Wenn ja, ändern Sie es in

PrintReportGroup 6, 46, 47 

und weiter, bis es in die Luft geht. Ich vermute, dass entweder ein benannter Bereich fehlt oder Sie einen der genannten Bereiche falsch eingetippt haben oder dass Sie im PDF-Builder an eine Grenze stoßen, die ihm nicht gefällt.

Versuchen Sie auch, den Vorschlag von Comintern aufzunehmen OpenAfterPublish:=False. Zusätzlicher Bonus, Sie müssen ihn nur an einer Stelle ablegen, um Ihren gesamten Code zu ändern !