MS Excel VBA zum Exportieren nach PDF wird plötzlich beendet und erzwingt einen Neustart des Computers
761
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
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 !