Condividi:        

Evento change con problema

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Evento change con problema

Postdi RaeleaR » 11/03/15 06:13

Salve a tutti,
riscontro un problema in un evento change per il quale non riesco a trovare la ragione e quindi la soluzione.. mi date una mano?

Trovate un estratto del mio lavoro qui:
http://www.filedropper.com/provachange

Spiego:
..sempre nel mio programmino di gestione di Posti di Libri, ho la necessitá di sapere da quanti Fornitori (Proveedores) nel tempo, ho comprato lo stesso libro ed a che prezzo.
Gli elementi a disposizione sono:
un foglio di riepilogo dei Libri(DB_LIBROS),
un foglio riepilogo Fornitori(DB_PROV)
ed un foglio di riepilogo dei movimenti(DB_MOV) in cui, in forma abbreviata, riporto il progressivo del libro (es:LI0003), il progr. fornitore(es:PR002), il prezzo unitario(es:PU28), data di acquisto ecc..

Ora, in una Userform (che nel file di esempio si avvia dal foglio(Hoja4)), c'é un cboBox da cui ricavo il nome del libro di cui voglio verificare il fornitore o i fornitori se piú d'uno, un txtBox per il rif.progress.Libro ed una lstBox in cui appaiono i dati di ricerca.

All'inizio ho separato l'evento Change del cboBox, in cui solo verifico quanto scritto nel cboBox con i dati dei libri, dall'evento Exit dello stesso cboBox in cui effettuo la ricerca dei dati e la visualizzazione nel lstBox. E tutto funziona a dovere.

Poi ho pensato che é meglio accorpare le due cose nell'evento Change perché cosí, una volta con il cursore nel cboBox, basta scorrere con la freccia in su o in giú i nomi dei libri ed ottenere 'al volo' le info senza dover premere il tab per l'Exit.
Gli unici due libri per cui ci sono dati di acquisto nel foglio riepilogo movimenti sono il Quattro(LI0004) ed il Sei(LI0006). Per entrambi si é fatto un acquisto da due fornitori diversi. Qui peró mi succede una cosa strana.. nello scorrere con la freccia in giú l'elenco dei libri dal cboBox quando arrivo al Quattro non mi appare nulla nel lstBox e quando arrivo al Sei mi appare solo un valore.

Se lanciate la UserForm e fate questa oparazione vi potete rendere meglio conto di come stanno le cose..
Se in corrispondenza dei due libri si effettua, invece, l'exit dal cboBox con il Tab, tutto funziona.

Cos'é che mi sfugge nel codice?
Grazie a tutti in anticipo
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Sponsor
 

Re: Evento change con problema

Postdi Anthony47 » 11/03/15 15:00

Ho cercato di seguire cosa fa il codice per arrivare al capire la logica complessiva da realizzare; dopo 20 minui ho concluso "mamma mia" e ho desistito.
Comunque non vedo l' annidamento delle ricerche sui vari fogli, per cui non capisco proprio come potresti fare piu' ricerche nello stesso ciclo di Change. In questa situazione non sono nemmeno in grado di capire se l' istruzione For Each rngDbm In .Range("E200:E" & rgadbm) e' un errore di battitura (mia opinione prevalente) o un trucco per velocizzare le ricerche.
Quindi ti chiederei di descrivere che cosa vorresti fare navigando nelle varie tabelle, e poi vedremo.

Per il futuro ti raccomanderei di usare vere tabelle, che in XL2010 sono indirizzabili in modo esplicito; guarda l' help on line alla voce (italiana) "Guida introduttiva: creare una tabella di Excel"

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19220
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Evento change con problema

Postdi ricky53 » 11/03/15 15:13

Ciao,
dopo aver letto l'intervento di Anthony (anche lui ha notato l'anomalia o ... comunque condivido tutto quello che lui ha scritto, aggiungo che dovresti migliorare la gestione della definizione delle variabili e ... ma passiamo avanti e cerchiamo di essere risolutivi)

Cambia in "cboTit_Change" il "200" con "6"
Codice: Seleziona tutto
For Each rngDbm In .Range("E200:E" & rgadbm)


Inoltre devi, ad inizio ciclo, cancellare i valori contenuti in "lstComp" con
Codice: Seleziona tutto
            For lc = 1 To Me.lstComp.ListCount - 1
                For c = 0 To 3
                    Me.lstComp.List(lc, c) = ""
                Next c
            Next lc

e togliere la cancellazione che fai dopo nell'ELSE.


E' chiaro che ho provato quanto ti ho scritto.
Però non ti ci abituare al fatto che mi sono spulciato il codice; avresti dovuto darci qualche indicazione su dove andare a cercare e ... per questa volta passi !!!

Ecco SOLO la parte di codice che ho modificato in "Sub cboTit_Change"
Cancella il tuo e sostituiscilo con questo.
Attenzione a cosa cancelli !!!
Il codice che ho riportato NON è tutto il codice della "Sub cboTit_Change"
Codice: Seleziona tutto
With shDbm
 '.................................................. Aggiunte
    For lc = 1 To Me.lstComp.ListCount - 1
        For c = 0 To 3
            Me.lstComp.List(lc, c) = ""
        Next c
    Next lc
 '.................................................. Aggiunte
 '   For Each rngDbm In .Range("E200:E" & rgadbm)
    For Each rngDbm In .Range("E6:E" & rgadbm) ' <<===== Modificata
        If rngDbm <> "" Then
            If Mid(rngDbm, Len(rngDbm) - 5) = txtRefTit Then
                i = i + 1
                For Each rngPro In shPro.Range("B8:B" & rgapro)
                    If rngPro = Mid(rngDbm.Offset(0, 4), 1, 5) Then
                        Me.lstComp.AddItem
                        Me.lstComp.List(i, 0) = Mid(rngDbm.Offset(0, 4), 1, 5)
                        Me.lstComp.List(i, 1) = rngPro.Offset(0, 1)
                        Me.lstComp.List(i, 2) = Mid(rngDbm.Offset(0, 4), Len(rngDbm.Offset(0, 4)) - 9)
                        Me.lstComp.List(i, 3) = Mid(rngDbm.Offset(0, 3), 3, 2)
                        Me.lstComp.TopIndex = 0
                        Exit For
                    End If
                Next rngPro
'.................................................. Tolte
'        Else
'            For lc = 1 To Me.lstComp.ListCount - 1
'                For c = 0 To 3
'                    Me.lstComp.List(lc, c) = ""
'                Next c
'            Next lc
'.................................................. Tolte

'            i = 0
            End If
        End If
    Next rngDbm
End With
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Evento change con problema

Postdi RaeleaR » 11/03/15 16:12

grazie ad entrambe per i suggerimenti..
c'era appunto quel 200 che era invece un 6..

@Anthony ..ma mi avevi detto che avevo fatto progressi!! (thread precedente) :) non oso immaginare quello che dicevi sui miei primissimi codici postati nel forum :)
Comunque grazie, mi serve come sprone per cercare di far meglio..
Per dar maggior chiarezza a quello che voglio fare in questo UserForm, come giustamente mi chiedevi:
Il Foglio DB_LIBROS mi seve solo per caricare il cboBox da cui appunto seleziono il libro di cui voglio recuperare i dati di acquisto: fornitore, data e prezzo.
Il Foglio DB_PROV contiene i dati dei fornitori e faccio riferimento ad esso solo per farmi restituire il nome del fornitore dal solo riferimento che trovo nella cella che sto analizzando
Il Foglio DB_MOV é quello doc¿ve effettuo la ricerca
Voglio verificare da quanti fornitori effettuo l'acquisto dello stesso libro per poter comparare i prezzi e regolarmi al prossimo acquisto.
Andró comunque a studiarmi le tabelle come dici perché non le conosco affatto.

@Ricky ..grazie per l'aiuto..
é giusto! la cancellazione dei dati eventualmente trovati doveva essere fatta all'inizio e non alla fine. Vado a studiare il tuo codice e a provarlo. Alla prossima posteró un esempio con il codice commentato a dovere.. avete ragione entrambe :)

Ricky mi dici qualcosa sulla inizializzazione delle variabili? che cosa faccio male?
A presto
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Re: Evento change con problema

Postdi ricky53 » 11/03/15 16:34

Ciao,
è buona norma definire nel "formato" che ci occorre tutte le variabili.

Per esempio in
Codice: Seleziona tutto
Dim rgadbm, rgapro, i, lc, c

Dim rngPro, rngDbm As Range


Come pensi che siano state effettivamente definite le variabili che hai referenziato tu nelle Dim?

L'unica che ha un valore corrispondente a quello che poi nel codice utilizzi è la "rngDbm" le altre all'atto della definizione sono "Variant", quando le utilizzi cambiano formato e divento quello che l'istruzione fa fare: Integer, Range, Date, String, altro


Prova ad eseguire con "F8" la seguente macro
Codice: Seleziona tutto
Sub Avvia()
    Dim rgadbm, rgapro, i, lc, c
    Dim rngPro, rngDbm As Range
   
    rgadbm = "CIAO"
    rgadbm = Now

' Qui che ti aspetti????
    rngDbm = "Adesso cosa succederà"

' Questa è corretta!
' Cancella la precedente e togli l'apice davanti al Set
'    Set rngDbm = Range("A2:B100")
End Sub
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Evento change con problema

Postdi RaeleaR » 11/03/15 17:18

Grazie Ricky
Avevo letto appunto, nella guida, che tutte nascono come Variant e che poi a seconda del contesto prendono il valore corretto.. ma pensavo che fosse un modo per risparmiare scrittura di codice..
Ora non capisco bene il tuo esempio..
Ho aperto un nuovo Libro ed ho creato un modulo in cui ho inserito il tuo codice scorrendolo poi con F8 per vedere cosa mi restituiscono le variabili.
Passando su rgadbm = "CIAO" (e ovviamente facendo passare alla riga successiva con F8) mi dice che la variabile rgadbm é ="CIAO";
poi seguendo nuovamente con F8 la stessa variabile cambia di valore per diventare una data.. NOW.. appunto..
Se non ho capito male questo lo hai scritto per evidenziarmi come la stessa variabile assuma due valori diversi a seconda del contesto in cui si trova.. giusto?
non capisco peró il perché della riga: rngDbm = "Adesso cosa succederà"
in effetti mi aspetto un errore (come infatti accade) in quanto rngDbm é dichiarato come Range e quindi non puó contenere un testo.. qualcosa mi sfugge?, illuminami :)
mentre invece facendo la modifica che indichi sotto l'errore scompare perché stiamo trattando rngDbm come Range..
Sicuro ho capito che si dovrebbe scrivere ad esempio:
Dim rgadbm, rgapro, i, lc, c As Integer
corretto?
Vedo peró in alcuni post nel forum che qualcuno scrive
Dim rgadbm As Integer, rgapro As Integer, i As Integer ecc... ma va bene anche come ho scritto prima giusto?
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Re: Evento change con problema

Postdi ricky53 » 11/03/15 17:24

Ciao,
ogni variabile va definita in base a ciò che conterrà quando verrà impostata nel codice.

Vado a memoria in base al tuo codice ed al nome delle variabili (molto importante utilizzare variabili con un nome che identifichi che cosa rappresentano e cosa conterranno).

Dim rgadbm As Integer (ERRATA, deve essere Range), rgapro As Integer (ERRATA, deve essere Range), i As Integer (Corretta perchè conterrà numeri interi)
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Evento change con problema

Postdi RaeleaR » 11/03/15 17:31

chiarissimo Ricky e grazie ancora
a presto
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina


Torna a Applicazioni Office Windows


Topic correlati a "Evento change con problema":

problema blocco note
Autore: carlin
Forum: Software Windows
Risposte: 7

Chi c’è in linea

Visitano il forum: Nessuno e 26 ospiti