Premesso che provando il file che avevo "allegato" senza alcuna modifica il tempo per copiare 128 fogli, il relativo PDF, e l'eliminazione con il ciclo (che può essere evitata) con il mio pc ci impiega 10/11 secondi, non credo che sia possibile avere un unico PDF di più "pagine" senza creare tanti fogli poi da selezionare per effettuare la stampa dell'unico PDF (ma magari mi sbaglio).
Forse la tua cartella di lavoro ha molte formule che vengono aggiornate e questo potrebbe allungare i tempi.
Magari vengono anche scatenati degli eventi.
Si può ovviare disabilitando il calcolo automatico e andando ad effetturare il calcolo per il singolo foglio (così man mano che i fogli si creano le formule del solo nuovo foglio vengono ricalcolate).
Si possono disabilitare gli eventi se non è necessario che vengano lanciati in fase di copia dei fogli e riporto dei dati negli stessi.
Inoltre si può "congelare" lo screenupdating.
Anche la cancellazione dei fogli può avvenire non con un ciclo ma con un unico comando, in quanto i fogli da cancellare risultano già individuati dall'array.
Facendo queste modifiche sul mio file ho risparmiato circa 3".
Ma magari con il tuo il risparmio potrebbe essere maggiore.
Prova a vedere questo file:
https://www.dropbox.com/s/z381q1eevb0cj14/errore%20Run-time%20%279%27%20Indice%20non%20incluso%20nell%27intervallo.xlsm?dl=0
dove nel Modulo1 ho così modificato il codice precedente:
'---
Option Explicit
'esportare più fogli in un unico file pdf
Sub pdf_unico()
Dim sTimer: sTimer = Timer
Dim n_unità As Integer, i As Integer, FogliIniziali As Integer
Dim Ripartizione As Worksheet, Report As Worksheet
Dim Cartella As String, Percorso As String
Dim foglio() As Variant
With ThisWorkbook
Set Ripartizione = .Worksheets("Ripartizione")
Set Report = .Worksheets("Report Individuale")
End With
n_unità = Ripartizione.Range("X3")
FogliIniziali = Sheets.Count '= n. di fogli presenti all'avvio
Cartella = ActiveWorkbook.Name
Percorso = "C:\Test\" '<=== MODIFICARE!!!
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
.DisplayAlerts = False
End With
On Error GoTo Esci
'qui crea tutti i fogli da esportare in PDF
For i = 1 To n_unità
Report.Range("E2") = Ripartizione.Cells(20 + i, 3)
Report.Copy After:=Sheets(Sheets.Count)
With ActiveSheet
.Name = "Nominativo n." & i
.Calculate
End With
Next i
'qui carica l'Array con i soli fogli appena creati
For i = FogliIniziali + 1 To Sheets.Count
ReDim Preserve foglio(1 To i - FogliIniziali)
foglio(i - FogliIniziali) = Sheets(i).Name
Next i
Sheets(foglio).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=Percorso & Cartella & ".pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Sheets(foglio).Delete 'i fogli in precedenza individuati per la stampa Pdf vengono ora cancellati
Ripartizione.Activate
RiprendiErrore:
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
End With
Set Report = Nothing
Set Ripartizione = Nothing
MsgBox "Tempo esecuzione: " & Timer - sTimer
Exit Sub
Esci:
MsgBox "Si è verificato un errore!" & vbCrLf & _
"Errore n. " & Err.Number & vbCrLf & _
Err.Description, vbCritical, "Errore"
GoTo RiprendiErrore
End Sub
'---