I riassunti , gli appunti i testi contenuti nel nostro sito sono messi a disposizione gratuitamente con finalità illustrative didattiche, scientifiche, a carattere sociale, civile e culturale a tutti i possibili interessati secondo il concetto del fair use e con l' obiettivo del rispetto della direttiva europea 2001/29/CE e dell' art. 70 della legge 633/1941 sul diritto d'autore
Le informazioni di medicina e salute contenute nel sito sono di natura generale ed a scopo puramente divulgativo e per questo motivo non possono sostituire in alcun caso il consiglio di un medico (ovvero un soggetto abilitato legalmente alla professione).
Excel, foglio di calcolo per antonomasia, è un mondo straricco di funzioni. E la faccenda si ripercuote in ambiente Visual Basic per Applicazioni, in tre modi distinti:
In questa trattazione ci occuperemo in qualche dettaglio dei tre casi, ma allo scopo di evitare (facili) confusioni, conviene offrire subito esempi relativi a ciascuno dei tre casi predetti:
Caso a:
y = Application.Vlookup(x, Range(TabSconti), 2)
z = Application.Vlookup(x, MiaMatrSconti, 2)
Premesso che Application.Vlookup è il corrispettivo, in VBA, della funzione Excel CERCA.VERT(Cosa;Tabella;Indice), per la quale si rimanda alla Guida chi non la conoscesse, supponiamo poi che l’intervallo denominato, sul foglio di lavoro, “TabSconti” contenga una tabella di sconti del tipo seguente:
Importo Sconto%
0 |
0,00% |
10.000 |
2,50% |
40.000 |
5,00% |
100.000 |
7,50% |
e che gli stessi dati siano stoccati nella matrice VBA MiaMatrSconti, di 3 righe e 4 colonne. Ebbene non sarà arduo verificare che, se putacaso x = 15.000, entrambe le istruzioni restituiscono 0,025.
Caso b:
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],TabSconti,2)"
Supponendo, per fissare le idee, che sia attiva la cella C6, accanto alla C5 contenente un dato importo, il precedente codice inserisce in C6 la formula seguente:
=CERCA.VERT(C5;TabSconti;2)
Caso c:
y = MiaFunz(x)
F10=MiaFunz(F9)
Si suppone che sia stata creata una certa funzione d’utente MiaFunz, diciamo nel Modulo1:
Function MiaFunzione(x As Double) As Double
. . . opportune istruzioni . . .
End Function
Ebbene, i due precedenti esempi illustrano (genericamente) altrettante possibilità d’uso delle MiaFunz, in una routine VBA o nella cella F10 del foglio.
La libreria di oggetti di Microsoft Excel (Microsoft Excel Object Library 9, con Office 2000), oltre a oggetti propri (quali Worksheet e Range) e incorporati (Shape, OLEObject) e relative proprietà, com’è logico attendersi, comprende funzioni del foglio di calcolo richiamabili in una macro VBA. Non tutte però. Per scoprire quali sono, si digiti, nell’Editor VBA:
“Application.WorksheetFunction.”
Si spalancherà un elenco di tutte e sole le funzioni supportate. Per brevità, citiamone solo alcune, a titolo di saggio, con accanto l’equivalente sul foglio di lavoro dell’edizione italiana:
Funzione VBA Funzione sul foglio Significato
Cos |
COS |
Coseno |
Average |
MEDIA |
Media aritmetica |
ChiTest |
TEST.CHI |
Test per l’indipendenza |
Choose |
SCEGLI |
Scegli da un elenco |
Count |
CONTA |
Conteggio |
Dcount |
DB.CONTA |
Conteggio su un database |
Dsum |
DB.SOMMA |
Somma su un database |
Hlookup |
CERCA.ORIZZ |
Ricerca tabellare orizzontale |
GammaDist |
DISTRIB.GAMMA |
Distribuzione Gamma |
Lookup |
CERCA |
Ricerca gabellare (semplice) |
Rank |
RANGO |
Posizione di un dato in un elenco |
Round |
ARROTONDA |
Arrotondamento |
Sum |
SOMMA |
Somma |
Vlookup |
CERCA.VERT |
Ricerca gabellare verticale |
Sono abbastanza immediate le osservazioni riportate qui di seguito, che comunque non guastano.
NOTA – Vi sono alcuni duplicati (da evitare). Così Application.Trim (corrispettivo dell’italiana ANNULLA.SPAZI() equivale alla Trim del VB standard. C’è poi una strana (e inutile!) Application.Asc(“A”) che restituisce “A” e non il codice Ascii 65 come la Asc(“A”).
Puntualizziamo ora una regola molto importante, già anticipata nel paragrafo d’apertura.
Regola. Le funzioni del foglio di lavoro si applicano, in ambiente VBA, sia agli intervalli sia alle matrici Visual Basic. E questo indipendentemente dal fatto che gl’indici di matrice partano da 0 (direttiva default Option Base 0) o da 1 (Option Base 1).
Non c’è quasi bisogno di mettere in evidenza la portata di questo ampliamento apportato al Visual Basic dalla libreria delle potenti funzioni Excel, specie per chi necessita di funzioni speciali come quelle statistiche. Un esempio più terra terra è dato dal pur banale calcolo della media. In Excel VBA si ottiene con il semplice (e compatto) codice seguente:
Sub ColcolaMedia()
MioVett = Array(1, 2, 3, 4, 5)
MsgBox Application.Average(MioVett)
End Sub
Invece in Visual Basic standard, ipotizzando un progetto in cui il calcolo della media ricorre più volte, si dovrà creare una funzione ad hoc, evocabile come nella successiva routine di prova:
Function MiaMedia(Matr)
For i = 0 To UBound(Matr)
Tot = Tot + Matr(i)
Next
MiaMedia = Tot / i
End Function
Sub ProvaMiaMedia()
Dim MiaMatr(4)
MioVett = Array(1, 2, 3, 4, 5)
For i = 0 To 4
MiaMatr(i) = MioVett(i)
Next
MsgBox MiaMedia(MiaMatr)
End Sub
Detto di passaggio, la routine seguente dà errore:
Sub ProvaMioArray()
MioVett = Array(1, 2, 3, 4, 5)
MsgBox MiaMedia(MiaMatr)
End Sub
Il Debugger protesta segnalando un conflitto tipologico sulla chiave Ubound(Matr) applicata al vettore MioVett passato alla funzione MiaMedia. Probabilmente molti lettori sono già incappati in questa inattesa quanto frustrante situazione e magari i più esperti, oltre che dio, sanno perché. Chi scrive no, e si stupisce del fatto che Ubound(MioVett) sia invece accettato nei casi in cui non si invoca una routine. Ma a che servono le discussioni? Occorre rassegnarsi e prendere atto che non si può passare impunemente una variante contenente un Array come argomento di una funzione o di una Sub.
Ma la cosa che più di tutte va sottolineata è che le funzioni di Excel possono essere fruite non solo nel VBA di Excel, ma altresì:
Ricordiamo la manovra da compiere, nell’Editor Visual Basic:
Se le precedenti operazioni sono stata compiute, vale la seguente
Regola - Le funzioni di Excel si possono richiamare anteponendo “Excel.WorksheetFunction.” o, semplicemente, “Excel.”.
Provare, per convincersene, con questa istruzione in ambiente Word VBA:
MsgBox Excel.Average(1,2,3,4,5)
Vi sono però, e non vanno dimenticate, delle controindicazioni:
Per fortuna i PC odierni sono sempre più veloci e dotati di memorie molto ampie, inoltre è difficile che non sia presente Excel. Conclusione:
A chi desidera sviluppare applicazioni sofisticate e non ha tempo da perdere (e, lo si confessi: non ha la competenza necessaria…) per implementare in proprio certe sofisticate funzioni della cucina Excel conviene passare per questo ricco convento.
Nelle applicazioni più professionali è della massima importanza l’utilizzo delle proprietà Value, Formula e FormulaR1C1.Esse infatti danno luogo all’inserimento in singole celle o in interi intervalli di costanti o formule qualsiasi, aprendo la strada alla creazione di modelli dinamici molto sofisticati.
Conviene fare un esempio tipico (ancorché banale assai):
. . . . . . . . . . . .
9 Incremento vendite 1° trimestre 2000
10 Prodotti Dic. 1999 Gennaio Febbraio Marzo
11 Viti 1.200 1.260 1.323 1.389
12 Bulloni 900 945 992 1.042
. . . . . . . . . . .
20 Dati 2.500 2.625 2.756 2.894
21 Coppiglie 1.850 1.943 2.040 2.142
Opportune, e scontate, formule in colonna D e seguenti calcolano un incremento dello 0,5% rispetto al mese precedente (dio lo volesse!, ma è un esempietto didattico). Si supponga poi che all’intervallo D11:F11 sia stato preassegnato il frivolo nome “Formuline”. Se, come sovente accade, il numero di voci non è dato a priori, diversi utenti (specie se provenienti da Lotus 1-2-3) affidano il compito di copiare dinamicamente le formule in basso a una macro come la seguente:
Sub CopiaDinamica()
With Range("Formuline")
r = .Cells(1, 0).End(xlDown).Row - .Row + 1
c = .Cells.Columns.Count
.Copy Destination:= Range(.Cells(1, 1), .Cells(r, c))
End With
End Sub
La precedente routine, determina la riga r, in senso relativo all’intervallo “Formuline” tramite l’ultima cella della colonna C, a sua volta individuata mediante la proprietà End(xlDown) (v. Guida o anche il Manualino introduttivo del qui presente autore, già pubblicato in questo stesso sito Microsoft) e la colonna, sempre relativa, c tramite Columns.Count. Infine si sfrutta il metodo Copy che, con argomento Destination, funziona “a distanza” e senza selezionare alcunché.
Il procedimento appena visto è valido, ma a nostro avviso lo è ancor più il seguente (lasciato alla commento e alla sperimentazione autogestita):
Sub InserimentoDinamico()
With Range("Iniform")
r = .Cells(1, 0).End(xlDown).Row - .Row + 1
c = .Cells(0, 1).End(xlToRight).Column - .Column + 1
Range(.Cells(1, 1), .Cells(r, c)).FormulaR1C1 = "=RC[-1]*1.05"
End With
End Sub
La notazione R1C1 dei riferimenti nasce, storicamente, col Multiplan, glorioso spreadsheet Microsoft oggi defunto. Excel ha adottato il più intuitivo stile A1, da battaglia navale, mantenendo però l’R1C1, come non tutti sanno. Chi non fosse senza peccato, non scagli pietre ma scelga dal menu Strumenti il comando Opzioni… e, nella scheda Generale, provi a fissare per l’appunto lo Stile di riferimento R1C1. Risultato: non solo anche le colonne vengono intestate con numeri, ma una banal formula come =A1+A2, scritta in A3, diventa =R[-2]C+R[-1]C. Che vuol dire? R sta per Riga e C per Colonna e ad esempio R[-2]C significa: due righe sopra, stessa colonna.
Osserviamo poi che i simboli $ che contrassegnano i riferimenti assoluti ($A$1) o misti ($A1 e A$11) non contano in molte istruzioni VBA, in quanto Range("B1:F20"), Range("$B$1:$F$20") o Range("$B1:$F20") individuano il medesimo intervallo. Ma nella copia e nell'inserimento di formule con Ctrl+Invio i dollari tornano ad avere... corso legale.
Se C1:C10 è la selezione corrente, un conto è scrivere in C1, prima di copiarla o consolidarla nella selezione, =$A$1*B1, un conto dimenticarsi i dollari e limitarsi a =A1*B1. Nel primo caso in C2, C3, C4... troveremmo le formule =$A$1*B2, =$A$1*B3, =$A$1*B4..., nel secondo si avrebbero le formule =A2*B2, =A3*B3, =A4*B4..., di ben diverso significato (e risultato disastroso).
Ma perché adottare lo stile R1C1 in luogo del più semplice A1? Perché il secondo è meno potente e flessibile del primo, come stiamo per mostrare.
Per comprendere la cosa, si pensi che la selezione attuale sia C10:C50, a che C10 sia la cella attiva e di voler inserire in tale intervallo, la formula =C9+1 atta a creare una serie progressiva di valore iniziale (variabile) posto in C9. L’istruzione seguente può soddisfare tale requisito:
Selection.Formula = "=C9+1"
La pratica, e qualche riflessione, svela però un’inadeguata flessibilità di tale codice. Infatti spesso Selection sottintende la possibilità di generalizzarlo a qualsiasi intervallo e non solo a quello che inizia in C10. Peggio ancora vanno le cose se si vuol passare un oggetto Range come argomento di una routine. Con la zona predetta va tutto bene: in C10 si ha =C9+1, in C11=C10+1 eccetera, però con una diversa selezione, putacaso E5:E11, la stessa istruzione ci darà di nuovo C9+1 in E5, C10+1 in E6, e così via, una serie identica all'altra, mentre ne avremmo voluto una che dipendesse dal valore nella cella sovrastante E5, ossia E4.
Con lo stile R1C1 si avrebbe invece:
Selection.FormulaR1C1 = "=R[-1]C"
In tal modo si evita l’inconveniente appena lamentato perché i riferimenti R[-1]C puntano a una riga sopra, stessa colonna.
Per chiudere coi riferimenti R1C1 riportiamone la casistica sintattica nella tabella che segue.
Stile Significato Esempio Equivalente A1
RnCm |
Riga n, colonna m |
R3C5 |
$E$3 |
RnC |
Riga n, stessa colonna |
R5C |
A$5 |
RCm |
Stessa riga , colonna m |
RC4 |
$D1 |
Rn |
Riga n |
R5 |
$5 |
Cm |
Colonna m |
C6 |
$F |
RC |
Stessa riga e colonna (rif. circolare) |
RC |
Non esiste |
R[n]C |
Scarto di n righe, stessa colonna |
R[-2]C - R[3]C |
Non esiste |
RC[m] |
Stessa riga, scarto di m colonne |
R[2]C - R[-1]C |
Non esiste |
R[n]C[m] |
Scarto di n righe e m colonne |
R[2]C[-2] |
Non esiste |
R1C1:R[9]C |
Zona con cella 1 fissa, 2 scartata |
=SOMMA(R1C1:R[9]C) |
=SOMMA($A$1:A10) |
Si fa notare che talune equivalenze sono imperfette, data la superiore flessibilità della notazione R1C1.
Una particolarità per i più abili e curiosi. La distinzione tra le proprietà FormulaR1C1 Formula e Value è solo formale e si può constatare, ad esempio, la piena equivalenza fra I codici seguenti:
Formula = "=A1+A22" e FormulaR1C1 = "=A1+A2"
FormulaR1C1 = "=R[-2]C+R[-1]C" e Formula = "=R[-2]C+R[-1]C" e, persino: Value = "=R[-2]C+R[-1]C"
L’inserimento di formule può addirittura far a meno tanto di Formula che di FormulaR1C1. Si provi con Range("B12") = "=RAND()" o con Cells(3, 4) = "=R[-1]C+1". Funzionano entrambe, in quanto Excel tramuta in formula ogni stringa che inizia con =.
Nelle ultime edizioni del Visual Basic per applicazioni Microsoft ha definitivamente abbandonato le codifiche “localizzate”. Magari creando qualche iniziale malumore negli utenti italiani che avevano sudato con macro del tipo seguente:
Con CellaAttiva.ZonaCorrente
.IndiceColore = 6
.Motivo = xlContinuo
Fine Con
Per fortuna, con Excel 97 e 2000, modelli con macro italiane vengono tradotte automaticamente al caricamento. Ma la scelta Microsoft è pienamente giustificata. Tra l’altro:
in questo mondo sempre più globalizzato solo così un modello creato in Italia può essere fruito da un corrispondente in qualsiasi altro paese.
La conseguenza, per il discorso che stiamo facendo, è che, per essere il VBA rigorosamente e pienamente anglofono, una formula come la seguente è errata:
Range(“A1”).FormulaR1C1 = "=SOMMA(R1C1:R10C1)”
Si deve, invece, scrivere:
Range(“A1”).FormulaR1C1 = "=SUM(R1C1:R10C1)”
Ma niente paura: la precedente sintassi scrive poi nella cella di Excel italiano la formula =SOMMA($A$1:$A$10) (e formule analoghe, in francese o tedesco ecc., vengono inserite a beneficio di colleghi stranieri, in possesso della propria edizione nazionale).
Da questa quasi perfetta virtù poliglotta (*) emerge però la difficoltà derivante dalle sintassi inglesi delle funzioni Excel? Si e no.
Ma come si fa a conoscere la sintassi inglese delle innumerevoli funzione del vasto repertorio Excel? A onor del vero un espediente c’è, e sicuramente la maggioranza degli utenti lo trova prima o poi da solo:
Si troverà qualcosa come:
ActiveCell.FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
E il gioco è fatto, si dirà. Sì, ma che scomodità. E il piacere di avere sottomano una tabella completa, dove lo mettiamo? Purtroppo si tenterebbe invano di reperire tale tabella nella Guida.
Per ovviare all’inconveniente, a beneficio anzitutto di se stesso, ma ora anche degli utenti più esperti che usano (o intendono usare prima o poi) funzioni anche avanzate da inserire tramite macrocodice il qui presente autore si è costruito da solo tale tabella, comprendente quasi tutte le funzioni italiane di Excel con, a fianco le equivalenti inglesi e descrizioni sintetiche sul significato di ciascuna.
Per farla breve, essa è reperibile nel file seguente:
FunzioniItaliane_inglesi.xls
Nel quale sono riportate, nel primo foglio, entrambe le funzioni e relative spiegazioni, mentre gli altri tre riportano solo le italiane, le inglesi e le spiegazioni.
Il file predetto è di immediata e agevole consultazione, ma in seguito abbiamo pensato di fare di più, sfruttando codice Visual Basic, per la consultazione. Il primo risultato di tali sforzi si trova nei file seguenti, fra loro correlati:
Il secondo è in formato CSV (Comma Separated Values) e, come avverte la macro d’avvio del primo occorre assolutamente che si trovi nella medesima directory di TraduttoreFunzioni.xls.
Lo scopo di questo primo traduttore è subito visto. Basta caricarlo in Excel e fare clic sul pulsante “Traduttore” o sulla WordArt. Compare l’inequivocabile finestra di dialogo seguente:
Se però si fa clic sul pulsante “Copia à Appunti” l’utente è avvertito che questa funzionalità non la si è potuta implementare in VBA, per il semplice motivo che in tale ambiente latita l’oggetto ClipBoard e relative proprietà quali SetText e GetText che consentono di utilizzare gli Appunti.
A quel punto chi scrive, preso il coraggio a quattro mani, ha realizzato in Visual Basic 6 l’equivalente utility .EXE. Corrisponde ai seguenti 4 file, anche qui tutti tassativamente da collocare in una medesima cartella di file:
I vari archivi .txt sono testi puri separati, di ovvio significato. Se non altro, permettono a chi vuole di correggere eventuali errori e/o di modificare le spiegazioni a suo gusto.
In questo caso è possibile utilizzare il piccolo Traduttore direttamente nell’Editor Visual Basic di Excel:
Ecco le manovre da compiere:
A questo punto ci manca lo spazio per commentare le routine contenute nella cartella di lavoro TraduttoreFunzioni.xls, i cui algoritmi sono suppergiù simili a quelli adottati nell’utility TraduttFunzioniExcel.exe. Oltretutto sono abbastanza avanzate. Comunque riportiamo qui di seguito una macro cruciale, con scarni commenti a beneficio dei più esperti.
Private Sub UserForm_Initialize()
Dim MioRec As String, Dato As String, i As Integer, n As Integer
p = ThisWorkbook.Path & "\"
ListBox1.Clear 'Forse qui è superfluo...
Open p & "FunzioniItaliane_Inglesi.csv" For Input As #1
i = 0
While Not EOF(1)
Line Input #1, MioRec
‘pone successivamente in MioRec le righe del file .csv
n = InStr(1, MioRec, ";")
Dato = Left(MioRec, n - 1)
ListBox1.AddItem Dato
MioRec = Replace(MioRec, Dato & ";", "", 1, 1)
ReDim Preserve FunzionIngl_Spiegaz(i)
FunzionIngl_Spiegaz(i) = MioRec
i = i + 1
Wend
Close #1
ListBox1.ListIndex = 0
End Sub
La precedente Sub, che agisce al caricamento della UserForm, esordisce ponendo in p il percorso completo in cui si trova ThisWorkbook, ossia TraduttoreFunzioni.xls. Tale percorso è dato dalla proprietà Path, al quale va concatena la barra inversa “\”. In tal modo la successiva Open è in gradi di aprire il file .csv a condizione che esso si trovi nella medesima directory del file .xls. Il successivo ciclo While… Wend
provvede, per ciascun record del file .csv, a isolarne i tre campi (separati dal “;"), ponendo il primo nella lista delle funzioni italiane (ListBox1) e gli altri due nei vettori FunzionIngl_Spiegaz(i) e FunzionIngl_Spiegaz(i). Questi vettori, il cui nome spiega tutto, sono visibili in tutta la UserForm (essendo definiti a livello modulo), vengono utilizzati dalle altre macro d’evento di quest’ultima per far corrispondere a ciascuna funzione italiana la corrispondente italiana e la relativa spiegazione sintetica.
Fin dalle origini il superfoglio Microsoft si è distinto dai rivali per la possibilità di creare funzioni personalizzate o, come anche si dice, funzioni d’utente. Queste sono utili in primo luogo nell'ambito del codice Visual Basic (ove, per così dire, “sono di casa”, e il discorso vale per il VB standard, come per qualsiasi altro VBA). Ma la peculiarità di Excel sta nel fatto che le funzioni d’utente si aggiungono alle normali funzioni Excel, ergo possono essere utilizzate anche da utente finale su un foglio di lavoro. A condizione che qualche anima buona gliel’abbia già preparate, ovviamente.
Librerie di funzioni d’uso ricorrente, oltre che essere inserite nella cartella PERSONAL.XLS possono tradursi in aggiunte (di estensione XLA). Circa le modalità per crearsi un’aggiunta si rimanda alla Guida.
Al termine di questo articolo ci limitiamo a proporre tre esempi semplici ma pratici, riservandoci di approfondire il discorso sulle funzioni personali in un periodo successivo. Gli esempi in questione possono essere fruiti e sperimentati nel file seguente:
Prime funzioni personali.xls.
La figura che segue pone in drammatica evidenza come possa nascere, in un caso della vita, l’esigenza della prima funzione proposta.
In casi del genere gli utenti si arrangiano con formule di addizione, del tipo seguente:
L6 =D6+F6+H6+J6
M6=E6+G6+I6+K6
Ma questa soluzione è poco soddisfacente per due motivi: è molto tediosa con Intervalli estesi ed è sensibile all’inserzione di celle. Di qui l’idea di creare una funzione d’utente capace di comportarsi come la ben nota SOMMA(), ma totalizzando solo le celle dispari. È un uovo di Colombo (cui però pochi pensano!) sicché la riproduciamo qui sotto senza commenti:
Function SommaAlterna(VettoreIntervallo As Range)
Dim i As Integer
With VettoreIntervallo
For i = 1 To .Count Step 2
SommaAlterna = SommaAlterna + .Cells(i)
Next
End With
End Function
Due sole osservazioni:
Queste somme diagonali nascono da uno sfizio del qui presente autore, che si è voluto cimentare coi quadrati magici realizzati su un foglio Excel.
Comunque queste somme lungo le diagonali di un intervallo quadrato possono servire altrove, non si sa mai. Le riportiamo qui sotto, senza commentarle, salvo ricordare una regola importante (e non a tutti nota…).
Regola - Alle celle degli oggetti Range si può accedere tramite la proprietà Cells o, più semplicemente, tramite indici. Sicché ad es. Range(“A1:C5”).Cells(1, 2) equivale a Range(“A1:C5”)(1, 2) (che è più elegante).
Function SommaDiagDisc(ZonaQuadrata As Range)
Dim NumRig As Integer
NumRig = ZonaQuadrata.Rows.Count
For i = 1 To NumRig
SommaDiagDisc = SommaDiagDisc + ZonaQuadrata(i, i)
Next
End Function
Function SommaDiagAsc(ZonaQuadrata As Range)
Dim NumRig As Integer
NumRig = ZonaQuadrata.Rows.Count
k = NumRig
For i = 1 To NumRig
SommaDiagAsc = SommaDiagAsc + ZonaQuadrata(i, k)
k = k - 1
Next
End Function
Coloro poi non disdegnano siffatte frivolezze possono dare un’occhiata al foglio di lavoro Somme diagonali esplorandone le varie formule. E ad essi sono dedicate due funzioni più sofistiche, ossia:
Entrambe visibili nel Modulo1 della cartella .xls di cui stiamo parlando.
Nella figura che segue è mostrata la parte bassa del solito modello. Vi si illustra come può nascere l’esigenza del calcolo di una media ponderata. Sulla sinistra, esso viene svolto mediante formule normali, sulla destra con la funzione d’utente MediaPond().
Riproduciamo subito la funzione personale:
Function MediaPond(ZonaValori As Range, ZonaPesi As Range)
Dim i As Integer, SommaProd As Double, SommaPesi As Double
For i = 1 To ZonaValori.Count
SommaProd = SommaProd + ZonaValori(i) * ZonaPesi(i)
SommaPesi = SommaPesi + ZonaPesi(i)
Next
MediaPond = SommaProd / SommaPesi
End Function
Neanche qui dovrebbero necessitare commenti, salvo forse ribadire l’accesso indicizzato a un oggetto Range (ad es. ZonaPesi(i) equivale - ma è più bello – a ZonaPesi.Cell(i).
Nel calcolo “tradizionale” della media ponderale si è ricorsi, nel modello, anche alla funzione MATR.SOMMA.PRODOTTO(), che calcola la somma dei prodotti, termine a termine, di due o più vettori.
Ma qui vogliamo privilegiare un’altra soluzione, basata sulle potenti, bellissime funzioni matriciali di Excel, che pochi utenti conoscono e per le quali ora, per forza, dobbiamo rimandare alla Guida. Ricordiamo solo che vanno inserite mediante Maiusc+Ctrl+Invio. Perché ne parliamo qui? Ma perché nella cella F31 (v. “Spese d’acquisto”, figura precedente) chi scrive ha per l’appunto inserito mediante Maiusc+Ctrl+Invio la “strana” funzione seguente:
=SOMMA(D28:D30*E28:E30)
La si vede, nella barra della formula, circondata da graffe, “{“ e “}”, a enfatizzarne la speciale natura matriciale. Nella fattispecie, viene calcolata la somma dei prodotti, termine a termine, delle due zone D28:D30 ed E28:E30.
E così tutti capiscono come mai la formula seguente, in E33, calcoli la media ponderata
=F31/SOMMA(D28:D30)
In modo tradizionale-sì-ma-grazioso.
Fonte:
Sito web da visitare:
Autore del testo: non indicato nel documento di origine
Il testo è di proprietà dei rispettivi autori che ringraziamo per l'opportunità che ci danno di far conoscere gratuitamente i loro testi per finalità illustrative e didattiche. Se siete gli autori del testo e siete interessati a richiedere la rimozione del testo o l'inserimento di altre informazioni inviateci un e-mail dopo le opportune verifiche soddisferemo la vostra richiesta nel più breve tempo possibile.
I riassunti , gli appunti i testi contenuti nel nostro sito sono messi a disposizione gratuitamente con finalità illustrative didattiche, scientifiche, a carattere sociale, civile e culturale a tutti i possibili interessati secondo il concetto del fair use e con l' obiettivo del rispetto della direttiva europea 2001/29/CE e dell' art. 70 della legge 633/1941 sul diritto d'autore
Le informazioni di medicina e salute contenute nel sito sono di natura generale ed a scopo puramente divulgativo e per questo motivo non possono sostituire in alcun caso il consiglio di un medico (ovvero un soggetto abilitato legalmente alla professione).
"Ciò che sappiamo è una goccia, ciò che ignoriamo un oceano!" Isaac Newton. Essendo impossibile tenere a mente l'enorme quantità di informazioni, l'importante è sapere dove ritrovare l'informazione quando questa serve. U. Eco
www.riassuntini.com dove ritrovare l'informazione quando questa serve