Progressione geometrica in VBA



  • Progressione geometrica in VBA
    di Roberto (utente non iscritto) data: 18/08/2014 10:23:32

    Ciao a tutti,
    sono alle prime armi con Visual Basic Application in Excel e non riesco a risolvere un problema. Ho una produzione annua PA per 30 anni la quale si riduce dello 0,02% ogni anno, come calcolo la somma della produzione tenuto conto della riduzione annua?
    Grazie mille :D



  • di lepat (utente non iscritto) data: 18/08/2014 11:44:29

    vale la pena usare il vba per una semplice formuletta che trovi su wikipedia ?



  • di Roberto (utente non iscritto) data: 18/08/2014 12:07:37

    il problema è che devo ottenere la somma della produzione totale (tenuto conto della riduzione) senza che nel foglio excel vi sia la lista delle diverse produzioni annuali. In altre parole tutti i calcoli devono essere "nascosti" all'interno del codice di vba in modo tale che io abbia una cosa del genere:
    produzione annua = X
    rid. annua= 0.02%
    prod. tot= Y
    spero di aver spiegato meglio il mio dubbio :)



  • di lepat (utente non iscritto) data: 18/08/2014 14:58:10

    la lista delle diverse produzioni annuali non serve, la formula utilizza i dati che hai descritto, comunque allega un file con i dati di partenza ed avrai formula e codice vba



  • di Roberto (utente non iscritto) data: 18/08/2014 15:27:06

    ho allegato il file.
    GRAZIE MILLE!!



  • di lepat (utente non iscritto) data: 18/08/2014 17:34:56

    metti in B8 la formula
    =B4*(1-(1-B6)^B5)/B6



  • di lepat (utente non iscritto) data: 18/08/2014 17:36:06

    volevo dire in B7, no in B8



  • di Roberto (utente non iscritto) data: 18/08/2014 18:38:33

    ti ringrazio molto ma purtroppo il risultato non è quello sperato. Sicuramente non mi sono spiegato bene :). Allego un altro file "produzione2" dove ho svolto il calcolo e sommato tutte le produzioni. Tale iter dovrei svolgerlo su vba o comunque attraverso una sola formula in modo tale che la tabella non compaia nel foglio excel ma ci sia solo la produzione totale che nell'esempio è indicata nella cella F32.



  • di lepat (utente non iscritto) data: 18/08/2014 20:00:01

    la tua progressione non è geometrica, in matematica una progressione geometrica o successione geometricaè una successione di numeri tali che il rapporto tra un elemento ed il suo precedente è sempre costante. Tale costante è detta ragione della successione.



  • di isy data: 18/08/2014 20:38:26

    Un ciclo vba da adattare al foglio
     
    Option Explicit
    
    Sub Test()
      Dim PA        As Variant
      Dim periodo   As Long
      Dim riduzione As Variant
      Dim somma     As Variant
      Dim ciclo     As Long
      PA = Cells(4, "B").Value
      periodo = Cells(5, "B").Value
      If periodo > 1 Then
        riduzione = Cells(6, "B").Value
        ReDim k(1 To periodo, 1 To 1)
        k(1, 1) = PA
        somma = PA
        For ciclo = LBound(k) + 1 To UBound(k)
          PA = PA * (1 - riduzione) ^ (ciclo + 2)
          k(ciclo, 1) = PA
          somma = somma + PA
        Next
        Range("H2").Resize(UBound(k)) = k
        Range("H32").Value = somma
      End If
    End Sub



  • di Roberto (utente non iscritto) data: 19/08/2014 11:43:29

    Grazie mille isy il codice funziona alla perfezione!!! :D :D.... avrei un'ultimissima domanda: se dovessi modificare la variabile "periodo" ovvero il valore 30 non più inserito in una cella ma come somma di più celle cosa cambierebbe al codice? Mi spiego meglio: Ho un Periodo Senza Produzione(PSP)=2, un periodo di produzione (PP)=30 (ovviamente uguale a prima). Io so che la produzione inizia al tempo PSP+1, la riduzione alla stessa al tempo PSP+2 e la produzione si avrà fino al tempo PSP+PP, come cambia il codice?

    Ho allegato un file excel "produzione3" dove ho modificato i parametri.

    Scusa se sto approfittando della tua disponibilità

    Grazie ancora



  • di isy data: 19/08/2014 12:38:14

    Ciao Roberto

    Spero di aver modificato come richiesto il codice.
    Prova se il valore è quello atteso, se corrisponde si può semplificare il codice con una Function.
    Vedi allegato: Test produzione.xlsm



  • di Roberto (utente non iscritto) data: 19/08/2014 13:06:54

    Inserendo nella cella "B5" (PSP) il valore 2 al posto del valore 3, il valore che sto cercando è corretto (corretto come quello precedente nella cella F32). Se hai modificato le variabili all'interno del vba, utilizzando quindi PSP e PP, per ottenere tale risultato credo che sia tutto a posto! :). Te lo dico in quanto non riesco a trovare il codice scritto :)



  • di isy data: 19/08/2014 13:39:28

    Ciao

    Puoi utilizzare una Function per calcolare il risultato

    Apri Editor vba con Alt F11
    In un Modulo copia la Function Prod_Totale

    In cella B8 inserisci la formula:
    =Prod_Totale(B4;B5;B6;B7)
     
    'In un modulo
    Function Prod_Totale(PA As Variant, PSP As Long, periodo As Long, riduzione As Variant)
        somma = PA
        For ciclo = 2 To periodo
          PA = PA * (1 - riduzione) ^ (ciclo + PSP)
          somma = somma + PA
        Next
        Prod_Totale = somma
    End Function



  • di Roberto (utente non iscritto) data: 19/08/2014 18:16:23

    Ciao
    la Function che mi hai descritto funziona alla grande. Grazie mille.
    Ora però ho davvero un ultimo aiuto da chiederti.
    A questo punto dovrei attuare una funzione di sconto partendo dalla produzione dell'ultimo anno considerato PSP+PP (cella I2). All'interno della cella I3 ho scritto la formula e via via calcolato tutti gli importi. Il totale da calcolare è in I32. Potrebbe essere lo stesso codice di prima più o meno ma il problema è che qua non ho la produzione dell'ultimo anno inserita in una cella. Avendo utilizzato la function da te descritta non ho esplicitate le produzioni annuali.

    Ti ringrazio nuovamente



  • di Roberto (utente non iscritto) data: 19/08/2014 18:18:51

    PS: ho allegato il file aggiornato "produzione4"



  • di isy data: 19/08/2014 20:12:13

    Ciao

    Un consiglio, prova a modificare e creare i tuoi codici partendo da esempi meno complessi.
    Ho preparato la seconda Function

    In cella M8 inserisci:
    =Sconto_Totale(I2;M3;B6;L3)

     
    'In un modulo
    Function Sconto_Totale(PA As Variant, PSP As Long, periodo As Long, riduzione As Variant)
        Sconto_Totale = PA
        For ciclo = 2 To periodo
          Sconto_Totale = Sconto_Totale + PA * (1 + riduzione) ^ (PSP - ciclo - 2)
        Next
    End Function



  • di Roberto (utente non iscritto) data: 20/08/2014 09:10:20

    Ciao,
    di nuovo la function gira alla grande!!! :D. Come ti dicevo nel post precedente purtroppo non ho in una cella l'ultimo anno di produzione (ovvero il primo nella funzione di sconto) in quanto tutte le produzioni sono inserite nella prima function. In altre parole, avendomi risolto in modo perfetto il primo problema (non avere più la lista di prod annue) nel mio foglio quando devo inserire la variabile PA nella formula sconto_totale, non ce l'ho perché è "nascosta".
    ho quindi:
    produzione annuale (PA) 7.446.000
    periodo senza produzione (PSP) 2
    periodo di produzione (PP) 30
    riduzione annua (RA - 0,02%) 0,0002
    produzione totale (PT) =Prod_Totale(B4;B5;B6;B7) (215.015.214) (in questo caso B4 è 7.446.000)
    sconto totale (ST) =Sconto_Totale(I2;M3;B6;L3)

    I2 non può essere di nuovo PA=744600 (altrimenti è come se non considerassi la riduzione annua) ma deve essere l'ultimo anno di produzione ovvero 6.707.770 che come vedi non è esplicitato.

    Ti ringrazio infinitamente per la tua pazienza

    Stai liberando uno studente universitario (capra in vba) dalle grinfie dei progetti universitari.
    Grazie mille



  • di isy data: 20/08/2014 17:28:06

    Ciao

    Cit: Stai liberando uno studente universitario (capra in vba) dalle grinfie dei progetti universitari.

    Non è bello postare compiti in un forum, senza studiarne il ciclo
    Allego la Function, spero che non serva allegare un esempio per la formula.
     
    Function Prod_Totale_con_Sconto(PA As Variant, PSP As Long, periodo As Long, riduzione As Variant, tasso_sconto As Variant, inizio_perido_sconto As Long)
        Dim ciclo As Long
        For ciclo = 2 To periodo
          PA = PA * (1 - riduzione) ^ (ciclo + PSP)
        Next
        Prod_Totale_con_Sconto = PA
        For ciclo = 2 To periodo
          Prod_Totale_con_Sconto = Prod_Totale_con_Sconto + PA * (1 + tasso_sconto) ^ (inizio_perido_sconto - ciclo - 2)
        Next
    End Function



  • di Roberto (utente non iscritto) data: 20/08/2014 18:06:46

    Ciao,
    scusami non volevo risultare scortese. E' che sono più di 15 giorni che provavo ma non riuscivo a venirne a capo. In questo progetto sto già utilizzando vba e ho già a che fare con cicli ecc. Avevo già tentato di scrivere il codice per la prima function ma non utilizzando appunto la function ma inserivo tt nel foglio Microsoft excel oggetti. (vedi esempio sotto). Infatti era tutto sbagliato perché seguivo la scrittura delle altre funzioni. Purtroppo il vba lo sto utilizzando solo per alcune che con excel non posso inserire quindi le ho lasciate per ultimo e i tempi si sono ristretti. Ecco perché ho scritto in quel modo.

    Comunque ti ringrazio molto
    scusami di nuovo


     
    Rem 13 - Total Production TP with variable production
    Dim AP As Double, AREO As Double, CT As Double, LT As Double, TP As Double
    AP = Sheets(1).Cells(40, 5)
    AREO = Sheets(1).Cells(41, 5)
    CT = Sheets(1).Cells(70, 5)
    LT = Sheets(1).Cells(29, 5)
    cont13 = AP
    OT13 = CT + 2
    OTLAST13 = CT + LT
    For i = OT13 To OTLAST13
    NAP = AP * ((1 - AREO) ^ i)
    Sheets(4).Cells(31 + i, 5) = NAP
    cont13 = cont13 + NAP
    Next i
    TP = cont13
    Sheets(1).Cells(43, 5) = TP