› Sviluppare funzionalita su Microsoft Office con VBA › Estratti conto clienti (più fatture all'interno dello stesso pdf)
-
AutoreArticoli
-
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.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....
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 🙂
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
avevo trovato una soluzione ma è macchinosa
Magari vale la pena di provare ad automatizzare le 3 procedure.
Che ne dici?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.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?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
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()
eCompila_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.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!!!
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...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 )Ciao Albatros, innanzitutto grazie ... ho provato anche il tuo codice è funziona perfettamente anche lui, ma quale vantaggio si ha utilizzando quest'altro metodo?
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..."
Basta aggiungere ulteriori righe alla tabella nella scheda della lettera.
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!!!
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.
Ora mi vado a studiare tutto quello che hai fatto
Qui avevi scritto una cosa molto condivisibile! 🙂
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??
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 )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...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 🙂
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!!!
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?
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 🙂
-
AutoreArticoli