› Excel e gli applicativi Microsoft Office › REFRESH ListBox
-
AutoreArticoli
-
buongiorno a tutti
pongo un problema relativo alla gestione di un comunissimo ListBox (di seguito le proprietà)

il ListBox - un elenco di conti di cui propone i dati caratteristici più importanti - viene correttamente alimentato e visualizzato.. viene correttamente gestito - alla selezione del conto consegue la visualizzazione dei movimenti, etc. etc.
ogni qualvolta vengono apportate modifiche ai saldi, una routine si preoccupa di aggiornare gli stessi sul ListBox allineandoli a quelli registrati sui fogli corrispondenti
ora vengo al problema: alcuni elementi del ListBox così come mostrati a video NON risultano rinfrescati finchè non si procede ad uno scroll di almeno due pagine avanti o indietro
il controllo rimane al user form - NON viene più eseguita nessuna riga di codice - e solo dopo un paio di scroll tutti gli oggetti del ListBox risultano correttamente aggiornati
il codice della routine di aggiornamento dei valori del ListBox è quello di seguito (poco fa ho aggiunto il codice che 'marca' ciascun elemento con un carattere di segnatura differente ad ogni refresh successivo proprio per avere evidenza di quelli NON rinfrescati) ...
Private Sub AggiornaLBConti() 'aggiornamento dei soli saldi della lista LBConti, originariamente strutturata come segue: '0 - eventuale ">" per evidenziare livello di raggruppamento (20 pti) '1 - riga di CONTI in cui è reperito il conto (0 pti) '2 - identificativo di conto (0 pti) '3 - descrizione (170 pti) '4 - saldo quantità (quando significativa) (60 pti) '5 - unità di misura (quando significativa) (39 pti) '6 - saldo controvalore (quando significativo) (76 pti) '7 - divisa controvalore (quando significativo) (28 pti) '8 - saldo importo (76 pti) Dim riCto As Integer Dim indLBConti As Integer 'INIZIO MODIFICA 2020 01 03 hdCtrLBConti = hdCtrLBConti + 1 'FINE MODIFICA With LBConti For indLBConti = 0 To LBConti.ListCount - 1 riCto = LBConti.List(indLBConti, 1) If riCto <> 0 Then 'INIZIO MODIFICA 2020 01 03 : si aggiunge un carattere di 'segnatura' del refresh per evidenziare a video eventuali "ritardi" 'nella visualizzazione della occorrenza rinfrescata (si alternano volutamente caratteri di controllo evidentemente differenti 'tra loro proprio per avere evidenza di eventuali differenze tra refresh successivi) .List(indLBConti, 0) = " " + Mid("*#°@^§", ((hdCtrLBConti - 1) Mod 6) + 1, 1) 'FINE MODIFICA .List(indLBConti, 3) = .List(indLBConti, 3) If Sheets(shCto).Cells(riCto, 7) <> Sheets(shCto).Cells(riCto, 8) And _ Sheets(shCto).Cells(riCto, 7) <> divRif Then 'quantità significativa .List(indLBConti, 4) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 13), "#,###,##0+;#,###,##0-", 10) .List(indLBConti, 5) = Sheets(shCto).Cells(riCto, 7) End If If Sheets(shCto).Cells(riCto, 8) <> divRif Then 'controvalore significativo .List(indLBConti, 6) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 14), "#,###,##0.00+;#,###,##0.00-", 13) .List(indLBConti, 7) = Sheets(shCto).Cells(riCto, 8) End If .List(indLBConti, 8) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 15), "#,###,##0.00+;#,###,##0.00-", 13) riCto = riCto + 1 End If Next End With End Subpurtroppo il risultato dopo il primo refresh è questo: alcuni elementi del ListBox NON sono caratterizzati dall'asterisco che ha contraddistinto quel primo refresh.. poi scrollando di un paio di pagine e ritornando sugli elementi 'incriminati' anch'essi risultano rinfrescati

boh ... non è un problema insormontabile - con questa 'segnatura' ci si accorge immediatamente che la situazione non è fedelmente riprodotta e con un paio di scroll - senza più alcuna interazione col codice - tutto si sistema, però mi rimane la curiosità di capire dove sbaglio
mi è capitato più volte di leggere questo forum e trovare risposte interessantissime da parte di utenti senz'altro più preparati e più capaci di me, ora ne approfitto per porre un quesito che da qualche tempo mi 'tormenta' e sicuramente qualcuno saprà spiegarmi
grazie mille per l'attenzione
Non ho capito bene.
Quando aggiungi una nuova voce alla listbox, sicuramente la aggiungi da una userform, che va ad aggiornare il foglio dove c'è il DataBase che carica la tua listbox, secondo me, se ho capito, dopo che tu hai aggiornato il DB con la nuova voce, devi dire alla listbox di ricaricare i dati del tuo foglio, cosi la listbox si aggiorna.
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 )Non ho capito bene.
sicuramente sono io che non mi sono spiegato
NON vengono aggiunti elementi al ListBox
l'unica informazione che può variare in quel ListBox - a seguito di movimentazione contabile dei conti (appunto elencati nel ListBox) - è il saldo del conto
quando viene effettuata qualche movimentazione che va ovviamente ad aggiornare il saldo del conto, il ListBox viene allineato modificando le colonne relative ai saldi
tutto funziona perfettamente da sempre - è qualche anno che utilizzo questa 'procedura' - eccetto il problema già esposto: alcune righe del ListBox pur essendo aggiornate vengono proposte nella loro versione precedente finchè non si scrolla di un paio di pagine (quindi senza più alcun intervento del codice)
ora la stessa procedura riadattata ad una nuova realtà dovrà essere utilizzata da un amico e avrei voluto risolvere questo inconveniente e non limitarmi semplicemente a evidenziarlo - come fatto - aggiungendo in testa ad ogni elemento della lista quella 'segnatura' - diversa ad ogni aggiornamento, alternando caratteri visivamente differenti tra loro ( * # ° @ ^ § ) - in modo da accorgersi del problema (e quindi a risolverlo facendo quel paio di scroll)
ribadisco il problema - o perlomeno quello che ho rilevato io :
il codice all'interno dello UserForm rivalorizza correttamente le colonne dei saldi di tutti i conti presenti nel ListBox riallinenadoli a quelli presenti sul foglio apposito, ma quando il controllo torna all'interazione UserForm-utente alcune righe del ListBox NON risultano visualizzate come in realtà dovrebbero finchè non si effettua uno scroll di un paio di pagine
grazie per l'attenzione
scusa potresti postare le righe di codice che caricano la listbox?
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 )scusa potresti postare le righe di codice che caricano la listbox?
quelle che la aggiornano le ho già postate sopra - AggiornaLBConti()
quelle che la popolano esclusivamente la prima volta sono qui di seguito
Private Sub CaricaLBConti() '0 - eventuale ">" per evidenziare livello di raggruppamento (20 pti) '1 - riga di CONTI in cui è reperito il conto (0 pti) '2 - identificativo di conto (0 pti) '3 - descrizione (170 pti) '4 - saldo quantità (quando significativa) (60 pti) '5 - unità di misura (quando significativa) (39 pti) '6 - saldo controvalore (quando significativo) (76 pti) '7 - divisa controvalore (quando significativo) (28 pti) '8 - saldo importo (76 pti) Dim riCto As Integer Dim brkRgp As String Dim indLBConti As Integer 'INIZIO MODIFICA 2020 01 03 hdCtrLBConti = 0 'FINE MODIFICA brkRgp = "" riCto = riPrimoConto indLBConti = -1 With LBConti .Clear Do Until Sheets(shCto).Cells(riCto, 2) = "" If Sheets(shCto).Cells(riCto, 4) <> brkRgp Then brkRgp = Sheets(shCto).Cells(riCto, 4) indLBConti = indLBConti + 1 .AddItem .List(indLBConti, 0) = ">" .List(indLBConti, 1) = 0 .List(indLBConti, 2) = 0 .List(indLBConti, 3) = brkRgp End If indLBConti = indLBConti + 1 .AddItem .List(indLBConti, 0) = "" .List(indLBConti, 1) = riCto .List(indLBConti, 2) = Sheets(shCto).Cells(riCto, 1) .List(indLBConti, 3) = Sheets(shCto).Cells(riCto, 2) If Sheets(shCto).Cells(riCto, 7) <> Sheets(shCto).Cells(riCto, 8) And _ Sheets(shCto).Cells(riCto, 7) <> divRif Then 'quantità significativa .List(indLBConti, 4) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 13), "#,###,##0+;#,###,##0-", 10) .List(indLBConti, 5) = Sheets(shCto).Cells(riCto, 7) End If If Sheets(shCto).Cells(riCto, 8) <> divRif Then 'controvalore significativo .List(indLBConti, 6) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 14), "#,###,##0.00+;#,###,##0.00-", 13) .List(indLBConti, 7) = Sheets(shCto).Cells(riCto, 8) End If .List(indLBConti, 8) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 15), "#,###,##0.00+;#,###,##0.00-", 13) If Sheets(shCto).Cells(riCto, 1) = pbCtoScadenzeId Then hdLBCtoScadenzeInd = indLBConti riCto = riCto + 1 Loop End With End SubBuon anno a tutti e scusate l'intromissione.
Quando dici:
ogni qualvolta vengono apportate modifiche ai saldi, una routine si preoccupa di aggiornare gli stessi sul ListBox allineandoli a quelli registrati sui fogli corrispondenti
il "codice VBA" deve provvedere all'aggiornamento. Come?
Da quanto so io, occorre "svuotare" la ListBox e "ricaricarla" attingendo ai nuovi dati. Con ciò non dovrebbe essere necessario lo scroll della Lista.
Oppure mi son perso qualcosa per strada.
Ciao,
Mario
Buon anno a tutti e scusate l'intromissione.
ciao Mario
la routine AggiornaLBConti() - allegata al primo messaggio - avrebbe appunto l'obiettivo di aggiornare le sole colonne dei saldi, evitando quindi tutto quanto a quel punto superfluo.
normalmente - che io sappia - NON è necessario svuotare e ricaricare un ListBox per apportarne le modifiche, bensì è sufficiente agire sulle colonne che appunto si vogliono 'rinfrescare'.
sarà che scrivo codice da quarant'anni - e allora evitare inutili ripetizioni era un must anche perchè le risorse erano quelle che erano
- ma mi sembra del tutto inutile rialimentare tutto quando le variazioni sono circoscritte
Ciao
Non ho assolutamente messo in dubbio la validità del tuo codice.
Intendevo solo quello che allego. Se selezioni un nome nella lista e cambi gruppo nella TextBox in basso e poi clicchi sul pulsante il gioco è fatto.
E' vero, si può fare in maniera più "professionale" ma ... funziona.
Ciao,
Mario
Allegati:
You must be logged in to view attached files.Ciao
ciao Mario
il "mio" codice è lì proprio per essere messo in dubbio
ti ringrazio per l'esempio ma non è proprio quello che intendevo
ps. tra l'altro nel tuo codice devi modificare l'inizializzazione di lRiga perchè così com'è NON lavora correttamente sugli ultimi due elementi della lista
Ciao ElleEsse, potresti allegare un file di esempio con dati fittizi in modo da capire meglio ?
Ciao ElleEsse, potresti allegare un file di esempio con dati fittizi in modo da capire meglio ?
ciao Patel
innanzitutto.. grazie per l'interessamento
il file di esempio con dati fittizi.. beh.. magari poi ci provo.. ma sto comunque parlando di una sorta di applicativo con migliaia di righe di codice

eventualmente provo a vedere se riesco a enucleare la parte che presenta il problema, ma richiederebbe tempo (e fatica
) probabilmente smisurati rispetto al beneficio - mera curiosità - di risolvere l'enigmatra l'altro io sono nuovo di questo forum e ignoro quali siano i vincoli dimensionali in termini di upload
i limiti di upload possono essere superati postando un link invece che direttamente il file, ma decidi tu se ne vale la pena, prima prova a fare il refresh con
ListBox1.ListIndex=ListBox1.ListIndex
prova ad aggiungere alla fine del codice della routine"CaricaLBConti" la chiamata alle routine"AggiornaLBConti""LBConti_Click", come nel codice che ti posto
Private Sub CaricaLBConti() '0 - eventuale ">" per evidenziare livello di raggruppamento (20 pti) '1 - riga di CONTI in cui è reperito il conto (0 pti) '2 - identificativo di conto (0 pti) '3 - descrizione (170 pti) '4 - saldo quantità (quando significativa) (60 pti) '5 - unità di misura (quando significativa) (39 pti) '6 - saldo controvalore (quando significativo) (76 pti) '7 - divisa controvalore (quando significativo) (28 pti) '8 - saldo importo (76 pti) Dim riCto As Integer Dim brkRgp As String Dim indLBConti As Integer 'INIZIO MODIFICA 2020 01 03 hdCtrLBConti = 0 'FINE MODIFICA brkRgp = "" riCto = riPrimoConto indLBConti = -1 With LBConti .Clear Do Until Sheets(shCto).Cells(riCto, 2) = "" If Sheets(shCto).Cells(riCto, 4) <> brkRgp Then brkRgp = Sheets(shCto).Cells(riCto, 4) indLBConti = indLBConti + 1 .AddItem .List(indLBConti, 0) = ">" .List(indLBConti, 1) = 0 .List(indLBConti, 2) = 0 .List(indLBConti, 3) = brkRgp End If indLBConti = indLBConti + 1 .AddItem .List(indLBConti, 0) = "" .List(indLBConti, 1) = riCto .List(indLBConti, 2) = Sheets(shCto).Cells(riCto, 1) .List(indLBConti, 3) = Sheets(shCto).Cells(riCto, 2) If Sheets(shCto).Cells(riCto, 7) <> Sheets(shCto).Cells(riCto, 8) And _ Sheets(shCto).Cells(riCto, 7) <> divRif Then 'quantità significativa .List(indLBConti, 4) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 13), "#,###,##0+;#,###,##0-", 10) .List(indLBConti, 5) = Sheets(shCto).Cells(riCto, 7) End If If Sheets(shCto).Cells(riCto, 8) <> divRif Then 'controvalore significativo .List(indLBConti, 6) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 14), "#,###,##0.00+;#,###,##0.00-", 13) .List(indLBConti, 7) = Sheets(shCto).Cells(riCto, 8) End If .List(indLBConti, 8) = StrQtaCtvImp(Sheets(shCto).Cells(riCto, 15), "#,###,##0.00+;#,###,##0.00-", 13) If Sheets(shCto).Cells(riCto, 1) = pbCtoScadenzeId Then hdLBCtoScadenzeInd = indLBConti riCto = riCto + 1 Loop End With AggiornaLBConti LBConti_Click End SubQual è 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 a tutti
è da stamane alle 8:00 che litigo col forum
messaggi inviati che poii scompaiono se aggiornati.. messaggi inviati che non vengono caricati.. boh
ora provo a mettere qui di seguito quanto inerente alla tematica - e che appunto da stamane cerco di postare come risposta a petel
allora.. ho provveduto a sfrondare convenientemente il mio 'applicativo' lasciando esclusivamente la parte utile a mostrare il problema - sicuramente ci sarà ancora del codice ora superfluo, ma ho visto che non inficia in alcun modo l'operatività
la procedura viene attivata premendo il pusante 'GIOCO' cui corrisponde l'esecuzione di una macro che si preoccupa di attivare l'applicazione richiamando la routine Lancia()
la routine Lancia() - nella sua attuale versione sisntetica - non fa altro che ordinare i conti secondo il criterio più consono alla successiva operatività e attivare l'unico user form rimasto - UFCtb
l'inizializzazione dello user form UFCtb consiste semplicemente nel caricamento del list box LBConti tramite la routine CaricaLBConti() che banalmente recupera da data base le informazioni da mostrare e alimenta il list box
ora la procedura è stata modificata in modo che alla selezione di un Conto dall'elenco corrisponda semplicemente un incremento pari a 10 del suo saldo... in realtà la selezione di un Conto comportava poi una serie di attività che potevano poi impattare i saldi di più conti e quindi solo al termine di quelle attività veniva richiamata la routine di aggiornamento del list box..
alla selezione di un Conto corrisponde quindi l'incremento del suo saldo sul data base, quindi il richiamo della routine AggiornaLBConti() utile ad aggiornare sul list box i saldi di tutti i conti - riallineandoli a quelli sul data base - e a segnare con uno stesso carattere particolare ad ogni ciclo di aggiornamento (la sequenza è * # ° @ ^ § ed è ripetuta ogni sei cicli di aggiornamento in modo da avere eventuale immediata evidenza visiva delle anomalie) ciascun elemento del list box che riferisce un conto, così da avere evidenza di eventuali mancati refresh a video
volendo chiarire con un esempio: mi sono spostato con 2 scroll sulla terza pagina del list box, ho selezionato il conto 0038 e immediatamente lo stesso è stato incrementato e tutti i conti visualizzati marcati dall' * caratteristico della prima esecuzione di AggiornaLBConti
se però salgo verso l'alto ritrovo una parte di elementi mancanti di quella segnatura (il carattere *)

facendo un paio di scroll verso il basso e poi riportandosi su quei conti, anch'essi risultano caratterizzati dalla segnatura
boh .. l'unica cosa che riesco a ipotizzare è che possa dipendere dalle dimensioni del list box e/o dalla porzione di elementi visualizzati (quindi dal rapporto tra cardinalità del list box ed elementi visualizzati sulla singola videata) quasi come se VB considerasse rinfrescato un numero di elementi superiore a quelli visualizzati senza effettivamente averlo fatto.. ma siamo nel campo delle ipotesi fantascientifiche
non vedo l'ora che mi diciate dove sbaglio
come sempre.. grazie a tutti per l'attenzione
ps. ribadisco che la segnatura ha in qualche modo risolto il problema funzionale: l'utilizzatore scorrendo la lista si accorge del mancato refresh e lo forza con un paio di scroll garantendosi la certezza di visualizzare il dato corretto e rinfrescato, però son proprio curioso di sapere come e perchè si verifichi una tale anomalia
vedo che finalmente dovrei essere riuscito a rispondere alla richiesta di patel...
qui allego il file
grazie ancora
ps. vedo che nel posto sopra ho scritto petel invece di patel .. mi scuso per il refuso .. ma quel messaggio non mi azzardo più a toccarlo
Allegati:
You must be logged in to view attached files.se apporti la modifica come ti ho consigliato nel post 22300, la listbox si carica con gli asterischi.
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 )AggiornaLBConti
ciao Albatros
naturalmente non cambia nulla (se non per il fatto di eseguire inutilmente due routine)
comunque ora dovrei essere riuscito ad inviare il file sfrondato utile a giochicchiare e ad avere evidenza dell'anomalia..
qualche post sopra c'è anche la descrizione dettagliata di come utilizzarlo - per chi volesse cimentarsi, prendendo atto dell'anomalia e magari trovasse la soluzione più opportuna
buona Epifania a tutti
se apporti la modifica come ti ho consigliato nel post 22300, la listbox si carica con gli asterischi.
è ovvio che si carica con gli asterischi.. li mette AggiornaLBConti al primo ciclo
non vorrei essere polemico.. ma.. hai letto quello che ho scritto sopra?
vedi questo video
https://www.dropbox.com/h?preview=Cattura+03.wmv
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 )non vorrei essere polemico.. ma.. hai letto quello che ho scritto sopra?
Ho letto. Si vede che non ho capito oppure non sei stata/to abbastanza chiara nell'esporre il tuo problema.
Buon Epifania
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 )Ho letto. Si vede che non ho capito oppure non sei stata/to abbastanza chiara nell'esporre il tuo problema.
certamente non sono stato abbastanza chiaro
se posso esserlo di più .. questa è la spiegazione che avevo allegato prima .. dimmi nel contesto dove non sono stato abbastanza chiaro in modo che io possa approfondire in maniera circostanziata
la procedura viene attivata premendo il pusante 'GIOCO' cui corrisponde l'esecuzione di una macro che si preoccupa di attivare l'applicazione richiamando la routine Lancia()
la routine Lancia() - nella sua attuale versione sisntetica - non fa altro che ordinare i conti secondo il criterio più consono alla successiva operatività e attivare l'unico user form rimasto - UFCtb
l'inizializzazione dello user form UFCtb consiste semplicemente nel caricamento del list box LBConti tramite la routine CaricaLBConti() che banalmente recupera da data base le informazioni da mostrare e alimenta il list box
ora la procedura è stata modificata in modo che alla selezione di un Conto dall'elenco corrisponda semplicemente un incremento pari a 10 del suo saldo... in realtà la selezione di un Conto comportava poi una serie di attività che potevano poi impattare i saldi di più conti e quindi solo al termine di quelle attività veniva richiamata la routine di aggiornamento del list box..
alla selezione di un Conto corrisponde quindi l'incremento del suo saldo sul data base, quindi il richiamo della routine AggiornaLBConti() utile ad aggiornare sul list box i saldi di tutti i conti - riallineandoli a quelli sul data base - e a segnare con uno stesso carattere particolare ad ogni ciclo di aggiornamento (la sequenza è * # ° @ ^ § ed è ripetuta ogni sei cicli di aggiornamento in modo da avere eventuale immediata evidenza visiva delle anomalie) ciascun elemento del list box che riferisce un conto, così da avere evidenza di eventuali mancati refresh a video
link nuovo
https://www.dropbox.com/s/q7r3nymdtod7q1v/Cattura%2003.wmv?dl=0
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 )link nuovo
boh.. sono duro di comprendonio e non capisco cosa vuoi farmi vedere
o forse non è ben chiaro qual'è il problema
la routine AggiornaLBConti - richiamata ogni qualvolta che si seleziona un conto sul listbox dopo aver effettuato il suo incremento sul data base - oltre a recuperare il saldo di ciascun conto aggiunge alla sinistra dei conti un carattere - lo stesso per tutti i conti ogni volta che viene richiamata.. la prima volta *, la seconda volta #, la terza volta °, la quarta volta @, la quinta volta ^, la sesta volta §.. poi la settima volta riparte da *
ci si aspetterebbe che ad ogni selezione di un elemento, tutti i conti sulla lista siano caratterizzati dallo stesso carattere - in quanto aggiornati dalla stessa esecuzione di AggiornaLBConti() - mentre invece scorrendo la lista si evidenziano differenze
differenze che continuando a scrollare - quindi senza più alcuna interazione col codice - scompaiono
prova a fare pedestremente quanto esposto prima come esempio
-
AutoreArticoli

