Risultati da 1 a 10 di 10

Discussione: array di controlli - Stesso codice per più controlli



  1. #1
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    1954
    Versione Office
    office pro 2010
    Likes ricevuti
    403
    Likes dati
    219

    array di controlli - Stesso codice per più controlli

    In questo topic -> Inserire una virgola quando si usa il punto, su più textbox si affrontano due problemi:

    Come implementare la gestione del testo digitato (Quando si digita il carattere punto esso deve diventare una virgola)
    Come evitare di riscrivere lo stesso codice, più volte, una per ogni controllo sul quale si vuole che tale implementazione agisca.

    Vorrei, in questo intervento, intervenire riguardo al secondo punto, lasciando al topic originale, il compito di proseguire con il più semplice primo problema.


    Il listato proposto è stato reperito dalla rete ed ho incontrato varie sue spiegazioni:
    Mauro Gamberini - UserForm Array di controlli
    Thetruster's Box - Array di controlli in VBA di Excel
    Programmarsi una vita - di Trigon - Studio sugli array di controlli in VBA Excel

    La fonte reale non l' ho propriamente cercata e sarebbe interessante se qualcuno conoscesse qualche libro che ne parla per poter leggere le varie terminologie utilizate.

    Io, prendendo come modello quello di trigon, mi sono fatto quest' idea:


    Partirei direttamente con il materiale occorrente ed il listato modificato per questo thread ma che attinge pienamente dalla terza fonte che ho lincato.


    • 1 foglio excel con attivazione macro
    • 1 userform
    • 2 o piuù controlli TextBox posizionati sul Form



    • la subrutine da condividere su tutti i controlli

    Codice: 
    
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        'Se il tasto premuto NON è una cifra ALLORA fai come se non avessi premuto nessun tasto
        If Not IsNumeric(Chr(KeyAscii)) Then
            KeyAscii = 0
        End If
    End Sub
    • 1 modulo di classe




    nel modulo di classe andremo a definire:
    • Un metodo pubblico del tipo UserForm
    • Un metodo pubblico sensibile agli eventi del tipo dei controlli per i quali vogliamo unificare delle istruzioni
    • ed infine la o le Subroutine da accomunare (nel nostro caso l' evento _KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) ) telle TextBox


    Nel modulo di classe
    un membro dello stesso del tipo userform
    un membro del tipo del controllo sul quale si vuole agire (in questo caso una TextBox) dichiarato in modo che possa reagire agli eventi
    listato del modulo di classe
    Codice: 
    Option Explicit
    
    
    Option Explicit
    
    
    Public Form As UserForm
    Public WithEvents Text As TextBox
    
    
    Private Sub Text_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        'Se il tasto premuto NON è una cifra ALLORA fai come se non avessi premuto nessun tasto
        If Not IsNumeric(Chr(KeyAscii)) Then
            KeyAscii = 0
        End If
    End Sub
    Nell oggetto UserForm a dichiarare due variabili globali visibili solo al form:
    una variabile del tipo che abbiamo appena definito con la nostra classe (nel nostro caso MiaTextBox)
    Ed una variabile oggetto Collection che conterrà gli oggetti di tal enuova classe che andremo a creare; uno per ogni oggetto TextBox realmente esistente sul form

    Quindi in cima al listato del form:

    Codice: 
    Private CollezioneDeiMieiControlli As Collection
    Private miaTextBox As clsMiaTextBox
    Ed infine, nell evento Private Sub UserForm_Initialize()
    andremo a memorizzare una variabile del nostro nuovo tipo nella collezzione. Una per ogni controllo reale del form.

    ecco il listato:
    Codice: 
    Private Sub UserForm_Initialize()
        Set CollezioneDeiMieiControlli = New Collection
        Dim Controllo As Control
        
        For Each Controllo In Me.Controls
            If TypeOf Controllo Is MSForms.TextBox Then
                Set miaTextBox = New clsMiaTextBox
                With miaTextBox
                    Set .Form = Me
                    Set .Text = Controllo
                End With
                CollezioneDeiMieiControlli.Add miaTextBox
            End If
        Next
    End Sub
    ... In allegato anche un file di prova per testare che in tutte le TextBox presenti nel form non è possibile digitare altro che delle cifre.



    Il motore di tutto questo sta nel fatto che le variabili in gioco son delle variabili che memorizzano un riferimento all' oggetto e non l' oggetto stesso.

    Cosa succede quindi?

    Noi abbiamo un controllo sul form che ha un nome:
    TextBox1

    Questo nome è una variabile che non contiene il reale oggetto TextBox. Questa variabile contiene solo il riferimento, il puntamento all' oggetto reale.
    E' un bigliettino con scritto sopra : " la tua textBox, quando ne hai bisogno, è memorizzata la. sul terzo scaffale della memoria"

    Se noi prendiamo un altra variabile oggetto e la poniamo uguale alla nostra textbox, in quella variabile, non verrà memorizato un NUOVO oggetto fatto come la nostra textBox ma verrà memorizzato un riferimento alla stessa TextBox.
    Quando io scrivo:
    a = 5
    b = a
    Ho praticamente definito due variabili distinte che contengono qualcosa di uguale
    Se io modifico a, ponendolo a 6, per esempio, la variabile b conterrà comunque il proprio 5

    Quando, invece, ho a che ffare con gli oggetti:

    Set A = range("A1")
    Set B = A

    Se cambio il valore della cella A1, lo cambio anche alla variabile A ed alla variabile B
    Se lo cambio in una delle due variabili, cambierà anche quello che trovo scritto nella cella A1
    Perchè in A ed in B, non ci sono due oggetti distinti uguali alla cella("A1") ma ci sono i riferimenti che puntano PROPRIO alla cella("A1"), o meglio, alla locazione di memoria in cui il computer ha memorizzato la cella ("A1")
    Detto questo quindi, cosa succede?

    Noi abbiamo una serie di controlli sul form
    Per ogni controllo sul form, creiamo un nuovo oggetto da noi definito, dentro il quale memorizziamo il riferimento a quel controllo
    e questo nostro nuovo oggetto lo teniamo in vita per tutta la durata del form in una nostra collection
    Codice: 
    Option Explicit
    
    
    Private CollezioneDeiMieiControlli As Collection
    Private miaTextBox As clsMiaTextBox
    
    
    
    
    Private Sub UserForm_Initialize()
        Set CollezioneDeiMieiControlli = New Collection
        Dim Controllo As Control
        
        For Each Controllo In Me.Controls
            If TypeOf Controllo Is MSForms.TextBox Then
                Set miaTextBox = New clsMiaTextBox
               With miaTextBox
                   Set .Form = Me
                   Set .Text = Controllo
               End With
                CollezioneDeiMieiControlli.Add miaTextBox
            End If
        Next
    End Sub

    Di fatto abbiamo il programma con in memoria una collezione di oggetti che tengono in memoria i riferimenti ai nostri reali controlli sul form

    Quando generiamo un evento, per esempio, pigiando un tasto sulla tastiera mentre digitiamo in un controllo, esso fa generare un evento.
    Questo evento viene rilevato da tutte le variabili oggetto che fanno riferimento a quel dato controllo e, se nell' ambito di validità di queste variabili esiste anche la procedura legata all' evento, Bene, questa viene eseguita.

    Difatti, quando noi pigiamo un pulsante nelal textbox,
    esso genera l' evento KeiPress
    Il quale si propaga al Form e viene eseguito un eventuale Private Sub Text_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) se presente nel Form.
    Successivamente, visto che esiste un riferimento al controllo anche in un altro oggetto e quel riferimento è sensibile agli eventi, allora viene eseguito anche un eventuale procedura relativa all' evento se questa è presente

    ...

    Questo semplice trucchetto fa si che si possano creare di bellissimi cortocircuiti logici... occhio a quel che si combina

    Possa essere questo l' incipit di una discussione che porti a chiarire un sacco di cose perchè, mi rendo conto, non sono stato certamente chiaro e, non credo di aver apportato nessun valore aggiunto a quello che gi asi reperisce in rete.

    Quindi, vi prego, dite la vostra :)
    File Allegati File Allegati

  2. I seguenti utenti hanno dato un "Like"


  3. #2

    L'avatar di alfrimpa
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Napoli
    Età
    64
    Messaggi
    5558
    Versione Office
    2013
    Likes ricevuti
    586
    Likes dati
    115

    Re: array di controlli - Stesso codice per più controlli

    Ciao Marco

    In attesa di studiarmi per bene la tua "lezione" ti faccio preliminarmente i miei complimenti.
    Alfredo

    "Non esistono cose facili o difficili; esistono cose che si sanno e cose che non si sanno"

    "Solo due cose sono infinite: l'universo e la stupidità umana; riguardo l'universo ho ancora dei dubbi" (Albert Einstein)

  4. I seguenti utenti hanno dato un "Like"


  5. #3
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    1954
    Versione Office
    office pro 2010
    Likes ricevuti
    403
    Likes dati
    219

    Re: array di controlli - Stesso codice per più controlli

    grazie Alfredo :)
    ma più che capirla direi che devi tradurla perchè mi mangio sempre un sacco di parole e faccio mille errori. colpa la fretta ed altre mille buone motivazioni linguistiche.

    prenditi il listato nudo e crudo e seguine passo passo il flusso con f8 e vedrai che tutto ti si spiegherà in un lampo

  6. #4

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    983
    Versione Office
    .
    Likes ricevuti
    329
    Likes dati
    0

    Re: array di controlli - Stesso codice per più controlli

    Ciao Draco,

    ottimo lavoro (un piccolo "bignami").


    ed infine la o le Subroutine da accomunare (nel nostro caso l' evento _KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) ) delle TextBox
    Vorrei solo evidenziare che non tutti gli eventi gestibili nell'oggetto "nativo" sono presenti nella classe creata. Nel caso in esempio potrete notare che non sono gestibili gli eventi _Enter, _Exit, AfterUpdate .....
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  7. #5
    L'avatar di Marius44
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    73
    Messaggi
    2785
    Versione Office
    Excel2010
    Likes ricevuti
    555
    Likes dati
    131

    Re: array di controlli - Stesso codice per più controlli

    Ciao Marco
    (ma perchè la maggior parte di quelli che conoscono Excel-VBA meglio di me si chiamano Marco? Per me rimane un mistero).
    Leggo solo oggi perchè son stato fuori (e senza internet - che relax)

    COMPLIMENTI

    Veramente un ottimo lavoro.
    Ciao,
    Mario

  8. I seguenti utenti hanno dato un "Like"


  9. #6

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    983
    Versione Office
    .
    Likes ricevuti
    329
    Likes dati
    0

    Re: array di controlli - Stesso codice per più controlli

    Citazione Originariamente Scritto da Marius44 Visualizza Messaggio
    (ma perchè la maggior parte di quelli che conoscono Excel-VBA meglio di me si chiamano Marco? Per me rimane un mistero).
    Elementare Watson: è l'anagramma di M A C R O
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  10. I seguenti 3 utenti hanno dato un "Like" a scossa per questo post:


  11. #7
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    1954
    Versione Office
    office pro 2010
    Likes ricevuti
    403
    Likes dati
    219

    Re: array di controlli - Stesso codice per più controlli

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    ...tutti gli eventi gestibili nell'oggetto "nativo" sono presenti nella classe creata. Nel caso in esempio potrete notare che non sono gestibili gli eventi _Enter, _Exit, AfterUpdate .....
    Non me ne ero nemmeno accorto Scossa. Ho notato che anche la rete latita di spiegazioni. Ho trovato una discussione fatta su vecchio Archi, MasterExcel e qualcosa in inglese che tocc ail problema ma non il perchè di questa cosa.
    Sarei curioso di capire il perchè...

    ... Tornando invece al listato proposto mi sono reso conto di una cosa:

    MEmorizzare il form non serve a niente.
    BAsta l' oggetto di cui sono interessato e nulla più. Cioè. a me pare che il programma funzioni comunque e, soprattutto, m irendo conto che nel ragionamento fatto in topic, il Form non salti mai fuori. Ergo: Non serve ad un tubo.

    Correggimi se sbaglio ma, soprattutto, dimmi che hai un qualche luogo dove io possa andare a leggere perché _Enter, _Exit e _AfterUpdate, sono stati limitati all' uso sul userform

  12. #8

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    983
    Versione Office
    .
    Likes ricevuti
    329
    Likes dati
    0

    Re: array di controlli - Stesso codice per più controlli

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    dimmi che hai un qualche luogo dove io possa andare a leggere perché _Enter, _Exit e _AfterUpdate, sono stati limitati all' uso sul userform
    No, non ho mai approfondito.

    Secondo me la motivazione è di prevenzione di possibili problemi: praticamente sono gestiti i soli eventi che non comportino la perdita del focus, escludendo invece quegli eventi la cui conclusione porti alla perdita del focus dell'oggetto.
    Mi è sembrata una "deduzione" plausibile e me la sono fatta bastare :-)
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  13. #9
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    1954
    Versione Office
    office pro 2010
    Likes ricevuti
    403
    Likes dati
    219

    Re: array di controlli - Stesso codice per più controlli

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    ...e me la sono fatta bastare
    Me la faccio bastare anche io Scossa. Però sarà un altro motivo di discussione quando dovrò affermare che Visual Basic for Application è un colabrodo e si vede che viene dal vecchi VB6

  14. #10
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    1954
    Versione Office
    office pro 2010
    Likes ricevuti
    403
    Likes dati
    219

    Re: array di controlli - Stesso codice per più controlli

    mi rendo conto solo ora che non ho aggiunto una conclusione che ho raggiunto nei giorni successivi allo sviluppo di questo thread.

    in tutti gli esempi trovati in rete, viene sempre, oltre ai controlli che si voglion direttamente gestire, memorizzato anche il form.
    in realtà non è necessario e quindi superfluo.

Discussioni Simili

  1. Controlli aggiuntivi
    Di Baloon_50 nel forum Domande su Excel VBA e MACRO
    Risposte: 34
    Ultimo Messaggio: 27/03/17, 21:11
  2. Caselle di gruppo nei controlli modulo
    Di Francesca713 nel forum Domande su Excel in generale
    Risposte: 11
    Ultimo Messaggio: 10/03/17, 11:03
  3. [Risolto] Riempire array in un modulo e richiamare lo stesso array su un modulo diverso
    Di Domynix nel forum Domande su Excel VBA e MACRO
    Risposte: 8
    Ultimo Messaggio: 07/01/17, 18:36
  4. Controlli aggiuntivi
    Di Baloon_50 nel forum Problemi, suggerimenti e Novità del forum
    Risposte: 4
    Ultimo Messaggio: 10/12/16, 20:50
  5. Controlli aggiuntivi
    Di alfrimpa nel forum Domande su Excel VBA e MACRO
    Risposte: 3
    Ultimo Messaggio: 11/01/16, 11:56

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •