semplificare ciclo if



  • semplificare ciclo if
    di adriprivate data: 29/05/2013 17:20:13

    Ciaoooo!
    Prima di tutto grazie.. sto imparando un sacco di cosine utili..
    Problema:
    Il risultato c'è, ma suppongo che da 100 stringhe di codice se ne possano fare un terzo utilizzando nel giusto modo i cicli di vba (su cui faccio parecchia confusione), ed evitare di dichiarare altrettante variabili diverse!

    Ho 4 colonne di textbox:
    colonna 1 numero di colli DA Textpkg1...... AT extpkg10
    colonna 2 altezza DA TEXTH1....A TEXTH10
    colonna 3 lunghezza DA TEXTL1....A TEXTL10
    colonna 4 profondita DA TEXTP1....A TEXTP10

    HO DUE COLONNE DI LABEL:
    LA COLONNA 1 MI CALCOLA IL VOLUME (H*L*P)/5000 DA lblvol1 A lblvol10
    LA SECONDA PRIMA IDENTIFICA IL NUMERO MINORE IL MEDIO E IL MAGGIROE TRA H L e P E POI ESEGUE LA SEGUENTE FORULA ((minore + medio) * 2) + maggiore

    COME HO FATTO NEL PRIMO CASO (VEDI CODICE VBA) HO RIPETUTO PER 10 VOLTE LO STESSO CICLO IF DICHIARANDO MILLE VARIABILI... COME POSSO SEMPLIFICARE IL CODICE?!?


     
    Private Sub CMDVOLUME_Click()
    Dim valore1 As Double
    Dim valore2 As Double
    Dim valore3 As Double
    Dim valore4 As Double
    Dim valore5 As Double
    Dim valore6 As Double
    Dim valore7 As Double
    Dim valore8 As Double
    Dim valore9 As Double
    Dim valore10 As Double
    Dim valoretot As Double
    Dim LATO1 As Double
    Dim LATO2 As Double
    Dim LATO3 As Double
    Dim LBLFM1tot As Double
    Dim minore As Double, maggiore As Double, medio As Double
    
    
    ' calcolo il volume con la seguente operazione
    
    lblvol1 = Round(((Val(TEXTL1.Text) * Val(TEXTP1.Text) * Val(TEXTH1.Text)) / 5000) * Val(Textpkg1.Text), 2)
    lblvol2 = Round(((Val(TEXTL2.Text) * Val(TEXTP2.Text) * Val(TEXTH2.Text)) / 5000) * Val(Textpkg2.Text), 2)
    lblvol3 = Round(((Val(TEXTL3.Text) * Val(TEXTP3.Text) * Val(TEXTH3.Text)) / 5000) * Val(Textpkg3.Text), 2)
    lblvol4 = Round(((Val(TEXTL4.Text) * Val(TEXTP4.Text) * Val(TEXTH4.Text)) / 5000) * Val(Textpkg4.Text), 2)
    lblvol5 = Round(((Val(TEXTL5.Text) * Val(TEXTP5.Text) * Val(TEXTH5.Text)) / 5000) * Val(Textpkg5.Text), 2)
    lblvol6 = Round(((Val(TEXTL6.Text) * Val(TEXTP6.Text) * Val(TEXTH6.Text)) / 5000) * Val(Textpkg6.Text), 2)
    lblvol7 = Round(((Val(TEXTL7.Text) * Val(TEXTP7.Text) * Val(TEXTH7.Text)) / 5000) * Val(Textpkg7.Text), 2)
    lblvol8 = Round(((Val(TEXTL8.Text) * Val(TEXTP8.Text) * Val(TEXTH8.Text)) / 5000) * Val(Textpkg8.Text), 2)
    lblvol9 = Round(((Val(TEXTL9.Text) * Val(TEXTP9.Text) * Val(TEXTH9.Text)) / 5000) * Val(Textpkg9.Text), 2)
    lblvol10 = Round(((Val(TEXTL10.Text) * Val(TEXTP10.Text) * Val(TEXTH10.Text)) / 5000) * Val(Textpkg10.Text), 2)
        
    
    valore1 = CSng(Replace(lblvol1.Caption, ".", ","))
    valore2 = CSng(Replace(lblvol2.Caption, ".", ","))
    valore3 = CSng(Replace(lblvol3.Caption, ".", ","))
    valore4 = CSng(Replace(lblvol4.Caption, ".", ","))
    valore5 = CSng(Replace(lblvol5.Caption, ".", ","))
    valore6 = CSng(Replace(lblvol6.Caption, ".", ","))
    valore7 = CSng(Replace(lblvol7.Caption, ".", ","))
    valore8 = CSng(Replace(lblvol8.Caption, ".", ","))
    valore9 = CSng(Replace(lblvol9.Caption, ".", ","))
    valore10 = CSng(Replace(lblvol10.Caption, ".", ","))
    
    
    valoretot = Round(valore1 + valore2 + valore3 + valore4 + valore5 + valore6 + valore7 + valore8 + valore9 + valore10, 2)
    
    LBLVOLtot = valoretot
    valoretot = CSng(Replace(LBLVOLtot.Caption, ".", ","))
    
    ' inseriti 3 numeri in 3 textbox determino i valori dal piu grande al piu piccolo (o viceversa) e calcolo il volumetrico
    ' mi sono fermato qui per evitare di ripetere per 10 volte la stessa cosa dichiarando altre variabili
    
    LATO1 = Val(TEXTL1.Text)
    LATO2 = Val(TEXTP1.Text)
    LATO3 = Val(TEXTH1.Text)
     
     If LATO1 < LATO2 Then
        If LATO1 < LATO3 Then
            If LATO3 < LATO2 Then
            minore = LATO1
            maggiore = LATO2
            medio = LATO3
            LBLFM1.Caption = ((minore + medio) * 2) + maggiore
            End If
        Else
        minore = LATO3
        medio = LATO1
        maggiore = LATO2
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        End If
    Else
        If LATO2 < LATO3 Then
        minore = LATO2
        medio = LATO3
        maggiore = LATO1
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        Else
        medio = LATO2
        minore = LATO3
        maggiore = LATO1
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        End If
    LBLFM1.Caption = ((minore + medio) * 2) + maggiore
    End If
    End Sub
    



  • di mabolsie data: 29/05/2013 21:26:06

    ciao adri
    per semplificare la dichiarazione delle variabili puoi fare così.

    ciao max
     
    
    dim valore(1 to 10) as Double, valoretot as double, lato(1 to 3) as Double, minore as Double, maggiore as Double, medio as Double, LBLFM1tot As Double



  • di mabolsie data: 29/05/2013 21:37:21

    per le formule si può fare con un ciclo for next non avendo i dati non posso testarle provale tu.

    Ciao Max
     
      for i =1 to 10 
    lblvol(i) = Round(((Val(TEXTL(i).Text) * Val(TEXTP(i).Text) * Val(TEXTH(i).Text)) / 5000) * Val(Textpkg(i).Text), 2)
      next i
     
       for ii = 1 to 10
    valore(ii) = CSng(Replace(lblvol(ii).Caption, ".", ","))
      next ii
    


  • Sub, Function o Property non definita (errore 35)
    di adriprivate data: 30/05/2013 09:32:23

    Ciao e grazie..
    Ho provato ma mi genera questo errore:
    Sub, Function o Property non definita (errore 35)

    Praticamente dal primo form clicco sul "bottone volume" per aprire una seconda form dove tramite un altro bottone mi esegue il codice che mi hai dato.... perchè mi da questo errore: Sub, Function o Property non definita (errore 35) evidenziando Private Sub CMDVOLUME_Click()!



  • di mabolsie (utente non iscritto) data: 30/05/2013 12:45:14

    Il codice lo devi inserire nella tua su se no non funziona oppure prova a levare il Private dalla Sub.

    Ciao max
     
    Sub CMDVOLUME_Click()
    
    dim valore(1 to 10) as Double, valoretot as double, lato(1 to 3) as Double, minore as Double, maggiore as Double, medio as Double, LBLFM1tot As Double
    
     for i =1 to 10 
       lblvol(i) = Round(((Val(TEXTL(i).Text) * Val(TEXTP(i).Text) * Val(TEXTH(i).Text)) / 5000) *       Val(Textpkg(i).Text), 2)
      next i
     
       for ii = 1 to 10
          valore(ii) = CSng(Replace(lblvol(ii).Caption, ".", ","))
    
       next ii
    
    ecc..  ecc..  ecc
    



  • di adriprivate data: 30/05/2013 17:29:32

    Sorry, ma non capisco.. utilizzando il codice come era originariamente non da alcun errore, perchè dovrebbe darlo nel momento in cui utilizzo il ciclo for?!
    Non ho fatto altro che sostituire il nuovo al vecchio..
    Ho provato ad eliminare Private dalla Sub.. ma sigh.. niente..
     
    Private Sub CMDVOLUME_Click()
    Dim valore(1 To 10) As Double, valoretot As Double, lato(1 To 3) As Double, minore As Double, maggiore As Double, medio As Double, LBLFM1tot As Double
    Dim i As Integer
    Dim ii As Integer
    'calcolo il volume con la seguente operazione
    For i = 1 To 10
    lblvol(i) = Round(((Val(TEXTL(i).Text) * Val(TEXTP(i).Text) * Val(TEXTH(i).Text)) / 5000) * Val(Textpkg(i).Text), 2)
     Next i
    
    'lblvol1 = Round(((Val(TEXTL1.Text) * Val(TEXTP1.Text) * Val(TEXTH1.Text)) / 5000) * Val(Textpkg1.Text), 2)
    'lblvol2 = Round(((Val(TEXTL2.Text) * Val(TEXTP2.Text) * Val(TEXTH2.Text)) / 5000) * Val(Textpkg2.Text), 2)
    'lblvol3 = Round(((Val(TEXTL3.Text) * Val(TEXTP3.Text) * Val(TEXTH3.Text)) / 5000) * Val(Textpkg3.Text), 2)
    'lblvol4 = Round(((Val(TEXTL4.Text) * Val(TEXTP4.Text) * Val(TEXTH4.Text)) / 5000) * Val(Textpkg4.Text), 2)
    'lblvol5 = Round(((Val(TEXTL5.Text) * Val(TEXTP5.Text) * Val(TEXTH5.Text)) / 5000) * Val(Textpkg5.Text), 2)
    'lblvol6 = Round(((Val(TEXTL6.Text) * Val(TEXTP6.Text) * Val(TEXTH6.Text)) / 5000) * Val(Textpkg6.Text), 2)
    'lblvol7 = Round(((Val(TEXTL7.Text) * Val(TEXTP7.Text) * Val(TEXTH7.Text)) / 5000) * Val(Textpkg7.Text), 2)
    'lblvol8 = Round(((Val(TEXTL8.Text) * Val(TEXTP8.Text) * Val(TEXTH8.Text)) / 5000) * Val(Textpkg8.Text), 2)
    'lblvol9 = Round(((Val(TEXTL9.Text) * Val(TEXTP9.Text) * Val(TEXTH9.Text)) / 5000) * Val(Textpkg9.Text), 2)
    'lblvol10 = Round(((Val(TEXTL10.Text) * Val(TEXTP10.Text) * Val(TEXTH10.Text)) / 5000) * Val(Textpkg10.Text), 2)
        
    For ii = 1 To 10
    valore(ii) = CSng(Replace(lblvol(ii).Caption, ".", ","))
      Next ii
    
    'valore1 = CSng(Replace(lblvol1.Caption, ".", ","))
    'valore2 = CSng(Replace(lblvol2.Caption, ".", ","))
    'valore3 = CSng(Replace(lblvol3.Caption, ".", ","))
    'valore4 = CSng(Replace(lblvol4.Caption, ".", ","))
    'valore5 = CSng(Replace(lblvol5.Caption, ".", ","))
    'valore6 = CSng(Replace(lblvol6.Caption, ".", ","))
    'valore7 = CSng(Replace(lblvol7.Caption, ".", ","))
    'valore8 = CSng(Replace(lblvol8.Caption, ".", ","))
    'valore9 = CSng(Replace(lblvol9.Caption, ".", ","))
    'valore10 = CSng(Replace(lblvol10.Caption, ".", ","))
    
    
    valoretot = Round(valore1 + valore2 + valore3 + valore4 + valore5 + valore6 + valore7 + valore8 + valore9 + valore10, 2)
    
    LBLVOLtot = valoretot
    valoretot = CSng(Replace(LBLVOLtot.Caption, ".", ","))
    
    ' inseriti 3 numeri in 3 textbox determino i valori dal piu grande al piu piccolo (o viceversa) e calcolo il volumetrico
    ' mi sono fermato qui per evitare di ripetere per 10 volte la stessa cosa dichiarando altre variabili
    
    LATO1 = Val(TEXTL1.Text)
    LATO2 = Val(TEXTP1.Text)
    LATO3 = Val(TEXTH1.Text)
     
     If LATO1 < LATO2 Then
        If LATO1 < LATO3 Then
            If LATO3 < LATO2 Then
            minore = LATO1
            maggiore = LATO2
            medio = LATO3
            LBLFM1.Caption = ((minore + medio) * 2) + maggiore
            End If
        Else
        minore = LATO3
        medio = LATO1
        maggiore = LATO2
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        End If
    Else
        If LATO2 < LATO3 Then
        minore = LATO2
        medio = LATO3
        maggiore = LATO1
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        Else
        medio = LATO2
        minore = LATO3
        maggiore = LATO1
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        End If
    LBLFM1.Caption = ((minore + medio) * 2) + maggiore
    End If
    End Sub



  • di mabolsie data: 30/05/2013 18:21:30

    ciao Adri
    inche riga da l'errore e che errore è ?
    Puoi allegare il file affinchè lo proviamo.

    Ciao Max



  • di mabolsie data: 30/05/2013 18:58:40

    Ciao Adri

    Frena tutto !! mi sono accorto ( un pò tardi ) che stiamo ciclando degli oggetti Textbox a cui hai cambiato il nome,quindi ci vogliono altri comandi fammi fare qualche prova .

    Ciao Massimo



  • di adriprivate data: 30/05/2013 19:13:42

    Ok... Grazie mille..



  • di Vecchio Frac data: 30/05/2013 20:18:44

    @max
    Prego contattami, staff@excelvba.it, grazie.





  • di mabolsie data: 30/05/2013 20:50:21

    Ciao Adri
    Non avendo il progetto completo con Textbox e Label non riesco a testarlo.
    ti allego il codice fatto un pò a naso, provalo, appena puoi allega il progetto completo

    Grazie Ciao Max
     
    Private Sub CMDVOLUME_Click()
    
    Dim valore(1 To 10) As Double, valoretot As Double, lato(1 To 3) As Double, minore As Double, maggiore As Double, medio As Double, LBLFM1tot As Double
    Dim x(1 To 4) As Integer, y(1 To 10) As Integer
    Dim i As Integer
    
    
    
    'calcolo il volume con la seguente operazione
    
    
    For i = 1 To 10
    x1 = "textl" & (i)
    x2 = "textp" & (i)
    x3 = "texth" & (i)
    x4 = " textpkg" & (i)
    y(i) = Funcion.Controls("lblvol" & (i))
    
    y(i) = Round(((Val(x1) * Val(x2) * Val(x3)) / 5000) * Val(x4), 2)
     Next i
    
    'lblvol1 = Round(((Val(TEXTL1.Text) * Val(TEXTP1.Text) * Val(TEXTH1.Text)) / 5000) * Val(Textpkg1.Text), 2)
    'lblvol2 = Round(((Val(TEXTL2.Text) * Val(TEXTP2.Text) * Val(TEXTH2.Text)) / 5000) * Val(Textpkg2.Text), 2)
    'lblvol3 = Round(((Val(TEXTL3.Text) * Val(TEXTP3.Text) * Val(TEXTH3.Text)) / 5000) * Val(Textpkg3.Text), 2)
    'lblvol4 = Round(((Val(TEXTL4.Text) * Val(TEXTP4.Text) * Val(TEXTH4.Text)) / 5000) * Val(Textpkg4.Text), 2)
    'lblvol5 = Round(((Val(TEXTL5.Text) * Val(TEXTP5.Text) * Val(TEXTH5.Text)) / 5000) * Val(Textpkg5.Text), 2)
    'lblvol6 = Round(((Val(TEXTL6.Text) * Val(TEXTP6.Text) * Val(TEXTH6.Text)) / 5000) * Val(Textpkg6.Text), 2)
    'lblvol7 = Round(((Val(TEXTL7.Text) * Val(TEXTP7.Text) * Val(TEXTH7.Text)) / 5000) * Val(Textpkg7.Text), 2)
    'lblvol8 = Round(((Val(TEXTL8.Text) * Val(TEXTP8.Text) * Val(TEXTH8.Text)) / 5000) * Val(Textpkg8.Text), 2)
    'lblvol9 = Round(((Val(TEXTL9.Text) * Val(TEXTP9.Text) * Val(TEXTH9.Text)) / 5000) * Val(Textpkg9.Text), 2)
    'lblvol10 = Round(((Val(TEXTL10.Text) * Val(TEXTP10.Text) * Val(TEXTH10.Text)) / 5000) * Val(Textpkg10.Text), 2)
        
    For i = 1 To 10
    
    y(i) = Funcion.Controls("lblvol" & (i)).Caption
    
    valore(i) = CSng(Replace(y(i), ".", ","))
      Next i
    
    'valore1 = CSng(Replace(lblvol1.Caption, ".", ","))
    'valore2 = CSng(Replace(lblvol2.Caption, ".", ","))
    'valore3 = CSng(Replace(lblvol3.Caption, ".", ","))
    'valore4 = CSng(Replace(lblvol4.Caption, ".", ","))
    'valore5 = CSng(Replace(lblvol5.Caption, ".", ","))
    'valore6 = CSng(Replace(lblvol6.Caption, ".", ","))
    'valore7 = CSng(Replace(lblvol7.Caption, ".", ","))
    'valore8 = CSng(Replace(lblvol8.Caption, ".", ","))
    'valore9 = CSng(Replace(lblvol9.Caption, ".", ","))
    'valore10 = CSng(Replace(lblvol10.Caption, ".", ","))
    
    
    valoretot = Round(valore1 + valore2 + valore3 + valore4 + valore5 + valore6 + valore7 + valore8 + valore9 + valore10, 2)
    
    LBLVOLtot = valoretot
    valoretot = CSng(Replace(LBLVOLtot.Caption, ".", ","))
    
    ' inseriti 3 numeri in 3 textbox determino i valori dal piu grande al piu piccolo (o viceversa) e calcolo il volumetrico
    ' mi sono fermato qui per evitare di ripetere per 10 volte la stessa cosa dichiarando altre variabili
    
    LATO1 = Val(textl1.Text)
    LATO2 = Val(TEXTP1.Text)
    LATO3 = Val(TEXTH1.Text)
     
     If LATO1 < LATO2 Then
        If LATO1 < LATO3 Then
            If LATO3 < LATO2 Then
            minore = LATO1
            maggiore = LATO2
            medio = LATO3
            LBLFM1.Caption = ((minore + medio) * 2) + maggiore
            End If
        Else
        minore = LATO3
        medio = LATO1
        maggiore = LATO2
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        End If
    Else
        If LATO2 < LATO3 Then
        minore = LATO2
        medio = LATO3
        maggiore = LATO1
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        Else
        medio = LATO2
        minore = LATO3
        maggiore = LATO1
        LBLFM1.Caption = ((minore + medio) * 2) + maggiore
        End If
    LBLFM1.Caption = ((minore + medio) * 2) + maggiore
    End If
    End Sub
    



  • di adriprivate data: 30/05/2013 21:09:49

    Grazie a te! domani mattina in uff provo a dare un occhiata che il file c é l ho su chiavetta in uff.. Buona serata!



  • di adriprivate data: 31/05/2013 11:41:12

    Ciao, provato, mi da errore sul 1° Funcion.Controls.. Ti allego il file (ctrl + f parte).. Il userform incriminato è il secondo.. tra l'altro non trovo niente in rete della funzione Funcion.Controls..

    Buona giornata



  • di mabolsie data: 31/05/2013 18:20:07

    Ciao Adri sono on line ho scaricato il file e comincio a lavorarci su, ti faccio sapere appena ho novità.

    Ciao Max



  • di mabolsie data: 31/05/2013 18:52:36

    Ciao Adri ti riallego il file modificato sembra che quello che hai chiesto funzioni provalo

    Ciao Max



  • di Vecchio Frac data: 31/05/2013 23:35:20

    cit. "mi da errore sul 1° Funcion.Controls"
    ---> "Funcion.Controls" ha senso se e solo se "Funcion" è il nome di uno UserForm :)
    Lo è?
    Se sì: esistono le labels (etichette) da uno a dieci? perchè il codice
    For i = 1 To 10
    ...
    y(i) = Funcion.Controls("lblvol" & (i))

    fa riferimento a questo.






  • di mabolsie data: 01/06/2013 09:35:42

    @ VF

    Infatti ho risolto cambiando il codice così

    Ciao Max
     
    Private Sub CMDVOLUME_Click()
    
    Dim valore(1 To 10) As Double, valoretot As Double, lato(1 To 3) As Double, minore As Double, maggiore As Double, medio As Double, LBLFM1tot As Double
    Dim x(1 To 4) As Integer, y(1 To 10) As Double
    Dim i As Integer
    
    
    
    ' calcolo il volume con la seguente operazione
        
        For i = 1 To 10
            x1 = UserForm2.Controls("TEXTL" & (i))
            x2 = UserForm2.Controls("TEXTP" & (i))
            x3 = UserForm2.Controls("TEXTH" & (i))
            x4 = UserForm2.Controls("TEXTPKG" & (i))
    
            y(i) = Round(((Val(x1) * Val(x2) * Val(x3)) / 5000) * Val(x4), 2)
            UserForm2.Controls("lblvol" & (i)) = y(i)
    
        Next i
    
        For i = 1 To 10
            valore(i) = CSng(Replace(y(i), ".", ","))
        Next i
    



  • di adriprivate data: 01/06/2013 10:58:11

    Perfetto.. Grazie mille.. con voi non si finisce mai di imparare! Avete sempre la soluzione a tutto!!!
    BUON WEEK!



  • di mabolsie data: 01/06/2013 15:05:39

    @VF

    cercherò di dare spiegazioni che non assomiglio a passi di codice
    Comunque grazie per la puntualizzazione.

    Buon Week End anche a te , anzi Buon fine settimana ( magari Week End sembra codice )

    Ciao Max



  • di mabolsie data: 01/06/2013 15:19:08

    @ Adri

    ...dimenticavo, un consiglio secondo mio punto di vista, non rinominare mai il " Name " degli oggetti User,Txtbox, Lbl, ecc ma impostali in una variabile con set

    Vedi Esempio :

    Ciao Max
     
    Sub mia()
    Dim miatxt as variant
    
     Set miatxt = TextBox1
    
    MsgBox (miatxt)
    End Sub