creazione matrice



  • creazione matrice
    di lookap (utente non iscritto) data: 13/02/2014 12:22:47

    Salve Ragazzi,

    avrei bisogno di qualche suggerimento per poter creare una matrice come risultato del prodotto di celle di due tabelle, il tutto per definire il costo di un prodotto. Essendo novizio su VBA chiedo a voi quale sia la strada più veloce. Faccio un esempio: prima tabella, quantità prodotto per singolo materiale x prodotto (6 MP x 6 prodotti); seconda tabella, costo per singolo materiale x prodotto (6 MP x 6 prodotti). Ah dimenticavo che i risultati dovrebbero comparire sempre nello stesso puno dello stesso foglio.

    Help!
     
    Ecco un embrione di codice (che ovviamente non funziona):
    
    Option Explicit
    Option Base 1
    Sub CalcoloCostoProdotto()
        Dim riga1, colonna1 As Integer
        Dim riga2, colonna2 As Integer
        Dim a, b As Variant
        Dim matrice(6, 6)
    
    For riga1 = 21 To 26
        For colonna1 = 3 To 8
            a = Range(Sheets("sheet1").Cells(riga1, colonna2).Select)
    
    For riga2 = 31 To 36
        For colonna2 = 3 To 8
            b = Range(Sheets("sheet1").Cells(riga1, colonna2).Select)
    
    matrice(6, 6) = a * b
    Next
    Next
    Next
    Next
    
    End Sub
    



  • di patel data: 13/02/2014 13:03:51

    allega un file di esempio con le 2 tabelle ed il risultato desiderato





  • di Grograman (utente non iscritto) data: 13/02/2014 13:15:02

    In attesa dei dettagli e di una codice più funzionante, ti allego un esempio didattico di come si potrebbero alimentare due matrici e successivamente ottenerne il prodotto.
    A seguire il codice, basato su due nomi definiti a priori nel foglio, ovviamente si possono usare range dinamici!

    Il file allegato si chiama "lamatrice"

    P.s. il tuo indenting del codice è terrificante
    p.p.s. ricorda che in vba le variabili vanno tutte dichiarate, mentre nel tuo caso riga1 e riga1 sono delle variant.
    In ogni caso per le righe meglio usare delle variabili di tipo long!
     
    Option Explicit
    Option Base 1
    Sub CalcoloCostoProdotto()
    Dim varA(1 To 6, 1 To 6), varB(1 To 6, 1 To 6) As Variant 'due matrici già esistenti
    Dim varC(1 To 6, 1 To 6) As Variant 'questa la calcoliamo
    Dim cella As Range
    Dim x As Long, y As Long
    
    'cicliamo il nome del foglio "matA" ed alimentiamo la prima matrice
    For Each cella In [matA]
      x = cella.Column
      y = cella.Row - 1 'contando le intestazioni in riga 1
      varA(y, x) = cella.Value
    Next cella
    
    'stesso ciclo per il nome "MatB"
    For Each cella In [matB]
      x = cella.Column
      y = cella.Row - 11 'contando le intestazioni in riga 1
      varB(y, x) = cella.Value
    Next cella
    
    'ora alimentiamo la terza matrice come prodotto delle precedenti
    For x = 1 To 6
      For y = 1 To 6
        varC(y, x) = varA(y, x) * varB(y, x)
      Next y
    Next x
    
    [mATC].Value = varC
    
    End Sub



  • di scossa data: 13/02/2014 13:55:32

    @Grograman: usando i dati del tuo esempio
     
    Sub CalcoloCostoProdotto2()
      Dim varA As Variant, varB As Variant 'due matrici già esistenti
      Dim varC As Variant 'questa la calcoliamo
      Dim x As Long, y As Long
      
      varA = Range("A2:F7")
      varB = Range("A12:F17")
      varC = varA 'tanto i valori verranno riscritti
      
      'ora alimentiamo la terza matrice come prodotto delle precedenti
      For x = 1 To 6
        For y = 1 To 6
          varC(y, x) = varA(y, x) * varB(y, x)
        Next y
      Next x
      Range("$I$2:$N$7").Value = varC
      
    End Sub



  • di Grograman (utente non iscritto) data: 13/02/2014 14:28:41

    Ecco cosa intendevo con "codice più funzionante"



  • di lookap (utente non iscritto) data: 13/02/2014 14:39:24

    @scossa: tradotto il tuo code nel mio esempio (che avevo nel frattempo allegato), funziona alla perfezione!

    @grograman: grazie per avermi dato delle conoscenze che non avevo sulle matrici (e su vba in generale, ripeto sono uno novello): una sola cosa, sul tuo codice che ha poi permesso a scossa di dare la soluzione, quando scrivi "matA" e matB" supponi che le tabelle base si trovino in due sheet diversi, corretto?

    Grazie ancora e perdonatemi se vi ho fatto perdere tempo, ora mi toccherà scrivere, probabilmente, qlcs di ancor più difficile ma se non dovessi riuscirci so dove ed a chi posso chiedere aiuto.




  • di Grograman (utente non iscritto) data: 13/02/2014 15:28:04

    cit: "sul tuo codice che ha poi permesso a scossa di dare la soluzione"

    Diciamo che lui la soluzione l'ha data a me più che a te :D Mi ha fatto vedere dove migliorare il codice ;)

    cit: "scrivi "matA" e matB" supponi che le tabelle base si trovino in due sheet diversi, corretto? "

    Sbagliato. Possono trovarsi dove vuoi.
    Io nel primo esempio ho usato du NOMI definiti nel foglio di lavoro, "matX" solo per ricordare la parola matrice.
    Ma come vedi dal secondo codice, si possono benissimo usare dei range di celle, anche dinamici tramite le istruzioni "redim matrice()".