funzione moltiplicatoria



  • funzione moltiplicatoria
    di Luca (utente non iscritto) data: 27/12/2013 12:47:07

    Salve,
    per prima cosa, una piccola precisazione. Non sto cercando di realizzare una vera e propria funzione che esegue la moltiplicatoria, ma piuttosto una sommatoria di un prodotto.
    Semplicemente, io ho due colonne, vorrei ottenere la somma del prodotto di A1*B1 + A2*B2 etc etc, fino all'ultima cella del range che mi interessa.

    Ho provato ad impostare il problema in due modi diversi: ovvero, in un caso la funzione prende in ingresso la prima cella di ogni colonna, nel secondo caso prende in ingresso le due colonne intere.

    In tutti e due i casi, quello che ottengo è sempre: #VALORE

    Altra cosa da notare, nel codice sono "stato costretto" ad inserire le variabili A e B, in quanto NON ho trovato nessun modo funzionante per assegnare ad una variabile cella il valore della sua cella successiva...questo ha reso il codice "più complesso" e soprattutto meno elegante.

    In ogni caso, i due codici sono i seguenti:
     
    Function moltiplicatoria_colonne(colonna1 As Range, colonna2 As Range)
    
    Dim cella1 As Range
    Dim cella2 As Range
    
    Set cella1 = Range("colonna1").End(xlUp).Value
    Set cella2 = Range("colonna2").End(xlUp).Value
    cont = 1
    
     For Each cella1 In colonna1
       
        If (cont = 1) Then
        parziale = cella1 * cella2
        cont = cont + 1
        GoTo salto
        End If
        
       A = cella1.Value 'la cella 1 viene fatta scorrere dal for
       B = cella2.Offset(1, 0).Value
       parziale2 = A * B
       molt = molt + parziale2 + parziale1
       cont = cont + 1
    salto:
     Next
       
      moltiplicatoria_colonne = molt
       
    End Function
    
    ###############################à
    
    Function moltiplicatoria(cella1 As Range, cella2 As Range)
    
    'seleziono la fine del range che mi interessa
    Dim ultimacella As Range
    Set ultimacella = Range("cella1").End(xlDown).Select
    Dim colonna As Range
    Set colonna = Range(cella1 & ":" & ultimacella)
    
    cont = 1
    
    For Each cella1 In colonna
        If (cont = 1) Then
        parziale = cella1 * cella2
        cont = cont + 1
        GoTo salto
        End If
      'offset.value NON può essere applicato a variabili RANGE? PERCHE'?
      A = cella1.Value
      B = cella2.Offset(1, 0).Value
      parziale2 = A * B
      ActiveCell.Select = cella2
      cont = cont + 1
      
        molt = parziale + parziale2
    salto:
    Next
    
    moltiplicatoria = molt
    
    End Function
    
    



  • di patel data: 27/12/2013 13:21:23

    è un esercizio ? perché scomodare il vba per cose che si possono fare con le formule ?





  • di patel data: 27/12/2013 13:24:23

    se è un esercizio allega un esempio in modo da vedere come usi la funzione





  • di Luca (utente non iscritto) data: 27/12/2013 14:53:48

    cavolo, avevo dato per scontato che non c'era una formula già fatta! Invece c'è, trovata!

    In ogni caso, mi interesserebbe lo stesso capire perchè non funzionano le due macro: puoi/potete darmi una mano?

    Ho allegato il file moltiplicatoria.xlsm.

    Grazie :D



  • di gaetanopr data: 27/12/2013 15:09:58

    Puoi usare una formula matriciale per la sommatoria tipo questa
    =SOMMA(A1:A3*B1:B3)

    oppure la seguente funzione

     
    Function Moltiplicatora(rng1 As Range, rng2 As Range)
    Moltiplicatora = Evaluate("Sum(" & rng1.Address & "*" & rng2.Address & ")")
    End Function
    



  • di Luca (utente non iscritto) data: 27/12/2013 15:28:22

    ti ringrazio. Io avevo trovato anche questa: MATR.SOMMA.PRODOTTO(A1:A3;B1:B3)

    però, nonostante questo, vorrei capire perchè il mio codice non funziona.. :(



  • di gaetanopr (utente non iscritto) data: 27/12/2013 15:55:28

    Sinceramente la tua funzione non la capisco, cioè non capisco perchè fai tutti questi giri, oltre a quella che ti ho proposto prima potresti pure fare in questo modo(questa però non l'ho provata) ho soltanto cercato di sistemare la tua
    dimmi se funziona
     
    Function moltiplicatoria_colonne(colonna1 As Range, colonna2 As Range)
    
    
     For i = 1 To colonna1.Rows.Count
         parziale = parziale + (colonna1(i) * colonna2(i))
     Next i
       
      moltiplicatoria_colonne = parziale
      
    End Function



  • di Luca (utente non iscritto) data: 27/12/2013 16:24:55

    Eccellente!!

    Funziona ottimamente!

    P.S: il motivo per cui io facevo tutto quei giri è semplice...ignoranza:

    -non sapevo comesi poteva fare un ciclo fino alla fine di una colonna senza usare una variabile cella
    -non sapevo come utilizzare i singoli elementi di una colonna senza usare una variabile cella
    -etc etc.

    Ora so qualcosa in più! :D



  • di gaetanopr data: 28/12/2013 09:30:59

    Ciao sempre a scopo "didattico" in quanto sappiamo che già esistono funzioni che fanno questo tipo di operazione(MATR.SOMMA.PRODOTTO), ti allego una versione che ti permette di inserire più range(indefiniti) e non soltanto due.
     
    Function SommaMol(ParamArray r() As Variant)
    s = 1                             
    For i = 1 To r(0).Count           
       For n = LBound(r) To UBound(r) 
              s = s * r(n)(i)         
       Next                           
       SommaMol = SommaMol + s
       s = 1                          
    Next                             
    End Function