Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Macro per salvare in pdf

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro per salvare in pdf

Postdi giorgioarte » 28/04/15 16:54

Ciao a tutti,
chiedo il vostro aiuto per il seguente problema, essendomi da poco avvicinato alle macro.
Ho un file in excel 2003 che utilizzo spesso e si compone di diversi fogli (foglio1, foglio2, ecc.). Ora del foglio1 (ad es.) voglio salvare la pag. da 2 a 7 (ad es.) in una cartella ben precisa ed in pdf dando io il nome, ogni volta diverso e così via con altri intervalli. Vorrei un bottone che schiacciato mi fa tutto in automatico, essendo tutto predefinito, senza dover ogni volta impostare intervallo e destinazione del file. Possibile?
Ahh ho installato adobe pdf che dalla stampa mi generali il pdf.
Grazie per ogni aiuto
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Sponsor
 

Re: Macro per salvare in pdf

Postdi ricky53 » 28/04/15 23:32

Ciao,
prova in questo modo:
attiva il registratore di macro
esegui le operazioni che hai descritto selezionando la stampante "PDF" creata da Adobe
ferma il registratore
allega il codice ottenuto

E vedremo come procedere.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Macro per salvare in pdf

Postdi Flash30005 » 28/04/15 23:58

Ciao Giorgioarte e benvenuto nel Forum

oltre a quanto descritto da Ricky puoi anche pubblicare il file con le indicazioni dell'output

ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Macro per salvare in pdf

Postdi giorgioarte » 29/04/15 07:50

Ciao a tutti e grazie.
Ho già provato a fare quanto detto nel primo post da riky53 e funziona ma non mi memorizza il percorso ed è proprio qui che ho bisogno di aiuto: ho una struttura di cartelle molto articolata! Perdo più tempo a girare per trovare dove andare che altro!
Per questo volevo fare una macro con un bottone che schiaccio e mi manda li! .. e finito.
Tanto lo stesso intervallo di pagine va sempre nella stessa cartella, cambia solo il nome che devo dare ogni volta.
Ora, con registra ottengo questo:

Sub Stampa()
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=6, Copies:=1
End Sub

Come vedi non memorizza un percorso...accidenti!
Il post di flash30005 non l'ho capito...scusa ma con le macro sono a zero!
Grazie ancora
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi giorgioarte » 29/04/15 07:51

...scusa, forse è meglio questo:

Sub Macro1()
'
' Macro1 Macro
' Macro registrata il 29/04/2015 da Giorgio
'

'
Application.ActivePrinter = "Adobe PDF su Ne02:"
ActiveWindow.SelectedSheets.PrintOut From:=2, To:=5, Copies:=1, _
ActivePrinter:="Adobe PDF su Ne02:", Collate:=True
End Sub
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi giorgioarte » 29/04/15 12:46

...non si riesce a fare?
Il silenzio mi preoccupa!
Grazie
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi Anthony47 » 29/04/15 15:03

Per sfruttare programmaticamente il componente Adobe dovresti utilizzare la sua libreria di comandi.

In alternativa puoi provare a sfruttare quanto avevamo suggerito a Lele2774 in questa discussione: viewtopic.php?p=557970#p557427
Cioe' l' installazione della stampante virtuale PDFCreator (vedi http://sourceforge.net/projects/pdfcreator) e l' uso di una macro che stampa su file pdf usando quella stampante virtuale.
L' intervallo da stampare lo devi specificare tu su Excel, ad esempio selezionando l' area da stampare e poi all' interno della macro (primo link) invece di usare ActiveSheet.PrintOut userai Selection.PrintOut. Le istruzioni per selezionare un' area (in alternativa alla stampa completa del foglio o dell' area di stampa impostata) ovviamente le inserirai all' interno della macro che richiama la Sub macroPrintPDF1; la loro sintassi e' del tipo Range("A50:Q150").Select

Prova e fai sapere se risolvi così o serve una spinta ulteriore.
Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per salvare in pdf

Postdi giorgioarte » 29/04/15 15:59

... il problema è sempre il percorso che non viene memorizzato dalla macro. Quindi quando faccio una seconda macro con intervallo diverso mi salva automaticamente nell'ultimo percorso fatto, mentre io vorrei che fosse definito nella macro: schiaccio il bottone e salvo l'intervallo in pdf nella cartella di destinazione, che varia a seconda dell'intervallo....Manca sempre la parte finale.
Grazie comunque
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi Anthony47 » 29/04/15 23:11

Codice: Seleziona tutto
     PercF="C:\QualeDirectory"   
     NFile=Range("A1").Value & ".pdf"
     Call macroPrintPDF1(PercF & "\", NFile)
Quindi devi solo indicare di volta in volta in quale directory il file deve essere salvato; dove e' il problema?
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per salvare in pdf

Postdi giorgioarte » 30/04/15 15:06

...ecco ci quà.
Allora, ho coinvolto anche mio fratello e questa la macro che ne è nata:

Sub Macro1_prove_giornaliere()
'
' Macro1 Macro
' Macro registrata il 30/04/2015 da Giorgio
'

' Sulla Cella (66,17) c'è un codice identificativo per il file

Dim NomeFile As String
Dim Percorso As String
Percorso = "C:\prova"
NomeFile = Percorso + "\" + ActiveSheet.Cells(66, 17).Value + ".pdf"

Application.ActivePrinter = "PDFCreator su Ne00:"
ActiveWindow.SelectedSheets.PrintOut From:=3, To:=6, Copies:=1, _
ActivePrinter:="PDFCreator su Ne00:", PrintToFile:=True, Collate:=True, PrToFileName:=NomeFile


End Sub

Allora abbiamo installato pdfcreator, il file si nomina attingendo da una cella (e la cosa mi può andare bene), segue il percorso di destinazione definito .... ma salva in .ps!!!
Uffa, dove stà il problema?
Qualche idea?
Grazie a tutti
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi Anthony47 » 30/04/15 19:50

Se usi PrintToFile che cosa ti aspettavi?
Adesso non ti resta che provare quanto suggerito a Lele2774.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per salvare in pdf

Postdi giorgioarte » 01/05/15 07:24

...riusciresti a scrivermela tu?...grazie comunque
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi Anthony47 » 02/05/15 15:45

Non ho difficolta' a preparare un esempio (file ESEMPIO_4GA.xlsm), scaricabile qui: https://www.dropbox.com/s/z9198knwevgfk ... .xlsm?dl=0

La macro di "stampa dell' area selezionata", derivata da quanto suggerito a Lele2774 e modificata come descritta in un precedente messaggio in questa discussione, e' questa:
Codice: Seleziona tutto
Sub macroPrintPDF1Selec(ByVal PercF As String, ByVal NFile As String)
'
'QUESTA VERSIONE E' DA RICHIAMARE COME UNA FUNZIONE DA ALTRA MACRO
' Es Call macroPrintPDF1Selec ("C:\Documenti\","pippo.pdf")
'
'Dim objPDFCreator As PDFCreator.clsPDFCreator '>> Early Bind
Dim objPDFCreator  '<<<  Late Bind

On Error Resume Next
    If Dir(PercF & NFile) = NFile Then Kill (PercF & NFile)
    Shell "taskkill /f /im PDFCreator.exe", vbHide
Application.Wait (Now + TimeValue("0:00:02"))
On Error GoTo 0
'
'Set objPDFCreator = New PDFCreator.clsPDFCreator '>>>
Set objPDFCreator = CreateObject("PDFCreator.clsPDFCreator") '<<

With objPDFCreator
.cStart "/NoProcessingAtStartup"
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = PercF
.cOption("AutosaveFilename") = NFile
.cOption("AutosaveFormat") = 0
aaa = .cOption("AutosaveFilename")
.cVisible = False
.cClearCache
End With
'
'ActiveSheet.PrintOut Copies:=1, ActivePrinter:="PDFCreator"   'stampa "Foglio"
Selection.PrintOut Copies:=1, ActivePrinter:="PDFCreator"   'stampa "Selezione"

objPDFCreator.cPrinterStop = False

'attesa disponibilita' file finale
Do
   DoEvents
Loop Until Dir(PercF & NFile) = NFile
Application.Wait (Now + TimeValue("0:00:02"))
'clear finale oggetto e kill processo
Set objPDFCreator = Nothing
Shell "taskkill /f /im PDFCreator.exe", vbHide
'
End Sub

Questa e' richiamata da una macro predisposta per stampare 2 aree:
Codice: Seleziona tutto
Sub PrintF12()
Sheets(Sheets("Foglio2").Range("A2").Value).Select
    Range(Sheets("Foglio2").Range("B2").Value).Select
    PercF = Sheets("Foglio2").Range("C2").Value
    NFile = Sheets("Foglio2").Range("D2").Value & ".pdf"
    Call macroPrintPDF1Selec(PercF & "\", NFile)
Sheets(Sheets("Foglio2").Range("A3").Value).Select
    Range(Sheets("Foglio2").Range("B3").Value).Select
    PercF = Sheets("Foglio2").Range("C3").Value
    NFile = Sheets("Foglio2").Range("D3").Value & ".pdf"
    Call macroPrintPDF1Selec(PercF & "\", NFile)
End Sub

Lanciando la macro PrintF12 si avviera' su stampante PDFCreator (che deve essere gia' installata) la stampa di quanto indicato in Foglio2:
-Foglio /intervallo, Directory, File di salvataggio
Ovviamente e' un esempio; devi creare una tua "PrintF12" che richiami la Sub macroPrintPDF1Selec con i tuoi parametri (Area selezionata, Percorso, NomeFile).

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per salvare in pdf

Postdi giorgioarte » 06/05/15 17:22

...eccoci quà. Dopo vari maneggiamenti così quasi funziona.

Codice: Seleziona tutto
Sub Macro1()
'
' Macro1 Macro
' Macro registrata il 30/04/2015 da Giorgio
'

'
   
    Dim NomeFile As String
    Dim Percorso As String
    Percorso = "C:\prova\"
    NomeFile = ActiveSheet.Cells(66, 17).Value + ".pdf"
    Call macroPrintPDF1Selec(Percorso, NomeFile)
End Sub

Codice: Seleziona tutto
Sub macroPrintPDF1Selec(ByVal PercF As String, ByVal NFile As String)

    Dim objPDFCreator  As PDFCreator.clsPDFCreator '<<<  Late Bind

    On Error Resume Next
        If Dir(PercF & NFile) = NFile Then
            Kill (PercF & NFile)
        End If
        Shell "taskkill /f /im PDFCreator.exe", vbHide
        Application.Wait (Now + TimeValue("0:00:02"))
    On Error GoTo 0
    Set objPDFCreator = CreateObject("PDFCreator.clsPDFCreator") '<<
    With objPDFCreator
        '.cStart "/NoProcessingAtStartup"
        .cOption("UseAutosave") = 1
        .cOption("UseAutosaveDirectory") = 1
        .cOption("AutosaveDirectory") = PercF
        .cOption("AutosaveFilename") = NFile
        .cOption("OutputFilename") = NFile
        .cOption("AutosaveFormat") = 0
        .cOption("FilenameSubstitutions") = NFile
        .cOption("FilenameSubstitutionsOnlyInTitle") = True
        '.cVisible = False
        .cClearCache
    End With

    'Selection.PrintOut Copies:=1, ActivePrinter:="PDFCreator", IgnorePrintAreas:=True  'stampa "Selezione"
    Sheets("prove").PrintOut From:=3, To:=6, Copies:=1, ActivePrinter:="PDFCreator", Collate:=True
    objPDFCreator.cPrinterStop = False
    'Do
    '   DoEvents
    'Loop Until Dir(PercF & NFile) = NFile
    'Application.Wait (Now + TimeValue("0:00:20"))
    'Set objPDFCreator = Nothing
    'Shell "taskkill /f /im PDFCreator.exe", vbHide
End Sub


L'unico problema è che si apre pdfcreator e mi chiede il nome del file di salvataggio invece che pescarlo dall'intervallo definito.
Come mai?
Grazie mille per le dritte,
Giorgio
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi Anthony47 » 07/05/15 01:40

Non funziona perche' hai copiato male e hai fatto "qualche modifica".
Ho visto anche che hai fatto delle prove aumentando a dismisura l' attesa prima di killare l' applicazione (Application.Wait (Now + TimeValue("0:00:20")), commentata nella versione che hai pubblicato), che mi fa pensare che i tempi di attesa che avevo inserito non erano sufficienti sul tuo pc.
Ho visto anche che hai "cablato" all' interno della Sub macroPrintPDF1Selec il foglio e le pagine che vuoi stampare (Sheets("prove").PrintOut From:=3, To:=6, etc etc), che pero' e' contrario al concetto di subroutine richiamata con parametri.
Cio' detto, ho pubblicato una nuova versione del file di esempio (reperibie allo stesso link) in cui ho inserito:
-una Sub macroPrintPDF1FromTo, richiamabile con Percorso e NomeFile su cui salvare, ma anche con i parametri "Stampa da pag" e "Stampa fino a pag"
-una Sub myWait che realizza delle attese piu' intelligenti che non la Application.Wait (quest'ultima in realta' "succhia" durante l' attesa quasi tutta la cpu disponibile, lasciando poco spazio agli altri processi che dovrebbero completarsi in quei secondi di attesa; la Sub myWait intercala esplicitamente l' attesa con la gestione di eventi di sistema). Nella Sub macroPrintPDF1FromTo ho quindi sostituito tutte le vecchie Application.Wait con richiami alla Sub myWait
-una Sub PrintNPagine(), che e' un esempio di come si sfrutta la Sub macroPrintPDF1FromTo: selezionare il foglio da stampare, richiamare la nuova Sub macroPrintPDF1FromTo con i suoi parametri compreso "da pag" a "Fino a pag".

Tutto questo corrisponde ai seguenti codici:
Codice: Seleziona tutto
Sub macroPrintPDF1FromTo(ByVal PercF As String, ByVal NFile As String, Optional ByVal myFrom As Long = 1, Optional ByVal myTo As Long = 999)
'
'QUESTA VERSIONE E' DA RICHIAMARE COME UNA FUNZIONE DA ALTRA MACRO
' Es Call macroPrintPDF1Selec ("C:\Documenti\","pippo.pdf", 1 , 3)
' Nell'esempio da 1 a 3 sono le pagine da stampare
' Se omessi, stampa da 1 a 999, cioe' praticamente tutte

'Dim objPDFCreator As PDFCreator.clsPDFCreator '>> Early Bind
Dim objPDFCreator  '<<<  Late Bind

On Error Resume Next
    If Dir(PercF & NFile) = NFile Then Kill (PercF & NFile)
    Shell "taskkill /f /im PDFCreator.exe", vbHide
'Application.Wait (Now + TimeValue("0:00:02"))
myWait (2)
On Error GoTo 0
'
'Set objPDFCreator = New PDFCreator.clsPDFCreator '>>>
Set objPDFCreator = CreateObject("PDFCreator.clsPDFCreator") '<<
aaa1 = objPDFCreator.cProgramIsRunning

With objPDFCreator
.cStart "/NoProcessingAtStartup"
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = PercF
.cOption("AutosaveFilename") = NFile
.cOption("AutosaveFormat") = 0
aaa = .cOption("AutosaveFilename")
.cVisible = False
.cClearCache
End With
'
'ActiveSheet.PrintOut Copies:=1, ActivePrinter:="PDFCreator"   'stampa "Foglio"
'Selection.PrintOut Copies:=1, ActivePrinter:="PDFCreator"   'stampa "Foglio"
ActiveSheet.PrintOut From:=myFrom, To:=myTo, Copies:=1, ActivePrinter:="PDFCreator", Collate:=True
objPDFCreator.cPrinterStop = False

'attesa disponibilita' file finale
Do
   DoEvents
Loop Until Dir(PercF & NFile) = NFile
'Application.Wait (Now + TimeValue("0:00:05"))
myWait (4)
'clear finale oggetto e kill processo
Set objPDFCreator = Nothing
Shell "taskkill /f /im PDFCreator.exe", vbHide
'
End Sub

Codice: Seleziona tutto
Sub myWait(myStab As Single)
'Attende N secondi:
Dim myStTiM As Single
'
    myStTiM = Timer
    Do          'wait myStab
        DoEvents
        If Timer > myStTiM + myStab Or Timer < myStTiM Then Exit Do
    DoEvents: Loop
End Sub
Queste prime due vanno lasciate cosi'.

Codice: Seleziona tutto
Sub PrintNPagine()
'Richiama la macroPrintPDF1FromTo
'
Sheets("Foglio1").Select        '<< Il Foglio da stampare
myfile = "pippo1.pdf"
Call macroPrintPDF1FromTo("C:\PROVA\pippo\", myfile, 2, 4)   'Stampa da pag 2 a pag 4
End Sub

Quest'ultimo e' solo un esempio; direi che la tua PrintNPagine, per mimare quanto scritto nel tuo esempio di Macro1, dovrebbe essere
Codice: Seleziona tutto
Sub PrintNPagine()
'Richiama la macroPrintPDF1FromTo
'
myfile = ActiveSheet.Cells(66, 17).Value + ".pdf"      'Puo' essere utile usare Sheets("NomeFoglio") invece che Activesheet...
Sheets("prove").Select        '<< Il Foglio da stampare
Call macroPrintPDF1FromTo("C:\prova\", myfile, 3, 6)   'Stampa da pag 3 a pag 6
End Sub

Quindi (ri)prova e fai sapere...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per salvare in pdf

Postdi giorgioarte » 07/05/15 08:50

..ho un dubbio: quale versione di pdfcreator usi?
Io ora la 1.2.3 ma con la 2.1 non funzionava nulla!
Grazie
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49

Re: Macro per salvare in pdf

Postdi Anthony47 » 07/05/15 22:12

In effetti io sono alla 1.7.3, non ho ancora scaricato la nuova versione; 1.2.3 mi sembra vecchiotta, la 1.7.3 e' ancora disponibile per download, io la scaricherei.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per salvare in pdf

Postdi giorgioarte » 08/05/15 19:54

Ora funziona tutto. Grazie mille Anthony!!
giorgioarte
Utente Junior
 
Post: 10
Iscritto il: 28/04/15 16:49


Torna a Applicazioni Office Windows


Topic correlati a "Macro per salvare in pdf":


Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti