Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 30 totali)
  • Autore
    Articoli
  • #20431 Score: 0 | Risposta

    Giulio
    Partecipante

      Ciao a tutti,

       vi scrivo per un problema che trovo abbastanza singolare. Dovevo fare riempire una textbox da una formula matematica, ma inspiegabilmente non riuscivo in alcun modo. Alla fine, ho capito che il problema nasceva quando la formula restituiva un numero decimale (non intero).

      Quindi, analizzando in profondità la questione, ho notato una cosa stranissima: quando compilo a mano una textbox, l'unico modo per inserire decimali è usare la virgola (il punto non viene proprio accettato), ma se poi lo stesso numero lo stampo tramite una label, il separatore decimale che compare è il punto.

      Com'è possibile che nella stessa interfaccia due controlli gestiscano il separatore decimale in due modi diversi? Come fare in modo che una textbox "accetti" una formula che restituisce un numero decimale?

      Grazie a tutti in anticipo!

      #20434 Score: 0 | Risposta

      patel
      Moderatore
        51 pts

        puoi allegare un file di esempio ? una textbox può contenere solo testo quindi accetta tutti i caratteri, se vuoi inserirci un numero decimale o no lo devi prima trasformare in testo

        #20451 Score: 0 | Risposta

        Giulio
        Partecipante

          E' una cosa tipo questa:

          Option Explicit

          Private Sub UserForm_Initialize()
          Dim i As Integer
          For i = 1 To 5
          ComboBox1.AddItem i
          Next
          End Sub

          Private Sub CommandButton1_Click()
          Dim lung As Double
          Dim B(1) As Double
          Dim n As Integer

          B(0) = TextBox1
          B(1) = TextBox2
          If ComboBox1.ListIndex > -1 Then
          n = ComboBox1
          lung = B(0) + B(1) * n
          TextBox3.Value = lung / 2
          Else: MsgBox "Inserire n corretto"
          End If
          End Sub

          Il problema è che questa funziona, l'originale invece che è praticamente la stessa cosa ma con molti più campi gestiti in diversi form, inspiegabilmente quando il risultato è decimale, non scrive niente sulla textBox.

          Comunque a onor di cronaca, il motivo per cui non potevo digitare il separatore nella textbox è perchè dimenticavo di aver apposta inserito una funzione che permette di scrivere dentro solo numeri. Ma questo è ininfluente perchè essendoci una divisione il risultato da scrivere sulla textbox finale può essere decimale anche partendo da interi.

          #20456 Score: 0 | Risposta

          Giulio
          Partecipante

            Scusate mi rendo conto che non sia un processo molto "ordinato" di risolvere un problema, ma sto provando a capire se c'è qualcosa che mi sfugge nella gestione dei decimali. Come mai se digito msgbox Application.decimalSeparator mi esce il "." mentre il risultato del codice scritto sopra, sulla textbox3, quando è decimale mi esce con la virgola?

            #20458 Score: 0 | Risposta

            patel
            Moderatore
              51 pts

              dimensioni B(1) As Double e poi scrivi B(0) = TextBox1 quindi un double = string, tanto vale non scrivere alcun dimensionamento, magari ti va meglio

              #20460 Score: 0 | Risposta

              Giulio
              Partecipante

                Ritieni ci sia un modo più intelligente di acquisire da tastiera un numero per svolgere delle operazioni matematiche?

                #20462 Score: 0 | Risposta

                Marius44
                Moderatore
                  58 pts

                  Ciao

                  Mi spieghi cosa vuoi dire col post precedente, per favore?

                  Patel (che saluto)  ti ha fatto notare che è inutile dichiarare come Double un dato che, inserito in una TextBox, diventa comunque uno String.

                  Prova a dare uno sguardo qui https://support.office.com/it-it/article/cambiare-il-carattere-usato-per-separare-le-migliaia-o-i-decimali-c093b545-71cb-4903-b205-aebb9837bd1e

                  Ovviamente se ho capito il problema.

                  Ciao,

                  Mario

                  #20465 Score: 0 | Risposta

                  Giulio
                  Partecipante

                    Ciao Marius,

                    Quale post intendi? Se intendi l'ultimo, a fronte del commento di Patel sul fatto che è effettivamente inutile passare una textbox in un double, chiedevo se per applicazioni di carattere matematico, come acquisire numeri ed effettuare operazioni, ci fossero controlli o modalità di acquisizione adatti apposta a maneggiare numeri, invece che textbox che trattano stringhe. Questo perchè in un caso come il mio, in cui ho numerosi operazioni matematiche tra una serie di dati acquisiti da textbox in diversi form, mi è comodo gestire variabili che siano numeriche. 

                    In merito al tuo link, devo distribuire un applicativo che funzioni su tutti i pc quindi purtroppo non mi sarebbe sufficiente cambiare le impostazioni del mio Excel sul separatore. Vorrei quindi capire bene come funziona questo discorso, considerando che:

                    - Scrivendo numeri dentro VBA, i decimali vanno gestiti con il punto;

                    - Scrivendo qualcosa tipo Application.decimalSeparator mi restituisce quello che presumo sia il separatore impostato in Excel (che potrei cambiare nel tuo link) - e nel mio caso è ancora il punto;

                    -Se scrivo qualcosa tipo textbox1.value = 165.5 viene visualizzato 165,5 nella textbox (quindi presumo la textbox consideri la virgola come separatore decimale, a prescindere di come sia impostato Office. Ma questa è una legge universale?)  

                    Tutto ciò lo chiedo perchè probabilmente il mio problema sta proprio in ciò che avete detto voi, ovvero nel passaggio da numeri a textbox (stringhe) e quindi ancora a numeri, che a volte evidentemente fa quello che gli pare.

                    Grazie a entrambi per l'aiuto!

                    #20474 Score: 0 | Risposta

                    patel
                    Moderatore
                      51 pts

                      Giulio ha scritto:

                      Quale post intendi? Se intendi l'ultimo, a fronte del commento di Patel sul fatto che è effettivamente inutile passare una textbox in un double,

                      non è inutile, è sbagliato e può dare problemi, non puoi scrivere textbox1.value = 165.5, ma textbox1.value = "165.5", una textbox può contenere solo testo, è questo che non vuoi capire, il fatto che non ti dia errore non significa che sia corretto quello che fai.

                      #20475 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        272 pts

                        patel ha scritto:

                        una textbox può contenere solo testo

                        E' così e infatti se chiedi a Excel di mostrare il VarType del contenuto di una Textbox, ti restituisce 8 (cioè String). Poter assegnare tranquillamente a una Textbox un valore non stringa (potrebbe anche essere booleano) è la conseguenza della conversione implicita che fa Excel al suo interno.

                        Del resto se passi a una Textbox il valore 165.5, lo vedi trasformato in 165,5 (con la virgola): significa che Excel riconosce che hai passato un valore numerico ma la Textbox lo riconverte in stringa.

                        Per rispondere a Giulio sulla presenza di moduli o librerie matematiche specifiche , in VBA no (è tutto builtin, incorporato) quindi bisogna smanettare con i diversi tipi di dato disponibili, lottando sia con i formati di conversione che con le impostazioni internazionali della macchina specifica (problemi particolari con le date).

                        Non ho letto il thread ma magari se ho un attimo lo faccio, così forse posso essere più preciso e più utile 🙂

                        #20476 Score: 0 | Risposta

                        vecchio frac
                        Senior Moderator
                          272 pts

                          Ho riprodotto lo scenario di Giulio (un form con una combo, tre textbox e un pulsante) e come ha già detto lui non ci sono problemi (la textbox3 riproduce il risultato della divisione correttamente, con la virgola). Preciso che compare la virgola come separatore decimale perchè ciò dipende dalle impostazioni internazionali della macchina in uso, mentre VBA internamente utilizza altre impostazioni (tipicamente, americane) se non diversamente specificato: per esempio su questa mia versione  Application.DecimalSeparator restituisce una virgola.

                          In effetti il punto è del tutot ignorato, quando inserito a mano nella Textbox e questo provoca errori esilaranti (ehm). Per esempio, 1.1 diventa 11. Puoi immaginarti le conseguenze 🙂 Ecco perchè ti sei scritto la funzione che inibisce i caratteri non numerici (ma io avrei lasciato la virgola tra i caratteri ammessi).

                          Una prova: nel codice del commandbutton basta mettere

                          Debug.Print B(0), B(1)

                          e inserire 1.1 e 1,2 nelle textbox1 e textbox2 per verificare cosa succede.

                          La soluzione che ti propongo, che taglierebbe la testa al toro, è operare una sostituzione del testo (tolgo il punto e metto il separatore decimale default):

                              B(0) = Replace(TextBox1, ".", Application.DecimalSeparator)
                              B(1) = Replace(TextBox2, ".", Application.DecimalSeparator)
                          
                          #20479 Score: 0 | Risposta

                          Giulio
                          Partecipante

                            Grazie ragazzi, credo di aver inquadrato il punto, giustamente come dite voi la textbox riconosce solo testo, quindi è per questo che non ragiona con il separatore decimale di Application. Da qui deduco che una textbox per fare una conversione implicita del tipo di dato coi decimali che sia corretta, deve ricevere in input un numero con la virgola come separatore, altrimenti la ignora come ha detto vecchio frac (anche io avevo fatto un pò di test ieri), e tutto questo a prescindere dall'impostazione della propria macchina. Insomma, deduco che se voglio che l'utente inserisca un numero decimale da tastiera, e la textbox lo riconosca correttamente, esso deve inserire il numero con la virgola, e questo è universale, vale su qualsiasi  macchina del mondo. Poi, se passo questo numero altrove, allora lì la virgola sarà convertita nel separatore decimale della macchina dell'utente. Se questa supposizione è giusta, teoricamente non sarebbe necessario nemmeno sfruttare il replace. Siete d'accordo su questo ragionamento?

                            Patel, capisco bene cosa intendi, però io devo fare in modo che il codice acquisisca da tastiera dei numeri, questo è un dato di fatto purtroppo, e poi faccia delle operazioni e rimetta il relativo risultato in altre textbox, in quanto questi saranno poi valori di default che devono però poter essere modificati dall'utente se lo desidera. Nel caso del codice che ho postato sopra per esempio, come faresti a scrivere correttamente la riga seguente?

                            TextBox3.Value = lung / 2

                            Grazie ancora

                            #20480 Score: 0 | Risposta

                            vecchio frac
                            Senior Moderator
                              272 pts

                              Giulio ha scritto:

                              teoricamente non sarebbe necessario nemmeno sfruttare il replace

                              Sì basta assegnare il valore a una variabile del tipo giusto (almeno Single).

                              Giulio ha scritto:

                              come faresti a scrivere correttamente la riga seguente?

                              TextBox3.Value = lung / 2

                              Hai chiesto a patel ma provo a dire la mia:

                              Non ha importanza, tanto quello che finisce nella Textbox è sempre di tipo stringa (il suo Value è sempre VarType = vbString = 8). E' l'operazione contraria che è delicata, cioè recuperarne il valore e considerarlo nel modo corretto:

                              Dim i As Single
                              i = CSng(Textbox3.Value)
                              #20481 Score: 0 | Risposta

                              Giulio
                              Partecipante

                                Grazie mille come sempre vecchio Frac, quello che dici mi sembra logico.  Sei comunque d'accordo che la regola di permettere all'utente di scrivere solo virgola e numeri nelle textbox (per i decimali), dovrebbe funzionare su qualsiasi computer?

                                Nel mio codice comunque, quello che voglio far funzionare non va come deve.

                                Addirittura, ho scritto nell'evento activate di un form questo blocco:

                                Private sub UserForm_Activate()

                                Dim passo as double

                                passo=lung/(userForm2.comboBox1 + 1)

                                debug.print passo

                                textBox1.value=passo

                                end sub

                                 

                                Se passo esce decimale, il debug.print mi scrive - ad esempio -  403.6, ma la textBox1 esce vuota! Com'è possibile? 

                                Se passo esce intero, il debug.print scrive - ad esempio - 403, e la textBox1 visualizza correttamente 403

                                Se passo esce decimale, ma riscrivo la penultima riga come textBox1.value= round(passo), allora la textbox restituisce correttamente il valore.

                                Se il problema fosse il riconoscimento del tipo giusto dalla textbox (da risolvere con Csng o CDbl), non dovrebbe funzionare in nessun caso, giusto? Secondo te quale può essere il problema?

                                PS lung è dichiarata double e risulta da un calcolo che sfrutta i valori provenienti da altre Textbox, un pò come nel mio esempio

                                #20482 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  272 pts

                                  Giulio ha scritto:

                                  Sei comunque d'accordo che la regola di permettere all'utente di scrivere solo virgola e numeri nelle textbox (per i decimali), dovrebbe funzionare su qualsiasi computer?

                                  A far bene dovresti permettere anche l'uso del punto (io uso spesso il tastierino numerico, dove accanto allo zero c'è il punto come separatore decimale). Ecco perchè prima nominavo di fare un Replace: per mostrare visivamente nella Textbox una virgola (bisogna smazzarsi a intercettare ogni tasto premuto ma non è difficile l'implementazione).

                                  Per risolvere le altre tue osservazioni, che son interessanti, avrei bisogno dello scenario corretto, altrimenti si possono fare solo delle ipotesi. Che al momento non ho... infatti mi sembra strano che addirittura "la textBox1 esce vuota! "

                                   

                                  #20483 Score: 0 | Risposta

                                  Giulio
                                  Partecipante

                                    Si capisco bene cosa intendi e hai sicuramente ragione, ma ritengo che comunque se l'unico carattere permesso oltre il numero sia la virgola, l'utente possa arrivarci da solo di usare quello come separatore, e considerando che comunque il decimale nel mio caso è l'eccezione... l'utente si farà andar bene la virgola   , l'importante è che funzioni tutto senza possibilità di errore

                                    Capisco bene di non avervi messo nelle condizioni ideali per risolvere il problema, ma il codice complessivo oltre a contenere dati sensibili dei miei clienti, è molto lungo e complesso; per cui ho estratto solo le parti interessanti ai fini del post che ho postato sopra. Anche a me sembra stranissimo che non compaia nulla nella textbox, ma ti dirò di più: coi decimali nel blocco 

                                    passo=lung/(userForm2.comboBox1 + 1)

                                    debug.print passo

                                    textBox1.value=passo

                                    debug.print textBox1.value

                                    il primo debug.print dà appunto 403.6, il secondo dà ""   

                                    Ma chiedo un consiglio a tal proposito, voi suggerite per avere la correttezza formale, che ogni volta che passo una variabile numerica da textBox, di usare:

                                    Dim a as double

                                    a=Cdbl(textBox.value)

                                    O un altro modo per passare numeri? Tenete presente che, nel mio caso, avrò almeno una 50ina di textbox che devono acquisire numeri da utilizzare per le varie operazioni...E tra l'altro devo gestire anche controlli su quei numeri, tipo che siano maggiori di 0, che non si mettano ovviamente più virgole del dovuto, tipo 422,,,5 ecc...

                                     

                                    #20490 Score: 0 | Risposta

                                    vecchio frac
                                    Senior Moderator
                                      272 pts

                                      Giulio ha scritto:

                                      l'utente si farà andar bene la virgola

                                      Però potresti intercettare la digitazione e trasformare al volo il carattere premuto in un carattere ammesso (punto diventa virgola). Qualche tempo fa abbiamo discusso e sistemato questa cosa per un altro utente.

                                      Giulio ha scritto:

                                      il codice complessivo oltre a contenere dati sensibili dei miei clienti

                                      Non fa niente, ma spero per te che tu non abbia davvero inserito nel codice dei dati sensibili (direttamente nel codice!)

                                      Giulio ha scritto:

                                      il primo debug.print dà appunto 403.6, il secondo dà "" 

                                      Questa cosa mi fa impazzire 🙂

                                      Giulio ha scritto:

                                      Ma chiedo un consiglio a tal proposito

                                      E' sufficiente dimensionare una variabile per convertire un valore stringa passato ad essa nel tipo corrispondente:

                                      Dim a as double
                                      'non serve forzare con CDbl, perchè
                                      'il valore String che proviene dal 
                                      'textbox diventa di tipo Double
                                      a = textBox.value

                                      Giulio ha scritto:

                                      avrò almeno una 50ina di textbox che devono acquisire numeri da utilizzare per le varie operazioni

                                      Ti conviene imparare il concetto di array di controlli.

                                       

                                      #20494 Score: 0 | Risposta

                                      Giulio
                                      Partecipante

                                        vecchio frac ha scritto:

                                        Però potresti intercettare la digitazione e trasformare al volo il carattere premuto in un carattere ammesso (punto diventa virgola). Qualche tempo fa abbiamo discusso e sistemato questa cosa per un altro utente.

                                        E' una possibilità, non la vedo nemmeno una cosa complicata che posso inserire nella funzione del controllo dei caratteri che ho già. Tu pensi sia più opportuno gestire il solo separatore con il punto in generale, o intendi proprio di permetterli entrambi come inserimento e poi trasformare il punto in virgola? Nel secondo caso ho paura si possa creare confusione col separatore delle migliaia

                                        vecchio frac ha scritto:
                                        Non fa niente, ma spero per te che tu non abbia davvero inserito nel codice dei dati sensibili (direttamente nel codice!)

                                        Non proprio, diciamo che però l'interfaccia è creata ad hoc sull'uso del cliente e quindi con dati anche personali (ma ogni cliente avrà un'interfaccia dedicata)

                                        vecchio frac ha scritto:

                                        Questa cosa mi fa impazzire

                                        Figurati a me    Anche perchè il codice che ho messo sopra funziona...Comunque penso che arrotonderò semplicemente all'intero, così funziona...Anche se è un compromesso che onestamente mi fa schifo

                                        vecchio frac ha scritto:

                                        E' sufficiente dimensionare una variabile per convertire un valore stringa passato ad essa nel tipo corrispondente:
                                        E' la strada che sto seguendo in effetti, però questo tipo di assegnazione (e anche l'inversa) è stato criticato aspramente da Patel e Marius a inizio post     

                                        vecchio frac ha scritto:

                                        Ti conviene imparare il concetto di array di controlli.
                                        Molto interessante, questa è effettivamente una cosa che non conosco. Sapresti consigliarmi un link o fonte da studiare in merito?

                                        #20511 Score: 0 | Risposta

                                        vecchio frac
                                        Senior Moderator
                                          272 pts

                                          Io non vedo come scenario reale l'utente che inserisce il separatore delle migliaia. Il punto è "decimale" proprio perchè servirebbe solo per introdurre le cifre decimali. Comunque è solo un problema di rappresentazione.

                                          Riguardo i dati sensibili, avevo ben capito che l'interfaccia contiene loghi e informazioni riservate, ma tu parlavi di dati inseriti nel codice e mi pareva strano 🙂

                                          Perchè l'assegnazione a una variabile ti è stata criticata? rileggerò con attenzione i primi post, ma penso ci sia stato un fraintendimento.

                                          Di risultati sugli array di controlli ne trovi molti. Ti allego per studio un piccolo progetto. Non te lo spiego, guardalo e vediamo se ti frulla qualche domanda 🙂

                                          Avvia il form e scrivi qualcosa nelle textbox: testo, numeri, numeri con virgola. Poi guarda il codice. Ci rivediamo qui 😉

                                          Allegati:
                                          You must be logged in to view attached files.
                                          #20516 Score: 0 | Risposta

                                          Marius44
                                          Moderatore
                                            58 pts

                                            Ero intervenuto su quanto scritto da patel

                                            patel ha scritto:

                                            dimensioni B(1) As Double e poi scrivi B(0) = TextBox1 quindi un double = string, tanto vale non scrivere alcun dimensionamento, magari ti va meglio

                                            Ribadisco ( e penso che anche Patel sarà d'accordo) che non si criticava l'assegnazione di un valore ad una variabile bensì si riteneva inutile dimensionare (dichiarare) una variabile come Double quando poi le si assegna uno String.

                                            Il mio consiglio (da anziano quale sono): metti sempre in testa al Modulo dove scrivi il codice "Option Explicit"; ti eviterà tanti mal di testa.

                                            Ciao,

                                            Mario

                                             

                                            #20526 Score: 0 | Risposta

                                            patel
                                            Moderatore
                                              51 pts

                                              Esatto Marius, io sono tra quelli che di solito non dimensiona le variabili, ma talvolta è necessario e bisogna farlo con cognizione, comunque meglio non dimensionare che dimensionare a sproposito

                                              #20611 Score: 0 | Risposta

                                              Giulio
                                              Partecipante

                                                Grazie ragazzi, però il punto, al di là dell'aspetto formale sull'assegnazione di variabili di tipo diverso, per me è come gestire nella pratica questo tipo di applicazione, ovvero acquisire da textbox dei numeri che devono essere poi assegnati a variabili visto che bisogna fare varie operazioni matematiche, controlli sui valori, ecc ecc. Queste variabili, in pratica, voi le dichiarereste senza tipo? Non fareste come ha suggerito vecchio frac nel post che riporto sotto (e che è un pò il sistema che ho sempre seguito personalmente)?

                                                vecchio frac ha scritto:

                                                E' sufficiente dimensionare una variabile per convertire un valore stringa passato ad essa nel tipo corrispondente:

                                                Dim a as double'non serve forzare con CDbl, perchè'il valore String che proviene dal 'textbox diventa di tipo Doublea = textBox.value
                                                Ci tengo a chiarire che questo per me non è un "creare polemica", ma è un confronto che trovo molto utile per capire se al di là degli aspetti formali che sono chiari a tutti, nella pratica ci possano essere punti di vista e modalità di approccio ai problemi differenti, e magari più efficienti, di quello che sono abituato a seguire.

                                                Vecchio frac, ti ringrazio infinitamente per il codice e il suggerimento sugli array dei controlli. Ammetto che ho dovuto studiarmelo perchè per molti aspetti è qualcosa di nuovo per me. Cavolo pensare che nel mio codice ho decine e decine di eventi change e afterupdate dei controlli tutti uguali tra loro    ...Mi sa che riscriverò tutti i controlli su combo e textbox con questo approccio perchè vado a risparmiare un sacco di righe di codice   

                                                Ti chiedo solo delucidazioni sul workflow del codice che mi hai mandato: hai creato la classe di textbox che gestisce l'evento del controllo dei caratteri da tastiera, per ogni textbox hai istanziato la variabile mTextBoxes di una nuova istanza della classe che hai creato con la textbox stessa e tutte queste istanze le hai aggiunte alla collection. Ora, se ho capito bene, avendo una collezione di oggetti che hanno la variabile interna che gestisce gli eventi assegnata a ciascuna textbox, il programma intercetta per tutti i textbox la digitazione da tastiera e la gestisce con il relativo evento nella classe. Ho quindi due domande per capire meglio come funziona il tutto: visto che il cuore del codice mi sembra che sia la riga Set TxtEvent.mTextboxes = oCtrl, la collezione a cosa serve in realtà? E' solo una comodità, ma sarebbe stato possibile anche gestirlo, ad esempio, come un array di textBoxClass(), oppure creando una serie indicizzata di variabili txtEvent1, txtEvent2, ...? E soprattutto, perchè poi set txtEvent=nothing?

                                                #20612 Score: 0 | Risposta

                                                Giulio
                                                Partecipante

                                                  Grazie ragazzi, però il punto, al di là dell'aspetto formale sull'assegnazione di variabili di tipo diverso, per me è come gestire nella pratica questo tipo di applicazione, ovvero acquisire da textbox dei numeri che devono essere poi assegnati a variabili visto che bisogna fare varie operazioni matematiche, controlli sui valori, ecc ecc. Queste variabili, in pratica, voi le dichiarereste senza tipo? Non fareste come ha suggerito vecchio frac nel post che riporto sotto (e che è un pò il sistema che ho sempre seguito personalmente)?

                                                  vecchio frac ha scritto:

                                                  E' sufficiente dimensionare una variabile per convertire un valore stringa passato ad essa nel tipo corrispondente:

                                                  Dim a as double'non serve forzare con CDbl, perchè'il valore String che proviene dal 'textbox diventa di tipo Double a = textBox.value

                                                  Ci tengo a chiarire che questo per me non è un "creare polemica", ma è un confronto che trovo molto utile per capire se al di là degli aspetti formali che sono chiari a tutti, nella pratica ci possano essere punti di vista e modalità di approccio ai problemi differenti, e magari più efficienti, di quello che sono abituato a seguire.

                                                  Mario grazie, Option explicit non può mai mancare anche se a volte quasi non mi ricordo nemmeno perchè lo metto tanto è automatico   

                                                  Vecchio frac, ti ringrazio infinitamente per il codice e il suggerimento sugli array dei controlli. Ammetto che ho dovuto studiarmelo perchè per molti aspetti è qualcosa di nuovo per me. Cavolo pensare che nel mio codice ho decine e decine di eventi change e afterupdate dei controlli tutti uguali tra loro    ...Mi sa che riscriverò tutti i controlli su combo e textbox con questo approccio perchè vado a risparmiare un sacco di righe di codice   

                                                  Ti chiedo solo delucidazioni sul workflow del codice che mi hai mandato: hai creato la classe di textbox che gestisce l'evento del controllo dei caratteri da tastiera, per ogni textbox hai istanziato la variabile mTextBoxes di una nuova istanza della classe che hai creato con la textbox stessa e tutte queste istanze le hai aggiunte alla collection. Ora, se ho capito bene, avendo una collezione di oggetti che hanno la variabile interna che gestisce gli eventi assegnata a ciascuna textbox, il programma intercetta per tutti i textbox la digitazione da tastiera e la gestisce con il relativo evento nella classe. Ho quindi due domande per capire meglio come funziona il tutto: visto che il cuore del codice mi sembra che sia la riga Set TxtEvent.mTextboxes = oCtrl, la collezione a cosa serve in realtà? E' solo una comodità, ma sarebbe stato possibile anche gestirlo, ad esempio, come un array di textBoxClass(), oppure creando una serie indicizzata di variabili txtEvent1, txtEvent2, ...? E soprattutto, perchè poi set txtEvent=nothing?

                                                  #20617 Score: 0 | Risposta

                                                  Giulio
                                                  Partecipante

                                                    PS io una piccola modifica che farei al tuo codice è cambiare la riga mTextboxes = Format(mTextboxes, "#,##0.00") in:  mTextboxes = iif(mTextBoxes.value-int(mTextBoxes.value)>o,Format(mTextboxes, "#,##0.00"),Format(mTextboxes, "#,##0") ) per fare in modo da eliminare i decimali nella formattazione se non ci sono (gusto estetico puramente soggettivo), e la sposterei in un evento afterUpdate in modo che funzioni anche semplicemente se l'utente clicca fuori dalla textbox e non solo con enter o tab.

                                                    Io, per onore della cronaca, avevo gestito questa cosa in un altro modo (che peraltro trovo meno elegante del tuo):

                                                    Private Sub txtBox_Change()
                                                    Static txtTemp As String
                                                    txtTemp = blockLetter(txtBox, txtTemp)
                                                    End Sub

                                                    Function blockLetter(ByRef cnt As MSForms.control, temp) As String
                                                    If cnt Like "*[!0-9,]*"  or cnt like "*,*,*"  or cnt like "*,[0-9][0-9]" Then 'Permesso un solo decimale
                                                    cnt = temp
                                                    blockLetter = temp
                                                    Exit Function
                                                    End If
                                                    blockLetter = cnt

                                                    End Function

                                                    Ovviamente per permettere anche l'uso del punto inserirei semplicemente all'inizio un replace del punto con la virgola.

                                                    #20676 Score: 0 | Risposta

                                                    vecchio frac
                                                    Senior Moderator
                                                      272 pts

                                                      Giulio ha scritto:

                                                      riscriverò tutti i controlli su combo e textbox con questo approccio

                                                      Bisogna vedere se il gioco vale la candela. Per relativamente pochi controlli non serve (diciamo che se sono una decina o più allora sì). Tieni conto che non tutti gli eventi si possono intercettare con questo sistema.

                                                      Giulio ha scritto:

                                                      Ho quindi due domande per capire meglio come funziona il tutto: visto che il cuore del codice mi sembra che sia la riga Set TxtEvent.mTextboxes = oCtrl, la collezione a cosa serve in realtà? E' solo una comodità, ma sarebbe stato possibile anche gestirlo, ad esempio, come un array di textBoxClass(), oppure creando una serie indicizzata di variabili txtEvent1, txtEvent2, ...? E soprattutto, perchè poi set txtEvent=nothing?

                                                      La collezione serve a simulare l'array di controlli. In VB6 era possibile indicizzare i controlli: textbox(0), textbox(1), textbox(2) eccetera mentre in VBA non è consentito. La collection permette una rudimentale indicizzazione, tenendo insieme una serie di oggetti tutti uguali. Non è una comodità, è la tecnica utilizzata in questo contesto 🙂 proprio perchè non puoi avere (in VBA) un array di textboxclass() che riceva gli eventi di ogni oggetto textbox... impostare a nothing ogni controllo ti permette di ripulire la relativa area di memoria per l'assegnazione successiva.

                                                      Giulio ha scritto:

                                                      una piccola modifica che farei al tuo codice è cambiare

                                                      Certo, sei libero di sperimentare 🙂

                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 30 totali)
                                                    Rispondi a: Separatore decimale VBA
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: