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

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 39 totali)
  • Autore
    Articoli
  • #19491 Score: 0 | 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 Score: 0 | 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 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          245 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 Score: 0 | 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 Score: 1 | Risposta

            DeletedUser
            Bloccato
              13 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 Score: 0 | 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 Score: 1 | Risposta

                DeletedUser
                Bloccato
                  13 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 Score: 0 | 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 Score: 1 | Risposta

                    DeletedUser
                    Bloccato
                      13 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 Score: 0 | 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 Score: 0 | Risposta

                        DeletedUser
                        Bloccato
                          13 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 Score: 0 | Risposta

                          albatros54
                          Moderatore
                            84 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 Score: 0 | 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 Score: 0 | 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 Score: 0 | Risposta

                                DeletedUser
                                Bloccato
                                  13 pts

                                  Basta aggiungere ulteriori righe alla tabella nella scheda della lettera.

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

                                    vecchio frac
                                    Senior Moderator
                                      245 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 Score: 0 | 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 Score: 0 | Risposta

                                        albatros54
                                        Moderatore
                                          84 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 Score: 0 | Risposta

                                          DeletedUser
                                          Bloccato
                                            13 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 Score: 0 | Risposta

                                            vecchio frac
                                            Senior Moderator
                                              245 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 Score: 0 | 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 Score: 0 | Risposta

                                                vecchio frac
                                                Senior Moderator
                                                  245 pts

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

                                                    vecchio frac
                                                    Senior Moderator
                                                      245 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 🙂 

                                                       

                                                    Login Registrati
                                                    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: