Progressione geometrica in VBA
Hai un problema con Excel? 
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 |
Vuoi Approfondire?