Operazioni fra textbox



  • Operazioni fra textbox
    di Pio (utente non iscritto) data: 07/09/2015 10:24:05

    Buongiorno a tutti.
    Chiedo aiuto per una semplice operazione matematica fra textbox. Ho tre textbox, la terza deve essere la differenza delle cifre inserite nelle prime due. Il mio codice fa quel che deve, ma il problema nasce quando nella seconda casella cancello la cifra per modificarla e mi dà errore. Dove sbaglio? Grazie.



  • di alfrimpa data: 07/09/2015 11:04:21

    Ciao Pio

    Ho modificato la tua seconda macro come vedi sotto.

    A me pare che funzioni bene (fai anche tu delle prove ma eventualmente l'aggiustiamo).

    Ti ho riallegato il file.

    Alfredo 
     
    Private Sub Alle1_Change()
    Dim N1
    Dim N11
    Dim H11
    
     N1 = (Alle1.Text)
     N11 = (Dalle1.Text)
      
    'se il valore della textbox1 viene cancellato o è =0 assegna automaticamente il valore zero
     If Dalle1 = "" Or Alle1 = "" Then
        Dalle1.Text = "0" And Alle1 = "0"
        h1.Value = 0
     Else
      h1.Text = Format(CDbl(N1) - CDbl(N11), "#,##0.00")
      H11 = (h1.Text)
     End If
     
    
    End Sub
    






  • di Pio (utente non iscritto) data: 07/09/2015 11:12:38

    Ciao Alfredo, grazie della risposta.
    Ho notato però che quando cancello la seconda textbox, la prima va a zero e la devo ridigitare.
    Inoltre, mi dà lo stesso debug anche quando cancello la prima textbox...



  • di alfrimpa data: 07/09/2015 11:39:45

    Questo lo avevo notato anch'io.

    L'avevo detto che la cosa era da rivedere.

    Alfredo





  • di alfrimpa data: 07/09/2015 11:44:36

    Riprova con questa.

    Ame non va in debug quando cancello la prima casella.

    Alfredo
     
    Private Sub Alle1_Change()
    Dim N1
    Dim N11
    Dim H11
    
     N1 = (Alle1.Text)
     N11 = (Dalle1.Text)
      
    'se il valore della textbox1 viene cancellato o è =0 assegna automaticamente il valore zero
     If Dalle1 = "" Or Alle1 = "" Then
        h1.Value = 0
     Else
      h1.Text = Format(CDbl(N1) - CDbl(N11), "#,##0.00")
      H11 = (h1.Text)
     End If
     
    
    End Sub
    






  • di Marius44 data: 07/09/2015 12:00:59

    Salve a tutti
    Ho allegato il file di alfrimpa (che saluto) in cui ho inserito un'altra UserForm (clicccare su Pulsante 2 del Foglio, inserire i dati e, nella Label - perchè una TextBox se non dobbiamo inserire nulla? - mostra il risultato).

    Fammi sapere. Ciao,
    Mario



  • di totygno71 data: 07/09/2015 12:08:22

    Inserendo una lettera (per sbaglio ovviamente ^_^) mi va in debug...



  • di totygno71 data: 07/09/2015 13:21:37

    @Mario
    Inserendo una lettera (per sbaglio ovviamente ^_^) mi va in debug...



  • di Marius44 data: 07/09/2015 14:44:56

    @totygno
    Hai ragione. Prova a sostituire (completamente) quanto c'è nel Modulo UserForm2 con quanto sotto.
    Ciao,
    Mario
     
    Option Explicit
    Public imp1 As String, imp2 As String
    
    Private Sub TextBox1_Change()
        imp1 = TextBox1.Text
        If imp1 = "" Or imp1 = "0" Then imp1 = "0"
        If Asc(imp1) < 48 Or Asc(imp1) > 65 Then
            MsgBox "Il dato inserito non è numerico", 0 + 16, "Errore"
            TextBox1.Text = ""
            Exit Sub
        End If
        imp2 = TextBox2.Text
        If imp2 = "" Or imp2 = "0" Then imp2 = "0"
        Label1.Caption = " = " & CDbl(imp1) - CDbl(imp2)
    End Sub
    
    Private Sub TextBox2_Change()
        imp2 = TextBox2.Text
        If imp2 = "" Or imp2 = "0" Then imp2 = "0"
        If Asc(imp2) < 48 Or Asc(imp2) > 65 Then
            MsgBox "Il dato inserito non è numerico", 0 + 16, "Errore"
            TextBox2.Text = ""
            Exit Sub
        End If
        imp1 = TextBox1.Text
        If imp1 = "" Or imp1 = "0" Then imp1 = "0"
        Label1.Caption = " = " & CDbl(imp1) - CDbl(imp2)
    End Sub
    



  • di Pio (utente non iscritto) data: 07/09/2015 15:23:27

    @Mario
    a me non funziona il codice ASC()<48, ho risolto con questo codice:
     
    Private Sub textbox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
      If IsNumeric(textbox1) = False Then                
      MsgBox "Il dato inserito non è numerico"          
      Cancel = True                                               
      textbox1.SelStart = 0                                     
      textbox1.SelLength = Len(txtSaldo)                 
      End If
    End Sub



  • di Marius44 data: 07/09/2015 15:32:45

    Ciao Pio.
    Va bene anche nell'evento exit della TextBox. Va bene altresì la funzione IsNumeric.
    Non capisco, però, cosa vuol dire "a me non funziona il codice Asc()<48". I numeri 48 e 65 corrispondono alle cifre 0 e 9; pertanto tutto ciò che è inserito al di fuori di quel range non viene accettato.
    Ciao,
    Mario



  • di Pio (utente non iscritto) data: 07/09/2015 16:28:36

    @Mario, probabilmente avevo sbagliato qualcosa perché ora funziona..
    Se però volessi copiare 3 volte le stesse textbox e sommare il risultato delle tre operazioni in un'altra, in questo caso conviene usare textbox per i risultati parziali, vero?



  • di Pio (utente non iscritto) data: 07/09/2015 17:03:48

    Il problema che riscontro, nella somma di più textbox è che, una volta compilate tutte il risultato immediato della somma è giusto, ma se ne modifico una o più di una, il risultato viene sbagliato... c'è soluzione x cortesia?



  • di Marius44 data: 07/09/2015 18:32:12

    Ciao Pio
    Facciamo il punto. Se tu metti il codice nell'evento Exit una volta che sei uscito dall'oggetto non puoi ... scatenare l'evento. Io ho usato l'evento Change e, come avrai notato, in entrambe le TextBox c'è il ricalcolo. Pertanto qualsiasi cambiamento in una delle due (oppure 3 o 4, ecc.) scatena il ricalcolo nella Label (ribadisco, non una TextBox, perché mi serve per mostrare il risultato).
    In maniera più professionale si potrebbe mettere il controllo del codice ASC in una Function alla quale fare riferimento da tutte le TextBox (ma per due o tre oggetti ho preferito lasciar perdere).



  • di perché (utente non iscritto) data: 07/09/2015 23:04:19

    [quote]I numeri 48 e 65 corrispondono alle cifre 0 e 9;[/quote]

    Veramente il 65 corrisponde alla A (maiuscola) ...



  • di Marius44 data: 07/09/2015 23:38:25

    Ciao Pio
    come ha notato un amico (che ringrazio) nelle mie macro vi è un errore. Ti prego di scusarmi per la distrazione e procedi alla sostituzione come sotto indicato.

    Ciao,
    Mario
     
    sostituisci quasta riga
    If Asc(imp1) < 48 Or Asc(imp1) > 65 Then
    
    con questa
    If Asc(imp1) < 48 Or Asc(imp1) > 57 Then



  • di Pio (utente non iscritto) data: 08/09/2015 11:49:34

    Grazie @Mario...provvedo a correggere...
    Allego il file dove ho provato ad incrementare il tuo codice per ottenere ciò che mi serve...tre sottrazioni ed una somma totale...pensavo fosse semplice ma trovo una serie di ostacoli....puoi aiutarmi a costruire questa semplice "calcolatrice".. Grazie..



  • di Pio (utente non iscritto) data: 08/09/2015 14:49:50

    Ci sono riuscito da me, grazie cmq!