Matrice dinamica



  • Matrice dinamica
    di Giorgio (utente non iscritto) data: 25/10/2013 10:06:13

    Buongiorno, sono alle prime armi con VBA, il mio obiettivo è di memorizzare in una matrice n numeri presenti in una colonna di excel. se fisso le dimensioni della matrice il programma funziona correttamente e come prova li riscrive sul foglio, se invece indico che Xv e Xy sono matrici dinamiche da un messaggio di errore come mai?
    Grazie



     
    Sub assegnazione_vertici()
        Dim n As Integer
        n = Foglio1.Range("C16")
        'Foglio1.Range("A1").Value = n
        Dim Xv(4) As Double
        Dim Yv(4) As Double
        Dim i As Integer
        For i = 1 To n
            Xv(i) = Cells(21 + i, 2)
            Yv(i) = Cells(21 + i, 3)
        Next
        i = 0
        For i = 1 To n
        Cells(i + 22, 4).Value = Xv(i)
        Next
            
    End Sub



  • di Vecchio Frac data: 25/10/2013 14:07:27

    Perchè le matrici dinamiche come tali hanno bisogno, in VBA, di essere rese non dinamiche (fissandone il numero di elementi) al momento dell'assegnazione, e ciò si fa con ReDim (seguito dalla direttiva Preserve con nuovo ridimensionamento per preservare i dati esistenti, nel caso in cui il numero di elementi sia destinato a cambiare durante la vita della matrice).
     
    Option Explicit
    
    Sub assegnazione_vertici()
    Dim n As Integer
    Dim Xv() As Double
    Dim Yv() As Double
    Dim i As Integer
        
        Foglio1.Activate
        
        n = Range("C16")
        ReDim Xv(n) As Double
        ReDim Yv(n) As Double
        
        For i = 1 To n
            Xv(i) = Cells(21 + i, 2)
            Yv(i) = Cells(21 + i, 3)
        Next
        
        i = 0
        For i = 1 To n
            Cells(i + 22, 4).Value = Xv(i)
        Next
            
    End Sub
    






  • di Vecchio Frac data: 25/10/2013 14:21:32

    E già che ci sei controlla questo pezzo di codice per vedere se fa quel che ti aspetti.
    In teoria, dovrebbe fare la stessa cosa, solo che assegno in un attimo a "v" l'intero range di numeri, senza utilizzare un ciclo for che scorre tutte le celle della matrice. E mi evito anche il problema del ridimensionamento dinamico :).
     
    Sub assegnazione_vertici2()
    Dim n As Integer
    Dim v As Variant
    
        n = Range("C16")
        v = Range(Cells(22, 2), Cells(22 + n, 3))
        Cells(22, 4).Resize(n, 2) = v
        
    End Sub






  • di Giorgio (utente non iscritto) data: 04/11/2013 12:35:25

    Grazie per la risposta e della risoluzione del problema delle matrici dinamiche, con la seconda procedura il risultato è identico ma a prezzo di maggiore memoria, giusto?

    nell'esempio:
    caso1
    i(int)=2b
    Xv(double)=8*4=32b

    caso2
    variant 16b*4=64b

    ciò mi preoccupa perche devo usare la matrice Xv per una grande quantità di successive operazioni.



  • di Vecchio Frac data: 04/11/2013 13:41:22

    cit. "a prezzo di maggiore memoria, giusto? "
    ---> Già, giusta analisi, ma sei il primo da quando frequento questo forum che si preoccupa dello spreco di memoria ^_^
    In realtà davvero, oggi non dovrebbe essere un problema, i sistemi attuali hanno almeno 2GB di RAM libera per l'allocazione dei dati.