› Sviluppare funzionalita su Microsoft Office con VBA › Esporta dati filtrati in altro foglio excel e crea pdf
-
AutoreArticoli
-
Ciao a tutti,
ho fatto un po di ricerche ma senza un risultato ottimale. mi servirebbe creare una macro su questo foglio "Note Voucher" che prenda dei dati filtrati in base alla data e li trasporti sul foglio accanto, ad eccezione delle colonne "C", "J" e "K" creando e salvando un pdf.
grazie a tutti per l'aiuto
Allegati:
You must be logged in to view attached files.Però non hai steso nemmeno una riga di codice 🙂
L'invito pertanto è provare a iniziare da te a stendere qualcosa che poi pian piano vediamo di sistemare.
Il primo consiglio è scrivere su un foglio di carta, in semplice italiano, i passi (la sequenza di passi) necessari a risolvere il problema (l'algoritmo).Però non hai steso nemmeno una riga di codice
io c'ho provato ma ho l'impressione che il registra macro serva a poco in questo caso. Ad ogni modo provo a rispiegare meglio.
1. io inserisco un filtro per data nel foglio Transfer che quindi non va inserito nella macro in quanto seleziono io la data d'interesse
2. la macro prende tutte le righe filtrate e le inserisce nel foglio "Stampa Foglio Transfer" ad eccezione delle colonne "C", "J" e "K" in quanto nel foglio "stampa foglio Transfer" non mi interessano i dati presenti in queste colonne
3. crea un pdf con nome "Transfer (data interessata - quella scelta e filtrata)" solo delle celle con contenuto e lo salva in una cartella sempre uguale
so di non aver scritto nemmeno una riga di codice ma a me riesce più complicato iniziare che apportare modifiche in seguito. scusa vecchio frac
Allegati:
You must be logged in to view attached files.Non devi affatto scusarti, nessuno accusa nessuno qui... però come sai provo sempre a spronare gli utenti 🙂
"Cominciare" è difficile quanto per uno scrittore trovarsi davanti a un foglio bianco: anche programmare è questione di creatività 😉Ecco una proposta, adesso bisogna sistemarla con l'esigenza reale (cartelle e nomi di file).
Option Explicit Sub copia_dati() Dim r As Range Dim rw As Range Dim i As Long Dim s As String Set r = Worksheets("transfer").Range("A2").CurrentRegion.Offset(2).SpecialCells(xlCellTypeVisible) Set r = r.Resize(r.Rows.Count - 2) s = Format(r(1), "yyyy-mm-dd") i = Application.CountA(Worksheets("stampa foglio transfer").Range("A:A")) + 1 For Each rw In r.Rows rw.Copy Worksheets("stampa foglio transfer").Cells(i, 1) i = i + 1 Next Worksheets("stampa foglio transfer").ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\TRANSFER " & s & ".pdf" MsgBox "Fatto" End SubQuesto codice è super semplificato e infatti...bara, perché include nel foglio transfer anche le colonne nascoste C J e K, ma poi quando le stampa in pdf non si vedono comunque 🙂
Non devi affatto scusarti, nessuno accusa nessuno qui... però come sai provo sempre a spronare gli utenti
no figurati non la prendevo come un accusa è solo che so di aver chiesto tante cose per necessità e sei sempre stato gentile ed a volte secca anche me non saper iniziare il codice, cerco di trovarlo su internet e nei forum proprio perchè poi modificare qualcosina posso anche riuscire ma quando le cose sono molto diverse da quello che mi serve vado nel pallone
senti io ho gia provato:
1. con il codice postato mi da questo errore di debug
2. eliminando quella riga sembra funzionare bene l'unico problema è che mi crea un pdf di 31 pagine
avrei bisogno che si limitasse sempre alle righe visibili o con contenuto di datil'ho modificato cosi perchè deve inviare anche una mail con l'allegato appena creato
Option Explicit Sub copia_dati() Dim r As Range Dim rw As Range Dim i As Long Dim s As String Dim p As String Dim NewMail As Object Dim mailConfig As Object Dim fields As Variant Dim msConfigURL As String Set r = Worksheets("transfer").Range("A2").CurrentRegion.Offset(2).SpecialCells(xlCellTypeVisible) s = Format(r(1), "yyyy-mm-dd") p = "C:\Users\Anna\Desktop" i = Application.CountA(Worksheets("stampa foglio transfer").Range("A:A")) + 1 For Each rw In r.Rows rw.Copy Worksheets("stampa foglio transfer").Cells(i, 1) i = i + 1 Next Worksheets("stampa foglio transfer").ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\TRANSFER\Transfer " & s & ".pdf" ActiveSheet.Range("$A$2:$L$299").AutoFilter Field:=1 Sheets("STAMPA FOGLIO TRANSFER").Select Range("A3:L97").Select Selection.ClearContents Sheets("transfer").Select Set NewMail = CreateObject("CDO.Message") Set mailConfig = CreateObject("CDO.Configuration") ' load all default configurations mailConfig.Load -1 Set fields = mailConfig.fields 'Set All Email Properties With NewMail .From = "Frost <ok>" 'mittente se si vuole far uscire un nome come mittente scrivere come in esempio Hotel Villaggio Eurolido .To = "ok" 'destinatario regola per prendere email da cella altrimenti anche email semplice" .CC = "" .BCC = "ok" ' destinatario nascosto - gmail non salva in posta inviata quindi bisogna trovare un modo per salvare il messaggio inviato .Subject = "Transfer & s" .Textbody = "" ' regola per corpo mail html da prendere da cella e foglio End With msConfigURL = "http://schemas.microsoft.com/cdo/configuration" With fields .Item(msConfigURL & "/smtpusessl") = True 'Enable SSL Authentication .Item(msConfigURL & "/smtpauthenticate") = 1 'SMTP authentication Enabled .Item(msConfigURL & "/smtpserver") = "smtp.gmail.com" 'Set the SMTP server details .Item(msConfigURL & "/smtpserverport") = 465 'Set the SMTP port Details .Item(msConfigURL & "/sendusing") = 2 'Send using default setting .Item(msConfigURL & "/sendusername") = "ok" 'Your gmail address .Item(msConfigURL & "/sendpassword") = "ok" ' password generata da gmail per app terzi .Update 'Update the configuration fields End With NewMail.Configuration = mailConfig NewMail.Send MsgBox "Fatto" End Subho solo 2 problemi riguardo la mail:
1. .Subject = "Transfer & s" (pensavo che per dare come oggetto la dicitura Transfer+data bastava aggiungere & s, ma non è cosi
)2. come faccio ad allegare il file pdf appena creato si può fare in automatico oppure devo sempre mettere il percorso in una cella? .AddAttachment????
Allegati:
You must be logged in to view attached files.Bè il mio primo codice era piuttosto grezzo, una proposta da provare. Funziona in certe circostanze e fallisce in altre. Qui l'errore è perchè se le righe filtrate sono due o meno, crasha ... quindi togli la riga del Resize:
Set r = r.Resize(r.Rows.Count - 2)Sul fatto che le pagine risultanti siano tantissime, è perchè nel file Excel la dimensione di pagina, i margini o l'area di stampa del foglio "stampa foglio transfer" sono impostate in modo non corretto. lo puoi verificare semplicemente con l'anteprima di stampa. Quando l'anteprima è soddisfacente, puoi pilotare il pdf. Mi smebra di vedere che sono state preformattate con bordo tutte le righe fino alla 255.ma, ed Excel cerca di stamparle tutte anche se non ci sono dati 🙂
Per l'allegato, chiaramente scrivere:
.Subject = "Transfer & s"non è corretto perchè "& s" si trova dentro le virgolette e diventa parte della stringa, quindi non stai facendo una concatenazione di stringhe ma stai semplicemente creando la stirnga "Transfer & s", letteralmente. Il codice corretto è.Subject = "Transfer " & s.Allegare il pdf è come hai intuito: dopo .TextBody:
.AddAttachment "percorso\dell\allegato.pdf"(da ripetere per ogni allegato che vuoi inserire nella mail).Allegare il pdf è come hai intuito: dopo .TextBody:
.AddAttachment "percorso\dell\allegato.pdf"(da ripetere per ogni allegato che vuoi inserire nella mail).Diciamo che ci sono uscito un po pazzo per capire come modificarlo ma alla fine l'ho spuntata io
ho solo un problema ho provato a formattare il foglio che manda in stampa il pdf ed effettivamente adesso mi esce una pagina se non fosse per un errore che mi riporta le tre colonne che io voglio escludere in seconda pagina c'ho provato in tutti i modi ma non riesco ad aggiustarlo
ed in più una volta usata la macro mi sembra che il file excel si impalli un pochino. ad es. se clicco su una cella ci mette un po per selezionarla etc. secondo te?
ecco il codice
Option Explicit Sub copia_dati() Dim r As Range Dim rw As Range Dim i As Long Dim s As String Dim p As String Dim t As String Dim c As Integer Dim v As Variant Dim wb1 As Workbook Dim NewMail As Object Dim mailConfig As Object Dim fields As Variant Dim msConfigURL As String With Application .ScreenUpdating = False .Cursor = xlWait End With Set r = Worksheets("transfer").Range("A2").CurrentRegion.Offset(2).SpecialCells(xlCellTypeVisible) Set wb1 = ThisWorkbook s = Format(r(1), "dd-mm-yyyy") p = "C:\Users\Anna\Desktop" For c = 1 To 1 v = Choose(c, "Transfer ") Next i = Application.CountA(Worksheets("stampa foglio transfer").Range("A:A")) + 1 For Each rw In r.Rows rw.Copy Worksheets("stampa foglio transfer").Cells(i, 1) i = i + 1 Next Worksheets("stampa foglio transfer").ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\TRANSFER\Transfer " & s & ".pdf" ActiveSheet.Range("$A$2:$L$299").AutoFilter Field:=1 wb1.Worksheets("TRANSFER").Range("S1").Value = p & "\TRANSFER\" & v & s & ".pdf" Sheets("STAMPA FOGLIO TRANSFER").Select Range("A3:L97").Select Selection.ClearContents Sheets("transfer").Select Set NewMail = CreateObject("CDO.Message") Set mailConfig = CreateObject("CDO.Configuration") ' load all default configurations mailConfig.Load -1 Set fields = mailConfig.fields 'Set All Email Properties With NewMail .From = "XXXX" 'mittente se si vuole far uscire un nome come mittente scrivere come in esempio XXXX .To = "XXXX" 'destinatario regola per prendere email da cella altrimenti anche email semplice" .CC = "" .BCC = "XXXX" ' destinatario nascosto - gmail non salva in posta inviata quindi bisogna trovare un modo per salvare il messaggio inviato .Subject = "Transfer " & s .Textbody = "Transfer " & s ' regola per corpo mail html da prendere da cella e foglio .AddAttachment Worksheets("Transfer").Range("S1").Value End With msConfigURL = "http://schemas.microsoft.com/cdo/configuration" With fields .Item(msConfigURL & "/smtpusessl") = True 'Enable SSL Authentication .Item(msConfigURL & "/smtpauthenticate") = 1 'SMTP authentication Enabled .Item(msConfigURL & "/smtpserver") = "smtp.gmail.com" 'Set the SMTP server details .Item(msConfigURL & "/smtpserverport") = 465 'Set the SMTP port Details .Item(msConfigURL & "/sendusing") = 2 'Send using default setting .Item(msConfigURL & "/sendusername") = "XXXX" 'Your gmail address .Item(msConfigURL & "/sendpassword") = "XXXX" ' password generata da gmail per app terzi .Update 'Update the configuration fields End With NewMail.Configuration = mailConfig NewMail.Send Range("S1").Select Selection.ClearContents Range("A1").Select With Application .ScreenUpdating = True .Cursor = xlDefault End With MsgBox "Fatto" End SubEdit by VF. Ho cancellato tutti i numerosi dati sensibili (mail, password, ecc.) che erano troppo in chiaro.
Allegati:
You must be logged in to view attached files.non ci posso credere dopo aver sistemato tutto sul file prova lo vado a mettere sul file originale di lavoro e non funziona l'esportazione pdf e non riesco a capire che problema abbia mi sembra identico in tutto e per tutto. vecchio frac aiutami a capire quello che ignoro
ti allego i due file1. file prova (funziona perfettamente) esporta in pdf
2. file originale (da errore sull'esportazione pdf)
Allegati:
You must be logged in to view attached files.Il file originale a me non dà errore e salva il pdf regolarmente... hai creato la cartella "Transfer" nella stessa cartella in cui viene lanciato il file originale? L'istruzione
Worksheets("Stampa Foglio Transfer").ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\TRANSFER\Transfer " & s & ".pdf"salva in pdf il foglio "stampa foglio transfer" nella cartella "Transfer" che sta dentro la cartella in cui è presente il file Excel e lo salva col nome Transfer XXXX.pdf (dove XXXX è la cella della data in formato giorno-mese-anno)
Tu che errore ricevi?
si in effetti era un problema di destinaziona cartella risolto dopo il tuo input chiaramente
grazie grazie grazie
-
AutoreArticoli
