Sviluppare funzionalita su Microsoft Office con VBA Estratti conto clienti (più fatture all'interno dello stesso pdf)

LoginRegistrati
Stai vedendo 25 articoli - dal 1 a 25 (di 39 totali)
  • Autore
    Articoli
  • #19491 Risposta

    parisch
    Partecipante

      Ciao ragazzi,

      premetto che non sono un esperto di vba, ho cercato un pò di farmi aiutare sul web ma non ho avuto fortuna...

      Sto cercando di crearmi il mio applicativo che mi genera gli estratti conto dei clienti in pdf,e in gran parte ci sono riuscito, ora però il problema è che se un cliente ha più di una fattura non riesco a fargli capire a vba che trattandosi dello stesso cliente quelle fatture dovranno essere inserite nello stesso pdf... qualcuno mi aveva consigliato il ciclo for each ma sinceramente non riesco a metterlo in pratica...

      spero possiate aiutarmi... Grazie

      Allegati:
      You must be logged in to view attached files.
      #19718 Risposta

      parisch
      Partecipante

        Ciao Ragazzi...

        ho visto che nessuno mi ha risposto, so che forse per voi è una banalità, ma io non riesco proprio... anche se mi linkate una guida che possa aiutarmi ve ne sarei grato....

        #19728 Risposta

        vecchio frac
        Senior Moderator
        • Sfida #1
          171 pts

          Ah sì ricordo di aver visto questa richiesta ma poi non avevo tempo di approfondire. Non ne ho neanche adesso per la verità e non credo che sia una banalità (niente lo è per chi ha un problema 🙂 ), quindi se posso mi applico almeno per capire meglio cosa ti serve. Immagino che tu abbia una relazione uno a molti, cioè un cliente con molte fatture, e che devi recuperarle da un database per riunirle in un'unico report. La cosa più semplice potrebbe essere far l'ordinamento, poi avviare il ciclo For che parta dal primo nominativo (meglio se hai un codice univoco cliente) e che spazzoli le righe interessate finchè non trova un cliente diverso, a quel punto genera il pdf con i dati relativi e poi passa al blocco successivo. Ripeto, devo approfondire 🙂

          #19731 Risposta

          parisch
          Partecipante

            Si hai centrato il problema... io per il momento (visto che mi serviva urgente) avevo trovato una soluzione ma è macchinosa e porta via un sacco di tempo... tramite un menù a tendina seleziono un cliente, tramite una macro faccio filtrare tutte le fatture di quel cliente e le incolla sul foglio "STAMPA" e poi tramite un altra macro genera il pdf... ma è un operazione manuale che si deve fare "uno ad uno" snaturalizzando così lo spirito di VBA... e la mia pazienza   

            #19740 Risposta
            gibra
            gibra
            Partecipante
              10 pts

              parisch ha scritto:

              avevo trovato una soluzione ma è macchinosa

              Magari vale la pena di provare ad automatizzare le 3 procedure.
              Che ne dici?

               

              #19752 Risposta

              parisch
              Partecipante

                Allego il file che ho fatto... nella casella AC:1 del foglio "stampa" c'è la selezione del nominativo...

                non credo che con questo file ci si possa fare molto in quanto l'ho creato per un problema imminente e che ho risolto "alla meglio"

                Allegati:
                You must be logged in to view attached files.
                #19772 Risposta
                gibra
                gibra
                Partecipante
                  10 pts

                  parisch ha scritto:

                  nella casella AC:1 del foglio "stampa" c'è la selezione del nominativo...

                  Ma se cambio nominativo non si aggiorna nulla nel foglio STAMPA.
                  Invece dovrebbe aggiornarsi in base al cliente. Giusto?

                  #19792 Risposta

                  parisch
                  Partecipante

                    Scusami, non mi ero spiegato bene... la procedura è questa: si sceglie il nome, poi va premuto il pulsante "controlla" che filtra tutte le fatture del cliente e le elenca nel foglio STAMPA e poi il pulsante "compila e stampa" che genera il pdf e il bollettino

                    #19793 Risposta
                    gibra
                    gibra
                    Partecipante
                      10 pts

                      Ok, ti ho aggiustato/corretto le tue routine (che ti allego):

                      1. ho riunito tutto il codice nel Modulo1

                      2. ho aggiunto la routine EseguiTutto() che:
                           a) Crea un array con l'elenco UNIVOCO dei clienti (*)
                           b) Per ogni cliente, esegue in sequenza le tue routine: ControllaFiltri() e Compila_e_Stampa()

                      3. Ho modifcato 'temporaneamente' (per fare i miei TEST) la variabile </span>percorso<span style="color: #0000ff;"> che ora punta ad una sottocartella \SOLLECITI\ che devi creare nella stessa posizione del file allegato.
                      Una volta terminati i tuoi test, la ri-modificherai per le tue esigenze.

                      <em>(*) Il combobox dei clienti nel foglio STAMPA lo puoi pure eliminare, non serve a niente nella procedura 'batch' ma anche perché NON conteneva un elenco UNIVOCO dei clienti, quindi era inutilizzabile.</em>

                      Una volta aperto il file, premi il pulsante ESEGUI TUTTO.

                      La routine che ho aggiunto è questa:

                      Sub EseguiTutto()
                          Dim i As Long
                          Dim ur As Long
                          Dim clienti() As String
                          Dim cliente As String
                          Dim n As Long
                          
                          Dim ws As Worksheet
                          Set ws = Sheets("database")
                          ur = ws.Cells(ws.Rows.Count, 4).End(xlUp).Row
                          
                          ' elenco clienti va ordinato PRIMA,
                          ' così da ottenere le fatture ordinate in sequenza per lo stesso cliente
                          
                          ' crea un array con elenco UNIVOCO dei clienti
                          For i = 4 To ur
                              If i = 4 Then
                                  ReDim clienti(n)
                                  cliente = ws.Cells(i, 2)
                                  clienti(n) = cliente
                              Else
                                  If cliente <> ws.Cells(i, 2) Then
                                      n = n + 1
                                      ReDim Preserve clienti(n)
                                      cliente = ws.Cells(i, 2)
                                      clienti(n) = cliente
                                  End If
                              End If
                          Next i
                          
                          ' genera tutti i PDF per ogni cliente
                          For i = 0 To UBound(clienti)
                              Foglio3.Range("Y2") = clienti(i)
                              ControllaFiltri
                              Compila_e_Stampa
                          Next i
                          
                          MsgBox "Operazione effettuata!", vbInformation, "NOTIFICA"
                          
                      End Sub
                      Allegati:
                      You must be logged in to view attached files.
                      #19799 Risposta

                      parisch
                      Partecipante

                        Non ci credo... Forse ti Amo!!! è perfetto!! non puoi capire quante ore ci ho buttato sù a fare le prove più disparate.... Ora mi vado a studiare tutto quello che hai fatto.... GRAZIE ANCORA!!!

                        #19818 Risposta
                        gibra
                        gibra
                        Partecipante
                          10 pts

                          Gli errori, come hai capito, erano davver banali, solo frutto di piccole imprecisioni, e sono cose che capitano anche ai più bravi (a volte colpa della disattenzione, una talefonata, un collega che ti chiede qualcosa, ecc ...).

                          Il segreto sta tutto nell'imparare bene a fare il DEBUG del proprio codice, perché è l'unico modo per capire e risolvere.
                          Senza il DEBUG è come guidare a fari spenti nella notte.

                          Ma non dimenticare che il grosso del lavoro l'hai fatto tu! 
                          Io ho solo affinato...

                          #19819 Risposta
                          albatros54
                          albatros54
                          Moderatore
                          • Sfida #2
                            39 pts

                            gibra ha scritto:

                            Io ho solo affinato...

                            ho sostituito le righe di codice che generano una matrice con quelle che generano una collection:

                            Option Explicit
                            
                            Rem ====================================================
                            Rem Option Explicit DEVE SEMPRE ESSERE PRESENTE !!!!!!!
                            Rem LEGGERE ED APPLICARE LE SEGUENTI ISTRUZIONI:
                            Rem [Tutorial VBA] Consigli per i Newbies
                            Rem ====================================================
                            
                            Sub EseguiTutto()
                                Dim i As Long
                                Dim ur As Long, d As Long
                                Dim n As Long
                                Dim coll As New Collection
                                Dim ws As Worksheet
                                Dim rgsh1 As Range
                                Set ws = Sheets("database")
                                ur = ws.Cells(ws.Rows.Count, 4).End(xlUp).Row
                                Set rgsh1 = ws.Range("b4:b" & ur)
                                On Error Resume Next
                                    
                                    '    ' crea l'elenco UNIVOCO dei clienti
                            
                                For d = 1 To rgsh1.Rows.Count
                                    coll.Add rgsh1.Cells(d, 1).Value, rgsh1.Cells(d, 1).Value
                                Next d
                                ' genera tutti i PDF per ogni cliente
                                For i = 1 To coll.Count
                                    Foglio3.Range("Y2") = coll(i)
                                    ControllaFiltri
                                    Compila_e_Stampa
                                Next i
                            
                                MsgBox "Operazione effettuata!", vbInformation, "NOTIFICA"
                            
                            End Sub
                            

                             

                            Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                            Sempre il mare, uomo libero, amerai!
                            ( Charles Baudelaire )
                            #19838 Risposta

                            parisch
                            Partecipante

                              Ciao Albatros, innanzitutto grazie ... ho provato anche il tuo codice è funziona perfettamente anche lui, ma quale vantaggio si ha utilizzando quest'altro metodo?

                              #19902 Risposta

                              parisch
                              Partecipante

                                Ciao ragazzi, in questi giorni ho continuato a lavorare al file ed ora mi sembrava pronto per cominciare a lavorare, ma mi è subentrato un problemino, nel caso un cliente abbia molte fatture da sollecitare,naturalmente vba continua a copiarle nel foglio lettera fino a quando non sono finite, distruggendo così la formattazione della lettera per quel cliente e per i clienti successivi... c'è qualche soluzione per ovviare a questo problema? tipo mettere un limite per le fatture da copiare, o magari fare in modo che all'ultima riga disponibile compaia una dicitura tipo " e altre 5 fatture per un totale di..."

                                #19912 Risposta
                                gibra
                                gibra
                                Partecipante
                                  10 pts

                                  Basta aggiungere ulteriori righe alla tabella nella scheda della lettera.

                                  #19913 Risposta

                                  parisch
                                  Partecipante

                                    si ma già adesso che ne ho messe 11 non è il massimo a livello visivo per chi ha "solo" 1 o 2 fatture, magari si potrebbe fare che vba aggiunga righe in relazione a quante ne servano...ma anche questo non sò farlo!!!  

                                    #19914 Risposta

                                    vecchio frac
                                    Senior Moderator
                                    • Sfida #1
                                      171 pts

                                      parisch ha scritto:

                                      magari si potrebbe fare che vba aggiunga righe in relazione a quante ne servano...ma anche questo non sò farlo

                                      Non bisogna fare il passo più lungo della propria gamba. Io so che l'appetito vien mangiando, ma è per questo motivo che bisogna avere pazienza con se stessi, e prendersi il tempo di studiarsi come funziona VBA: altrimenti sei sempre costretto a chiedere integrazioni, modifiche, limature, magari aggiungendo pezzi trovati qua e là. Va benissimo migliorare il proprio prodotto, ma bisogna riuscire a farlo da soli, chiedendo qui solo quando si hanno difficoltà su un metodo, una funzione, un oggetto particolare, e non per chiedere integrazioni o codice pronto. Quindi con assoluta serenità e senza volerti offendere ti invito anche a rileggere il nostro regolamento.

                                      parisch ha scritto:

                                      Ora mi vado a studiare tutto quello che hai fatto

                                      Qui avevi scritto una cosa molto condivisibile! 🙂

                                      #19920 Risposta

                                      parisch
                                      Partecipante

                                        E lo sò... hai pienamente ragione!! e che mi faccio trasportare da questa fretta di dover risolvere, ma non per questo non mi metto a cercare e cercare di capire 🙂 , se puoi vedere le attività di ricerca del mio profilo su questo sito(e anche su internet in generale ) ti accorgerai che mi sono messo a cercare un bel pò... soltanto che la via più corta fa sempre gola, ma come dici tu, così facendo imparerò ben poco.... 

                                        piccolo OT: ma perche quando faccio le ricerche e apro discussioni vecchie la visualizzazione è diversa e non mi fà vedere i file caricati??

                                        #19921 Risposta
                                        albatros54
                                        albatros54
                                        Moderatore
                                        • Sfida #2
                                          39 pts

                                          parisch ha scritto:

                                          piccolo OT: ma perche quando faccio le ricerche e apro discussioni vecchie la visualizzazione è diversa e non mi fà vedere i file caricati??

                                          Perchè dopo un periodo di tempo, per non intasare il server i file vengono cancellati

                                          Per quanto riguarda le righe, io fare un ciclo do...loop until  per verificare il numero di righe che arrivato a sei, nel tuo caso, scriva nella riga sotto  la cifra delle fatture che non sono visualizzat4 nella lettera.

                                           

                                          Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                                          Sempre il mare, uomo libero, amerai!
                                          ( Charles Baudelaire )
                                          #19929 Risposta
                                          gibra
                                          gibra
                                          Partecipante
                                            10 pts

                                            parisch ha scritto:

                                            mi sono messo a cercare un bel pò...

                                            Non è cercando che si risolvono i problemi, ma STUDIANDO.

                                            Ti ho già detto qual'è il segreto (mio post precedente) ed è quello che serve nel 99% dei casi.
                                            Invece, cercando, non risolvi nulla nel 99% dei casi perché infatti sarebbe solo un caso più unico che raro se tu trovassi il codice che fa per te. La programmazione non funziona così.

                                            Quello che si deve imparare sono le BASI, cioè conoscere proprietà e metodi del linguaggio che poi costituiscono i mattoni.

                                            Quando sai quali mattoni usare, puoi costruire qualsiasi muro.
                                            Ma se invece speri di trovare i muri già fatti come servono a te, campa cavallo...

                                             

                                            #19930 Risposta

                                            vecchio frac
                                            Senior Moderator
                                            • Sfida #1
                                              171 pts

                                              Per non scoraggiare troppo il nostro amico però, aggiungo questo: dopo che hai costruito una solida base di conoscenza e hai capito come funziona, sarai capace di /cercare/ efficacemente quello che ti serve, scremando l'inutile o il dannoso. Cercare di per sè non è sbagliato, ma si deve sapere cosa si cerca e si deve capire quello che si incontra. Fra qualche tempo, ti basterà una letta al codice altrui per ripercorrere nella tua testa cosa fanno le diverse istruzioni e sarai in grado di prevedere se il frammento che stai esaminando ti è utile oppure no.

                                              Fai tesoro del suo consiglio: gibra è un programmatore di professione e sa benissimo quanto è ripida la curva iniziale di apprendimento. Ma una volta che hai la tua bella base di conoscenza, non avrai più paura nemmeno ad affrontare (e a porti) nuove sfide 🙂

                                              #19931 Risposta

                                              parisch
                                              Partecipante

                                                Ragazzi, buona sera.... avete ragione che cercando in giro e quasi impossibile trovare la soluzione adatta a me, ma io cerco spunti per potermi adattare... cmq oggi ho cercato molto ma tutte le soluzioni che trovavo non riuscivo ad adattarle al mio caso... e poi mi si è accesa la lampadina, stavo sbagliando approccio cercando di aggiungere righe che mi incasinavano tutto ... ho fatto tutto modificando un pò il codice vba e sfruttando le formule excel, in poche parole ho bloccato il numero di righe che poteva copiare lasciando solo l'ultima libera nella tabella,ho utilizzato il contanumeri in fondo alla pagina dove vengono filtrate tutte le fatture di quel cliente iniziando a contare dalla prima riga che non avrebbe copiato, stessa cosa per la somma degli importi. Poi nel foglio lettera nell'ultima riga disponibile ho messo una formula SE, che se il contanumeri è maggiore di uno mi compare la dicitura che mi indica il numero  delle altre fatture insolute e il loro totale...Questa parte per ora sembra terminata!!!  

                                                #19932 Risposta

                                                vecchio frac
                                                Senior Moderator
                                                • Sfida #1
                                                  171 pts

                                                  #19954 Risposta

                                                  parisch
                                                  Partecipante

                                                    Salve ragazzi, 

                                                    vi chiedo lumi su un problema che mi è capitato...  mi sono accorto che il mio file sta diventando sempre più grande, anche se il database delle fatture era sempre lo stesso... me ne sono accorto perchè ad ogni prova che faccio salvo il file con un nome diverso e controllando gli ultimi salvataggi mi sono accorto che sono arrivato a circa 150/160 mb  , ho provato a cancellare tutte le fatture presenti e la dimensione si abbassa di una 20tina di mb(che tra l'altro e la dimensione del database originale) . Ora il problema l'ho risolto andando a cancellare foglio per foglio salvando ogni volta il file, e mi sono accorto che il foglio che occupava circa 120mb è il foglio dove vanno a finire le fatture filtrate per cliente, ma che possiede solo poche righe ed a ogni ciclo viene pulito con .ClearContents... sapete da cosa può dipendere questa cosa? 

                                                    #19955 Risposta

                                                    vecchio frac
                                                    Senior Moderator
                                                    • Sfida #1
                                                      171 pts

                                                      Credo dipenda dall'Usedrange, ogni volta che si va a modificare una cella (basta anche Canc su una cella vuota) questo oggetto viene riposizionato.

                                                      Elimina fisicamente tutte le righe dalla prima riga vuota alla fine della tabella dati in poi, e fai lo stesso dalla prima colonna vuota alla fine della tabella dati per tutte le restanti colonne, poi salva e verifica la dimensione.

                                                      Nota: fai queste operazioni su una copia di backup, non vorrei essere banale nel dirlo ma è meglio esserlo 🙂 

                                                       

                                                    LoginRegistrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 39 totali)
                                                    Rispondi a: Estratti conto clienti (più fatture all'interno dello stesso pdf)
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni:



                                                    vecchio frac - 2704 risposte

                                                    albatros54
                                                    albatros54 - 704 risposte

                                                    patel
                                                    patel - 625 risposte

                                                    Marius44
                                                    Marius44 - 536 risposte

                                                    Luca73
                                                    Luca73 - 508 risposte