Discussione:
Macro per creare un unico pdf da vari fogli generati da un elenco
(troppo vecchio per rispondere)
Eva Kant
2018-11-23 12:05:45 UTC
Permalink
Buongiorno,
ho una macro che analizza il valore della colonna d (da d13 a d6xx): se ha il valore yes, fa una serie di operazioni aggiorna il foglio e poi lo esporta in pdf.
Di conseguenza ho n pdf in base a quanti yes ci sono.
Ora avrei bisogno che la macro possa generare anche un unico pdf.
Avevo pensato di sfruttare l'opzione "workbook" ossia se nell'ultima cella scrivo workbook lei (la macro) mi genera anche il pdf globale.
Avevo pensato di fare un copia valori del foglio aggiornato, ma mi sono persa.
Potete aiutarmi?
Grazie mille
Vi copio la macro attuale, che funziona.
Claudia

Sub CreazionePDFnew_V2() 'Funziona ma non c'è la creazione di un unico pdf per la stampa
Dim ShArr() As String, FArr() As String, strDate As String
Dim myCell As Range, cell As Range, rng As Range, Fname As String, Fname2 As String
Dim wb As Workbook, sh As Worksheet
Dim wbINuso As Workbook
Dim DefPath As String
Dim FileExtStr As String
'
Dim StringFileNames As String
Dim StringSheetNames As String
Dim FileNamesArray As Variant
Dim SheetNamesArray As Variant
Dim I As Long, S As Long, F As Long
Dim WrongData As Boolean
'
'Set folder where we save the temporary files
DefPath = [N1] '"A:\Scansioni\" '*
If Right(DefPath, 1) <> "\" Then
DefPath = DefPath & "\"
End If
' -------- Da DECOMMENTARE
With Application
' .ScreenUpdating = False
' .EnableEvents = False
End With
Set wbINuso = ActiveWorkbook
nCelle = Cells(Rows.Count, "d").End(xlUp).Row
Set rng = Range("d13:" & "d" & nCelle) 'automatizzato con il range variabile
For Each myCell In rng
If LCase(myCell.Value) = "yes" Then
S = 0: F = 0
Erase ShArr: Erase FArr
'Set Error Boolean to False
WrongData = False
'
Range("C9").Value = ActiveSheet.Cells(myCell.Row, "c")
Range("B1").Value = ActiveSheet.Cells(myCell.Row, "a")
Range("c1").Value = ActiveSheet.Cells(myCell.Row, "b")
' Calculate
'Check if there are Sheet names in column B
'If B is empty S = 0 so you not want to send a sheet or sheets as pdf
If Trim(ActiveSheet.Cells(myCell.Row, "d").Value) = "" Then S = 0
'If there are sheet names in the B column S is the number of sheets it add to the Array
If LCase(Trim(ActiveSheet.Cells(myCell.Row, "d").Value)) <> "workbook" Then 'era B
StringSheetNames = ActiveSheet.Cells(8, "L").Value 'era q
SheetNamesArray = Split(StringSheetNames, Chr(10), -1)
If SheetNamesArray(I) <> "" Then
S = S + 1
ReDim Preserve ShArr(1 To S)
ShArr(S) = SheetNamesArray(I)
End If
On Error GoTo 0
Else
'If you only enter "workbook" in colomn B to mail the whole workbook S = -1
S = -1
End If
'Create PDF
'Create Date/time string for the file name
strDate = Format(Now, "yyyy.mm") 'Originale: strDate = Format(Now, "dd-mmm-yyyy hh-mm-ss")
'
'Copy the sheet(s)to a new workbook
If S > 0 Then
'*** INIZIO copia incolla valori
Application.Calculation = xlManual '--- cla: evita che ricalcolando dia errore nelle formule
Calculate
ThisWorkbook.ActiveSheet.Copy '---ORIGINALE
'**** inizio cla copia incolla valori aggiunta da Claudia
ActiveSheet.Cells.Select
Selection.Copy
ActiveCell.Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Application.PrintCommunication = False
ActiveSheet.PageSetup.PrintArea = "$e$13:$m$63" '***** delimita area stampa avviso <-----------------------------------
With ActiveSheet.PageSetup
.BlackAndWhite = False
.Zoom = 95
End With
Application.PrintCommunication = True
'*** FINE copia incolla valori
Set wb = ActiveWorkbook
End If
'You enter only "workbook" in colomn B to mail the whole workbook
'Use SaveCopyAs to make a copy of the workbook
If S = -1 Then
'qui vorrei inserire la creazione di un unico file pdf con tutti gli avvisi che sopra genera singolarmente
FileExtStr = "." & LCase(Right(ThisWorkbook.Name, Len(ThisWorkbook.Name) - InStrRev(ThisWorkbook.Name, ".", , 1)))
NewNomePdf = StringSheetNames
Fname2 = DefPath & "TempFile " & strDate & FileExtStr
ThisWorkbook.SaveCopyAs Fname2
ActiveSheet.Activate
Set wb = Workbooks.Open(Fname2)
Application.DisplayAlerts = False
wb.Sheets(ActiveSheet.Name).Delete
Application.DisplayAlerts = True
If wb.Sheets(1).Visible = xlSheetVisible Then wb.Sheets(1).Select
End If
'
'Now we Publish to PDF
If S <> 0 Then
Fname = DefPath & Trim(ActiveSheet.Cells(8, "L").Value) & ".pdf" '57. AC
'------STOP NOME!!!!!
On Error Resume Next
wb.ExportAsFixedFormat _
Type:=xlTypePDF, _
FileName:=Fname, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False 'True 'OpenAfterPublish:=False '***********Salva PDF
On Error GoTo 0
wb.Close False
Set wb = Nothing
End If
On Error Resume Next
'
If S = -1 Then Kill Fname2
' Kill Fname '@@@@@@@@@@@@@@@@@@@@@@@ Se Commentato NON CANCELLa il file .pdf della Nota
On Error GoTo 0
End If
Next myCell
'
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
MsgBox "Fatto! - file pdf generati nella directory " & DefPath, 0 + 48, " Avviso di Claudia :)"
End Sub
gallego
2018-11-25 04:09:02 UTC
Permalink
Post by Eva Kant
MsgBox "Fatto! - file pdf generati nella directory " & DefPath, 0 + 48, " Avviso di Claudia :)"
End Sub
se hai errori in fase di export e i file pdf non si creano,hai comunque
la msgbox con il messaggio.
Eva Kant
2018-11-28 14:58:29 UTC
Permalink
Post by gallego
Post by Eva Kant
MsgBox "Fatto! - file pdf generati nella directory " & DefPath, 0 + 48, " Avviso di Claudia :)"
End Sub
se hai errori in fase di export e i file pdf non si creano,hai comunque
la msgbox con il messaggio.
Hai ragione!
Grazie correggo.
Bruno Campanini
2018-11-25 17:18:56 UTC
Permalink
Post by Eva Kant
Buongiorno,
ho una macro che analizza il valore della colonna d (da d13 a d6xx): se ha il
valore yes, fa una serie di operazioni aggiorna il foglio e poi lo esporta
in pdf. Di conseguenza ho n pdf in base a quanti yes ci sono. Ora avrei
bisogno che la macro possa generare anche un unico pdf. Avevo pensato di
sfruttare l'opzione "workbook" ossia se nell'ultima cella scrivo workbook lei
(la macro) mi genera anche il pdf globale. Avevo pensato di fare un copia
valori del foglio aggiornato, ma mi sono persa. Potete aiutarmi? Grazie mille
Se il Workbook contiene n fogli TUTTI aventi le identiche proprietà
di stampa, con SaveAs WorkbookName.PDF Excel ti crea un solo PDF.
Prima di ciò, seleziona TUTTI i fogli poi
Page Layout -> Page Setup -> Page -> OK.
Post by Eva Kant
Vi copio la macro attuale, che funziona.
Faccio fatica a leggere il mio codice cinque minuti dopo averlo
scritto.

Bruno
b***@gmail.com
2018-11-25 18:20:54 UTC
Permalink
Post by Bruno Campanini
Post by Eva Kant
Buongiorno,
ho una macro che analizza il valore della colonna d (da d13 a d6xx): se ha il
valore yes, fa una serie di operazioni aggiorna il foglio e poi lo esporta
in pdf. Di conseguenza ho n pdf in base a quanti yes ci sono. Ora avrei
bisogno che la macro possa generare anche un unico pdf. Avevo pensato di
sfruttare l'opzione "workbook" ossia se nell'ultima cella scrivo workbook lei
(la macro) mi genera anche il pdf globale. Avevo pensato di fare un copia
valori del foglio aggiornato, ma mi sono persa. Potete aiutarmi? Grazie mille
Se il Workbook contiene n fogli TUTTI aventi le identiche proprietà
di stampa, con SaveAs WorkbookName.PDF Excel ti crea un solo PDF.
Prima di ciò, seleziona TUTTI i fogli poi
Page Layout -> Page Setup -> Page -> OK.
Post by Eva Kant
Vi copio la macro attuale, che funziona.
Faccio fatica a leggere il mio codice cinque minuti dopo averlo
scritto.
Bruno
Se serve una soluzione selettiva, intesa nel senso che non tutti i fogli debbano andare a formare il pdf globale puoi adattare il codice che segue.
Elio

Option Explicit

Sub Test()
Dim arr() As String
Dim strShName As String
Dim sh As Worksheet
Dim counter As Long
For Each sh In Worksheets
strShName = sh.Name
Select Case strShName
Case Is = "NonStampare_1"
Case Is = "NonStampare_2"
Case Is = "NonStampare_3"
'aggiungere eventuale altro codice di criterio di esclusione
Case Else
counter = counter + 1
ReDim Preserve arr(1 To counter)
arr(counter) = strShName
End Select
Next sh
If counter = 0 Then
Exit Sub
End If
Sheets(arr).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ThisWorkbook.Path & "\" & "Tutti_Fogli_Insieme.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
End Sub
Bruno Campanini
2018-11-25 21:06:49 UTC
Permalink
Post by b***@gmail.com
Post by Bruno Campanini
Se il Workbook contiene n fogli TUTTI aventi le identiche proprietà
di stampa, con SaveAs WorkbookName.PDF Excel ti crea un solo PDF.
Prima di ciò, seleziona TUTTI i fogli poi
Page Layout -> Page Setup -> Page -> OK.
Post by Eva Kant
Vi copio la macro attuale, che funziona.
Faccio fatica a leggere il mio codice cinque minuti dopo averlo
scritto.
Bruno
Se serve una soluzione selettiva, intesa nel senso che non tutti i fogli
debbano andare a formare il pdf globale puoi adattare il codice che segue.
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="D:\Document\Excel\XLS\BB.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True

Con queste righe di codice si crea un unico PDF relativo al o ai
fogli selezionati.

Da codice puoi selezionare i fogli che vuoi comprendere nell'unico PDF,
e se tu hai definito in Header/Footer il nome file e il nome foglio,
quell'unico PDF ti riporta tali dati correttamente con riferimento a
ciascun foglio.

Bruno
Post by b***@gmail.com
Elio
Option Explicit
Sub Test()
Dim arr() As String
Dim strShName As String
Dim sh As Worksheet
Dim counter As Long
For Each sh In Worksheets
strShName = sh.Name
Select Case strShName
Case Is = "NonStampare_1"
Case Is = "NonStampare_2"
Case Is = "NonStampare_3"
'aggiungere eventuale altro codice di criterio di esclusione
Case Else
counter = counter + 1
ReDim Preserve arr(1 To counter)
arr(counter) = strShName
End Select
Next sh
If counter = 0 Then
Exit Sub
End If
Sheets(arr).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ThisWorkbook.Path & "\" & "Tutti_Fogli_Insieme.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False,
OpenAfterPublish:= _ False
End Sub
b***@gmail.com
2018-11-25 22:25:31 UTC
Permalink
Post by Bruno Campanini
Post by b***@gmail.com
Post by Bruno Campanini
Se il Workbook contiene n fogli TUTTI aventi le identiche proprietà
di stampa, con SaveAs WorkbookName.PDF Excel ti crea un solo PDF.
Prima di ciò, seleziona TUTTI i fogli poi
Page Layout -> Page Setup -> Page -> OK.
Post by Eva Kant
Vi copio la macro attuale, che funziona.
Faccio fatica a leggere il mio codice cinque minuti dopo averlo
scritto.
Bruno
Se serve una soluzione selettiva, intesa nel senso che non tutti i fogli
debbano andare a formare il pdf globale puoi adattare il codice che segue.
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="D:\Document\Excel\XLS\BB.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Con queste righe di codice si crea un unico PDF relativo al o ai
fogli selezionati.
Da codice puoi selezionare i fogli che vuoi comprendere nell'unico PDF,
e se tu hai definito in Header/Footer il nome file e il nome foglio,
quell'unico PDF ti riporta tali dati correttamente con riferimento a
ciascun foglio.
Bruno
Post by b***@gmail.com
Elio
Option Explicit
Sub Test()
Dim arr() As String
Dim strShName As String
Dim sh As Worksheet
Dim counter As Long
For Each sh In Worksheets
strShName = sh.Name
Select Case strShName
Case Is = "NonStampare_1"
Case Is = "NonStampare_2"
Case Is = "NonStampare_3"
'aggiungere eventuale altro codice di criterio di esclusione
Case Else
counter = counter + 1
ReDim Preserve arr(1 To counter)
arr(counter) = strShName
End Select
Next sh
If counter = 0 Then
Exit Sub
End If
Sheets(arr).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ThisWorkbook.Path & "\" & "Tutti_Fogli_Insieme.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False,
OpenAfterPublish:= _ False
End Sub
Volendo si può dare un comando di stampa usuale da VBA puntando ad una stampante virtuale anche di terze parti come PDF Creator ma comunque, anche in tal caso, il passo comune è la selezione multipla dei Fogli. Pertanto il problema è se si vuole una soluzione completamente automatizzata che prescinda da quale foglio sia attiva all'avvio della macro oppure una parziale che preveda la selezione multipla manuale e poi il comando di esportazione
Bruno Campanini
2018-11-25 23:24:32 UTC
Permalink
Post by b***@gmail.com
Volendo si può dare un comando di stampa usuale da VBA puntando ad una
stampante virtuale anche di terze parti come PDF Creator ma comunque, anche
in tal caso, il passo comune è la selezione multipla dei Fogli. Pertanto il
problema è se si vuole una soluzione completamente automatizzata che
prescinda da quale foglio sia attiva all'avvio della macro oppure una
parziale che preveda la selezione multipla manuale e poi il comando di
esportazione
L'intendimento mio è che la selezione dei fogli avvenga in automatico
unitamente alla produzione dell'unico pdf.

Mi accorgo ora di aver risposto al tuo post precedente... credendo
di rispondere ad Eva.

Bruno
Eva Kant
2018-11-28 15:09:05 UTC
Permalink
Post by Bruno Campanini
Se il Workbook contiene n fogli TUTTI aventi le identiche proprietà
di stampa, con SaveAs WorkbookName.PDF Excel ti crea un solo PDF.
Prima di ciò, seleziona TUTTI i fogli poi
Page Layout -> Page Setup -> Page -> OK.
Grazie, mi avete aiutato molto. Ora devo prima creare un unico file con tutti gli avvisi creati singolarmente, e da questo file provvisorio genero il pdf di tutti i fogli.
Grazie

Loading...