Vettore di Matrici



  • Vettore di Matrici
    di redevil (utente non iscritto) data: 03/10/2013 14:55:20

    Salve a tutti .
    Vi ringrazio innanzitutto per l'aiuto! :D

    Praticamente mi trovo davanti a questo dilemma . Da premettere che VBA è un linguaggio che non ho mai usato , però cercando in giro per internet di solito me la sono sempre cavata.

    Praticamente ho la necessità di creare un vettore che conterrà tutta una serie di matrici.

    Per comodità vi darò i nomi.

    Matrice1(5,5)
    VettoreMatrici()
    MatriceDestinazione(5,5)

    Allora all'inizio avrò la Matrice1 valorizzata , che memorizzerò nel vettore apposito VettoreMatrici() nel seguente modo :

    VettoreMatrici(1) = Matrice1()

    Adesso ad un certo punto avrò la necessità di prelevare la Matrice1 da VettoreMatrici e metterlo in MatriceDestinazione, quindi io ho scritto :

    MatriceDestinazione() = VettoreMatrici(1)


    Mi da un errore. Adesso non so se il problema sta già quando travaso la Matrice1 nel vettore , o sbaglio semplicemente a fare il passaggio per valore dal VettoreMatrici a MatriceDestinazione.

    Potreste aiutarmi ?
    Magari esiste qualche modo più semplice che io non conosco ...

    In poche parole spiegato a grandi linee il passaggio sarebbe questo.

    Matrice1 --> VettoreMatrici --> MatriceDestinazione

    fatto questo verrà fatto poi n volte , quindi il vettoreMatrici sarà un "contenitore" di tutte le matrici a disposizione (Matrice1,Matrice2,Matrice3 ecc....) da cui poi preleverò la matrice che mi serve per farci determinate operazioni e che poi depositerò di nuovo nel vettore.


    Grazie ancora dell'attenzione e spero di essermi spiegato bene .

    Saluti



  • di Vecchio Frac data: 03/10/2013 15:06:42

    In linea di massima ti basta dichiarare le matrici come Variant, contenitore omnia che raccoglie tutte le possibili schifezze ^_^
    Mi piacerebbe sapere come valorizzi la matrice iniziale. Da Range di Excel o in altro modo?
    Vedi di seguito il test che ho preparato, che per prova preleva dei valori dal range A1:E5 e li sbatte in una matrice(5,5).
    Poi assegno matrice1 al primo elemento di vettorematrici().
    Infine assegno questo primo elemento di nuovo a matricedestinazione (senza le parentesi).
    In quest'ultima, trovo una copia di matrice1. Naturalmente si faceva prima ad assegnarla direttamente a matricedestinazione, ma questo è solo un test :)

    In alternativa potrei suggerire l'uso di una Collection o di un Dictionary.
    Da quale altro linguaggio provieni?
     
    Sub test()
    Dim matrice1 As Variant
    Dim vettorematrici(1 To 20) As Variant
    Dim matricedestinazione As Variant
        
        Set matrice1 = [a1:e5]
            
        vettorematrici(1) = matrice1
        
        matricedestinazione = vettorematrici(1)
            
    End Sub
    






  • di redevil (utente non iscritto) data: 03/10/2013 15:53:06

    Ok quindi il problema erano le parentesi praticamente. Cmq il codice non va , adesso te lo scrivo magari c'è qualche errore che non vedo in questo momento.
    Si pianta su "MatriceProva = ContenitoreMatrici(1)" e mi dice "impossibile assegnare la matrice"

    Cmq provengo pressopiù dal C# .

    Le matrici vengono valorizzare inizialmente tramite dei calcoli .
    Uso excel perchè devo elaborare di volta in volta dei dati contenuti in un foglio.

    Certo una collection sarebbe potuta essere interessante ... ma non l'ho mai implementata , essendo novizio di questo codice ho cercato prima la cosa più semplice


    Ah volevo chiederti ... avevo letto da qualche parte che se non mettevi il tipo affianco alla matrice (As Variant) veniva dichiarata così di default ... ma non so se effettivamente è così ...
     
    Sub Pulsante2_Click()
    
    Dim MatriceBase(1 To 38, 1 To 37) As Variant
    Dim ContenitoreMatrici() As Variant
    Dim MatriceProva(1 To 38, 1 To 37) As Variant
    
    For Riga = 1 To 37
        For Colonna = 1 To 37
            MatriceBase(Riga, Colonna) = 0
        Next Colonna
    Next Riga
    
    MatriceBase(37, 4) = 2
    
    
    MsgBox "La somma dei valori nella colonna 4 è " & MatriceBase(37, 4), vbExclamation
    
    ContenitoreMatrici(1) = MatriceBase
    
    MatriceProva = ContenitoreMatrici(1)
    
    MsgBox "La somma dei valori nella colonna 4 della MatriceProva è " & MatriceProva(37, 4), vbExclamation
    
    
    End Sub



  • di Vecchio Frac data: 03/10/2013 16:14:14

    Se noti nel mio codice io non ho dichiarato le dimensioni della matrice di appoggio.
    Dovrebbe bastare quindi
    Dim MatriceProva As Variant

    Con la collection raggiungi più o meno lo stesso scopo.
    Dim contenitore_matrici as new collection 'non è la forma migliore per dichiarare collection ma per ora tappiamoci il naso

    contenitore_matrici.Add matricebase, "Matrice1"

    e poi la richiami così
    matriceprova = contenitore_matrici("Matrice1")


    Ma per i particolari implementativi forse dobbiamo ridiscutere.
    Sul tipo di dati Variant, di default è così ma io mi sono abituato a dichiarare esplicitamente anche Variant. Oltre naturalmente, ad evitarlo ove possibile per motivi di spreco di memoria :)





  • di redevil (utente non iscritto) data: 03/10/2013 16:26:11

    Ho fatto come mi hai detto però mi da un errore su :

    ContenitoreMatrici(1) = MatriceBase





  • di Vecchio Frac data: 03/10/2013 19:04:08

    Certamente, il contenitore delle matrici deve comunque essere dimensionato correttamente.
    Puoi farlo anche tardivamente se non sai a priori quante matrici devono finirci dentro (oppure usare una Collection):
    dopo aver dimensionato come matrice vuota poi devi necessariamente ridimensionare il vettore:
    Redim ContenitoreMatrici(1 to 20) as Variant
     
    Option Explicit
    
    Sub Pulsante2_Click()
    Dim MatriceBase(1 To 38, 1 To 37) As Integer
    Dim ContenitoreMatrici(1 To 20) As Variant
    Dim MatriceProva As Variant
    
        'dichiarando matricebase as integer non serve l'inizializzazione
        'perchè tutti i valori sono già impostati a zero in fase di esecuzione
        
        MatriceBase(37, 4) = 2
        
        MsgBox "La somma dei valori nella colonna 4 è " & MatriceBase(37, 4), vbExclamation
        
        ContenitoreMatrici(1) = MatriceBase
        
        MatriceProva = ContenitoreMatrici(1)
        
        MsgBox "La somma dei valori nella colonna 4 della MatriceProva è " & MatriceProva(37, 4), vbExclamation
    End Sub






  • di redevil (utente non iscritto) data: 03/10/2013 20:04:55

    ok perfetto .... grazie mille ... il problema era proprio quello ... avevo letto da qualche parte che non era obbligatorio dichiarare la dimensione del vettore (sarebbe un vettore dinamico) e invece non è così ...

    vabbè grazie ancora ...



  • di Vecchio Frac data: 03/10/2013 20:43:07

    Vero: puoi non farlo subito ma dinamicamente, ogni volta che desideri aggiungere un dato devi fare un
    Redim Preserve matrice(nuovo numero di elementi)
    i vantaggi ci sono ma io penso di più agli svantaggi (efficienza di memoria in primis).
    Una collection (e daje ^_^) sarebbe più efficiente comunque.