dichiarazione di variabile



  • dichiarazione di variabile
    di adriprivate (utente non iscritto) data: 20/06/2013 18:25:48

    Ciao a tutti
    Per quale strano motivo della vita cliccando un cmdbutton mi da errore evidenziando y1 (variabile non definita)?!?!

    Dim y(1 To 4) As Integer, y(1 To 10) As Double, yy(1 To 10) As Double

    For i = 1 To 10
    y1 = UserForm1.Controls("TEXTL" & (i))
    Y2 = UserForm1.Controls("TEXTP" & (i))
    Y3 = UserForm1.Controls("TEXTH" & (i))
    Y4 = UserForm1.Controls("TEXTPKG" & (i))

    Lo stesso identico codice su userform2 funziona perfettamente (la user in questione era dedicata solo a questo).
    Ho deciso di integrare il medesimo codice su userform1 preesistente (copia incolla) mi da errore!!!

    Ufffffff
     
    Private Sub CMDVOLUME_Click()
    Dim valore(1 To 10) As Double, valoretot As Double, lato(1 To 3) As Integer, minore As Integer, maggiore As Integer, medio As Integer, LBLFM1tot As Double
    Dim y(1 To 4) As Integer, x(1 To 10) As Double, yy(1 To 10) As Double
    'Dim X1 As Integer, X2 As Integer, X3 As Integer, X4 As Integer
    'Dim y1 As Double, Y2 As Double, Y3 As Double, Y4 As Double, Y5 As Double, Y6 As Double, Y7 As Double, Y8 As Double, Y9 As Double, Y10 As Double
    'Dim YY1 As Double, YY2 As Double, YY3 As Double, YY4 As Double, YY5 As Double, YY6 As Double, YY7 As Double, YY8 As Double, YY9 As Double, YY10 As Double
    Dim LBLTOTPKG1 As Double
    Dim i As Integer
    Dim ii As Integer
    
    LBLTOTPKG1 = Val(Textpkg10.Text) + Val(Textpkg9.Text) + Val(Textpkg8.Text) + Val(Textpkg7.Text) + Val(Textpkg6.Text) + Val(Textpkg5.Text) + Val(Textpkg4.Text) + Val(Textpkg3.Text) + Val(Textpkg2.Text) + Val(Textpkg1.Text)
    LBLTOTPKG.Caption = Val(LBLTOTPKG1)
    
    ' calcolo il volume con la seguente operazione
        For i = 1 To 10
            y1 = UserForm1.Controls("TEXTL" & (i))
            Y2 = UserForm1.Controls("TEXTP" & (i))
            Y3 = UserForm1.Controls("TEXTH" & (i))
            Y4 = UserForm1.Controls("TEXTPKG" & (i))
    
            Val(("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
    valoretot = Round(valore1 + valore2 + valore3 + valore4 + valore5 + valore6 + valore7 + valore8 + valore9 + valore10, 2)
    LBLVOLtot = valoretot
    valoretot = CSng(Replace(LBLVOLtot.Caption, ".", ","))
    
    For ii = 1 To 10
    LATO1 = UserForm2.Controls("TEXTH" & (ii))
    LATO2 = UserForm2.Controls("TEXTL" & (ii))
    LATO3 = UserForm2.Controls("TEXTP" & (ii))
    
    Select Case [LATO1]
    Case Is = ""
    Case Is <= Val(LATO2)
         If Val(LATO2) <= Val(LATO3) Then
         minore = LATO1
         medio = LATO2
         maggiore = LATO3
         yy(ii) = ((minore + medio) * 2) + maggiore
         UserForm2.Controls("lblfm" & (ii)) = yy(ii)
         Else
         minore = LATO1
         medio = LATO3
         maggiore = LATO2
         yy(ii) = ((minore + medio) * 2) + maggiore
         UserForm2.Controls("lblfm" & (ii)) = yy(ii)
         End If
    End Select
     
    Select Case [LATO2]
    Case Is = ""
    Case Is <= Val(LATO1)
         If Val(LATO1) <= Val(LATO3) Then
         minore = LATO2
         medio = LATO1
         maggiore = LATO3
         yy(ii) = ((minore + medio) * 2) + maggiore
         UserForm2.Controls("lblfm" & (ii)) = yy(ii)
         Else
         minore = LATO2
         medio = LATO3
         maggiore = LATO1
         yy(ii) = ((minore + medio) * 2) + maggiore
         UserForm2.Controls("lblfm" & (ii)) = yy(ii)
         End If
    End Select
    
    Select Case [LATO3]
    Case Is = ""
    Case Is <= Val(LATO1)
         If Val(LATO1) <= Val(LATO2) Then
         minore = LATO3
         medio = LATO1
         maggiore = LATO2
         yy(ii) = ((minore + medio) * 2) + maggiore
         UserForm2.Controls("lblfm" & (ii)) = yy(ii)
         Else
         minore = LATO3
         medio = LATO2
         maggiore = LATO1
         yy(ii) = ((minore + medio) * 2) + maggiore
         UserForm2.Controls("lblfm" & (ii)) = yy(ii)
         End If
    End Select
    
    Next ii
    End Sub



  • di Vecchio Frac data: 21/06/2013 10:02:00

    cit. "Per quale strano motivo della vita "
    ---> LOL ^_^

    Per inciso, "y1" e "y(1)" sono due variabili diverse.
    In effetti nel codice che mostri, la riga in cui dimensioni "y1" è commentata, quindi non viene considerata dall'interprete.





  • di adriprivate data: 23/06/2013 18:10:48

    si lo so che è commentata pensavo che le seguenti dichiarazioni di variabile fossero la stessa cosa:

    dim y1 as integer, y2 as integer
    =
    dim y (1 to 2) as integer

    che cambia?!



  • di Vecchio Frac data: 23/06/2013 20:51:26

    Sono tutte variabili diverse tra loro e puntano a locazioni di memoria diverse.
    Nel caso senza parentesi tu dichiari e usi una variabile semplice.
    Con le parentesi invece fai capire all'interprete che stai trattando una variabile con indice (ogni indice si riferisce a un elemento diverso del vettore).
    Nel caso di variabile indicizzata (cioè un array, o vettore) si deve usare la coppia di parentesi per riferirsi all'i-esimo elemento del vettore: per esempio, in Dim y(1 to 2) as integer, immagina la variabile "y" come una scatola che contiene valori di tipo integer; la scatola però al suo interno è suddivisa in tanto scompartimenti stagni, e ogni scomparto è individuato da un numero. Nell'esempio la scatola è divisa in due scomparti: y(1) è il primo, y(2) è il secondo.
    Puoi avere quanti elementi vuoi, ma si consuma memoria perchè lo spazio viene preallocato, cioè viene riservato in memoria lo spazio necessario a contenere tutti gli elementi anche se non vengono utilizzati.
    Di norma gli array hanno base zero (il primo elemento di un array è sempre zero: dim y(10) significa che la variabile y() contiene undici elementi, da zero a dieci compresi). Ma è possibile variare questa impostazione specificando gli indici: dim y(1 to 7).
    Il concetto è complicato dal fatto che si possono avere vettori dichiarati dinamicamente, e anche vettori a due o più dimensioni: dim y(1, 3) oppure dim y(1 to 2, 1 to 5) oppure ancora dim y(1, 3, 2) ecc.
    Non voglio farti confusione.
    In ogni caso a te serve sapere che ogni scompartimento può contenere un valore proprio, e che y è diverso da y(...).






  • di adriprivate data: 24/06/2013 09:30:27

    Uaoooo... ho più o meno compreso... sei stato chiaro!!
    Grazie!
    Buona giornata!