Sviluppare funzionalita su Microsoft Office con VBA Esporta dati filtrati in altro foglio excel e crea pdf

Login Registrati
Stai vedendo 10 articoli - dal 1 a 10 (di 10 totali)
  • Autore
    Articoli
  • #36689 Score: 0 | Risposta

    FROST220684
    Partecipante

      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.
      #36696 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        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).

        #36710 Score: 0 | Risposta

        FROST220684
        Partecipante

          vecchio frac ha scritto:

          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.
          #36712 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            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 Sub

            Questo 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 🙂

             

            #36713 Score: 0 | Risposta

            FROST220684
            Partecipante

              vecchio frac ha scritto:

              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 dati

              l'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 Sub
              

              ho 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.
              #36717 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                272 pts

                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).

                #36721 Score: 0 | Risposta

                FROST220684
                Partecipante

                  vecchio frac ha scritto:

                  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 Sub

                  Edit 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.
                  #36733 Score: 0 | Risposta

                  FROST220684
                  Partecipante

                    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 file

                    1. 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.
                    #36737 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      272 pts

                      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?

                      #36749 Score: 0 | Risposta

                      FROST220684
                      Partecipante

                        si in effetti era un problema di destinaziona cartella risolto dopo il tuo input chiaramente

                        grazie grazie grazie

                      Login Registrati
                      Stai vedendo 10 articoli - dal 1 a 10 (di 10 totali)
                      Rispondi a: Esporta dati filtrati in altro foglio excel e crea pdf
                      Gli allegati sono permessi solo ad utenti REGISTRATI
                      Le tue informazioni: