You are on page 1of 15

Funzioni Excel standard e personali in ambiente VBA

SOMMARIO
Funzioni Excel standard e personali in ambiente VBA ....................................................................................................1 Premessa: tre opportune distinzioni .............................................1 Funzioni Excel fruibili nel codice VBA e VB....................................2
La libreria di oggetti di Excel..........................................................................................2 Uso delle funzioni Excel in VBA e in Visual Basic standard.............................................4

Funzioni inserite in celle o intervalli, tramite FormulaR1C1 ..........5
Uso delle proprietà Formula e FormulaR1C1..................................................................5 Perché conviene lo stile R1C1 dei riferimenti.................................................................6 La questione della lingua...............................................................................................8 Funzioni italiane e inglesi: tabella di conversione..........................................................8 Funzioni italiane e inglesi: due utili programmi traduttori..............................................9

Funzioni personali inserite in celle o intervalli.............................12
Totali Alterni.................................................................................................................12 Somme diagonali.........................................................................................................13 Media Ponderata..........................................................................................................14 Fuori programma: un esempio di calcolo matriciale....................................................15

Premessa: tre opportune distinzioni
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: a) Funzioni Excel fruibili nel codice VBA; b) Funzioni Excel inseribili in celle o intervalli di un foglio di lavoro; c) Funzioni personalizzate o “d’utente”.

VERT(Cosa. Ebbene non sarà arduo verificare che. con Office 2000). in una routine VBA o nella cella F10 del foglio.000 40. “TabSconti” contenga una tabella di sconti del tipo seguente: Importo 0 10.TabSconti.Indice).000 Sconto% 0.2) Caso c: y = MiaFunz(x) F10=MiaFunz(F9) Si suppone che sia stata creata una certa funzione d’utente MiaFunz. .WorksheetFunction. comprende funzioni del foglio di calcolo richiamabili in una macro VBA. entrambe le istruzioni restituiscono 0. opportune istruzioni . conviene offrire subito esempi relativi a ciascuno dei tre casi predetti: Caso a: y = Application. MiaMatrSconti. i due precedenti esempi illustrano (genericamente) altrettante possibilità d’uso delle MiaFunz. 2) z = Application.Tabella. si digiti. in VBA. Range(TabSconti).00% 2. ma allo scopo di evitare (facili) confusioni.00% 7. supponiamo poi che l’intervallo denominato. sul foglio di lavoro. per la quale si rimanda alla Guida chi non la conoscesse.50% e che gli stessi dati siano stoccati nella matrice VBA MiaMatrSconti.000. accanto alla C5 contenente un dato importo.” . . End Function Ebbene. OLEObject) e relative proprietà. di 3 righe e 4 colonne. Non tutte però.Vlookup è il corrispettivo. nell’Editor VBA: “Application.FormulaR1C1 = "=VLOOKUP(RC[-1].000 100. Funzioni Excel fruibili nel codice VBA e VB La libreria di oggetti di Excel La libreria di oggetti di Microsoft Excel (Microsoft Excel Object Library 9.50% 5. per fissare le idee. 2) Premesso che Application. .Vlookup(x. Per scoprire quali sono.VERT(C5. che sia attiva la cella C6.2)" Supponendo. com’è logico attendersi.TabSconti.Vlookup(x. se putacaso x = 15.In questa trattazione ci occuperemo in qualche dettaglio dei tre casi. .025. Caso b: ActiveCell. diciamo nel Modulo1: Function MiaFunzione(x As Double) As Double . il precedente codice inserisce in C6 la formula seguente: =CERCA. oltre a oggetti propri (quali Worksheet e Range) e incorporati (Shape. della funzione Excel CERCA.

Sum e Application.).ORIZZ DISTRIB. utilizzato in diverse funzioni sul foglio di lavoro. Mancano all’appello funzioni assai particolari (come tutte le ingegneristiche) nonché le funzioni di trattamento testi e quelle di date e orari. In altri termini. che comunque non guastano. Application.Si spalancherà un elenco di tutte e sole le funzioni supportate. citiamone solo alcune. è errato!). serve più che altro a filtrare le funzioni in parola dal mare magnum delle proprietà e metodi dell’oggetto Application. ovviamente.CHI SCEGLI CONTA DB. Delle ultime due non si sente la mancanza. proprietà e metodi!). visto che esistono già nel Visual Basic standard. sparisce in ambito VBA (ovvio: qui il punto funge da basilare separatore di oggetti. con accanto l’equivalente sul foglio di lavoro dell’edizione italiana: Funzione VBA Funzione sul foglio Cos Average ChiTest Choose Count Dcount Dsum Hlookup GammaDist Lookup Rank Round Sum Vlookup COS MEDIA TEST. a titolo di saggio. da solo.  WorksheetFunction è pleonastico. pure nell’edizione italiana (e non si dimentichi che il separatore degli argomenti è la virgola. Il punto (.VERT Significato Coseno Media aritmetica Test per l’indipendenza Scegli da un elenco Conteggio Conteggio su un database Somma su un database Ricerca tabellare orizzontale Distribuzione Gamma Ricerca gabellare (semplice) Posizione di un dato in un elenco Arrotondamento Somma Ricerca gabellare verticale Sono abbastanza immediate le osservazioni riportate qui di seguito.CONTA DB.SOMMA CERCA. La sintassi inglese dell’ambiente VBA si estende alle funzioni Excel. non il punto e virgola).    .WorksheetFunction.GAMMA CERCA RANGO ARROTONDA SOMMA CERCA. Sum. Quest’ultimo invece è obbligatorio. Per brevità.Sum sono equivalenti (ma.

ipotizzando un progetto in cui il calcolo della media ricorre più volte. 2. specie per chi necessita di funzioni speciali come quelle statistiche. Probabilmente molti lettori sono già incappati in questa inattesa quanto frustrante situazione e magari i più esperti.Average(MioVett) End Sub Invece in Visual Basic standard. Così Application. Uso delle funzioni Excel in VBA e in Visual Basic standard Non c’è quasi bisogno di mettere in evidenza la portata di questo ampliamento apportato al Visual Basic dalla libreria delle potenti funzioni Excel. ma altresì: . 2.SPAZI() equivale alla Trim del VB standard. 2. la routine seguente dà errore: Sub ProvaMioArray() MioVett = Array(1. In Excel VBA si ottiene con il semplice (e compatto) codice seguente: Sub ColcolaMedia() MioVett = Array(1. 3. 4. Puntualizziamo ora una regola molto importante.Asc(“A”) che restituisce “A” e non il codice Ascii 65 come la Asc(“A”). 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. Un esempio più terra terra è dato dal pur banale calcolo della media.NOTA – Vi sono alcuni duplicati (da evitare). e si stupisce del fatto che Ubound(MioVett) sia invece accettato nei casi in cui non si invoca una routine. E questo indipendentemente dal fatto che gl’indici di matrice partano da 0 (direttiva default Option Base 0) o da 1 (Option Base 1). già anticipata nel paragrafo d’apertura. 4. 3. 3. 5) For i = 0 To 4 MiaMatr(i) = MioVett(i) Next MsgBox MiaMedia(MiaMatr) End Sub Detto di passaggio. Ma la cosa che più di tutte va sottolineata è che le funzioni di Excel possono essere fruite non solo nel VBA di Excel. C’è poi una strana (e inutile!) Application. sanno perché. Regola.Trim (corrispettivo dell’italiana ANNULLA. 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. si dovrà creare una funzione ad hoc. 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. oltre che dio. Chi scrive no. in ambiente VBA. 5) MsgBox Application. sia agli intervalli sia alle matrici Visual Basic. Le funzioni del foglio di lavoro si applicano. 4.

lo si confessi: non ha la competenza necessaria…) per implementare in proprio certe sofisticate funzioni della cucina Excel conviene passare per questo ricco convento. in VB standard. attivare la Microsoft Excel 9 Object Library. ovviamente. Conviene fare un esempio tipico (ancorché banale assai): B . “Excel. Se le precedenti operazioni sono stata compiute. anteponendo Provare. Formula e FormulaR1C1. nel VBA di Word.. tramite FormulaR1C1 Uso delle proprietà Formula e FormulaR1C1 Nelle applicazioni più professionali è della massima importanza l’utilizzo delle proprietà Value..2.. per convincersene. che nell’uso manuale si estrinseca con la pressione di Ctrl+Invio...Average(1..3. Per fortuna i PC odierni sono sempre più veloci e dotati di memorie molto ampie.”. c) nella macchina dell’utente deve. Funzioni inserite in celle o intervalli. semplicemente. delle controindicazioni: a) la libreria di Excel è piuttosto “pesante”. fa a meno delle complicazioni sintattiche del tipo CreateObject & affini..5) NOTA . e non vanno dimenticate.. vale la seguente Regola . b) le funzioni create direttamente in VB sono più veloci. NOTA . vale a dire in un qualsiasi programma Visual Basic.4.L’inserimento in un sol colpo di un dato o di una formula in un intero intervallo è una peculiarità di Excel.” pur essendo un meccanismo di OLE Automation.” o.. Conclusione: A chi desidera sviluppare applicazioni sofisticate e non ha tempo da perdere (e. aprendo la strada alla creazione di modelli dinamici molto sofisticati. Vi sono però..  in ogni altro ambiente VBA. Esse infatti danno luogo all’inserimento in singole celle o in interi intervalli di costanti o formule qualsiasi. tramite “Excel.WorksheetFunction. nella susseguente finestra. con questa istruzione in ambiente Word VBA: MsgBox Excel. essere installato Excel. Ricordiamo la manovra da compiere.Le funzioni di Excel si possono richiamare “Excel. nell’Editor Visual Basic: 1. di Access ecc. 9 Incremento vendite 1° trimestre 2000 C D E F . dal menu Strumenti scegliere Riferimenti… 2..Si osservi che il richiamo diretto. inoltre è difficile che non sia presente Excel..

Row .Cells(r. già pubblicato in questo stesso sito Microsoft) e la colonna.Cells(1.10 11 12 20 21 Prodotti Marzo Viti Bulloni Dati Coppiglie Dic. e scontate. c tramite Columns.323 992 2. Che vuol dire? R sta per Riga e C per Colonna e ad esempio R[-2]C significa: due righe sopra. glorioso spreadsheet Microsoft oggi defunto.Columns.Copy Destination:= Range(. Infine si sfrutta il metodo Copy che.. determina la riga r..625 1.756 2..Count.End(xlToRight)..Cells(r..850 Gennaio 1. .. NOTA ..894 2.500 1. Se.Row + 1 c = . ma è un esempietto didattico). in senso relativo all’intervallo “Formuline” tramite l’ultima cella della colonna C.200 900 2. ma ci capita troppo spesso che utenti mediamente esperti o persino sedicenti guru VBA usino macro strapiene di metodi Select. nella scheda Generale. da battaglia navale. Opportune.142 . scritta in A3. .260 945 2...389 1.Row .Cells(1. Chi non fosse senza peccato. Perché conviene lo stile R1C1 dei riferimenti La notazione R1C1 dei riferimenti nasce. come sovente accade. 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 = .943 1. diventa =R[-2]C+R[-1]C.Count .. Guida o anche il Manualino introduttivo del qui presente autore.FormulaR1C1 = "=RC[-1]*1. 0).Cells(1.End(xlDown). formule in colonna D e seguenti calcolano un incremento dello 0. 1). funziona “a distanza” e senza selezionare alcunché. Si supponga poi che all’intervallo D11:F11 sia stato preassegnato il frivolo nome “Formuline”. a volte con salti continui anche da foglio a foglio.Row + 1 c = . con argomento Destination. c)). col Multiplan. ha il pregio di inserire soltanto formule. mantenendo però l’R1C1. mentre il metodo Copy copia pure i formati.042 2.05" End With End Sub NOTA . come non tutti sanno.Column + 1 Range(.. stessa colonna.L’uso di FormulaR1C1 oltre che più elegante.Column . provi a fissare per l’appunto lo Stile di riferimento R1C1. Excel ha adottato il più intuitivo stile A1.Cells(1.5% rispetto al mese precedente (dio lo volesse!. Risultato: non solo anche le colonne vengono intestate con numeri. non scagli pietre ma scelga dal menu Strumenti il comando Opzioni… e. .Cells.Non si vorrebbe polemizzare. 0).Cells(0. sempre relativa. ma a nostro avviso lo è ancor più il seguente (lasciato alla commento e alla sperimentazione autogestita): Sub InserimentoDinamico() With Range("Iniform") r = . c)) End With End Sub La precedente routine. storicamente. a sua volta individuata mediante la proprietà End(xlDown) (v. il che spesso complica le cose..End(xlDown).040 Febbraio 1. che quasi sempre si possono tranquillamente evitare! Il procedimento appena visto è valido. 1999 1.. ma una banal formula come =A1+A2. il numero di voci non è dato a priori. 1). 1).

C4. False) & "+ 1". 0)Address(False. Per comprendere la cosa. svela però un’inadeguata flessibilità di tale codice.FormulaR1C1 = "=R[-1]C" In tal modo si evita l’inconveniente appena lamentato perché i riferimenti R[-1]C puntano a una riga sopra. la stessa istruzione ci darà di nuovo C9+1 in E5. colonna m Riga n Colonna m Esempio R3C5 R5C RC4 R5 C6 Equivalente A1 $E$3 A$5 $D1 $5 $F Non esiste Non esiste Non esiste Non esiste Stessa riga e colonna (rif. si pensi che la selezione attuale sia C10:C50.. in C11=C10+1 eccetera. Ma perché adottare lo stile R1C1 in luogo del più semplice A1? Perché il secondo è meno potente e flessibile del primo. Stile RnCm RnC RCm Rn Cm RC Significato Riga n. stessa R[-2]C . di ben diverso significato (e risultato disastroso). troveremmo le formule =$A$1*B2. Con lo stile R1C1 si avrebbe invece: Selection. stessa colonna. e qualche riflessione. Si raggiunge lo scopo.Offset(-1. =$A$1*B1. =$A$1*B4.. e così via. colonna m Riga n. ossia E4. Nel primo caso in C2. Per chiudere coi riferimenti R1C1 riportiamone la casistica sintattica nella tabella che segue. Se C1:C10 è la selezione corrente. stessa colonna Stessa riga .Formula = "=C9+1" La pratica. come stiamo per mostrare. prima di copiarla o consolidarla nella selezione.Cells(1.R[3]C colonna Stessa riga. Ma nella copia e nell'inserimento di formule con Ctrl+Invio i dollari tornano ad avere. =A4*B4.Si provi con Selection. Con la zona predetta va tutto bene: in C10 si ha =C9+1. Infatti spesso Selection sottintende la possibilità di generalizzarlo a qualsiasi intervallo e non solo a quello che inizia in C10. un conto dimenticarsi i dollari e limitarsi a =A1*B1.. però con una diversa selezione. in quanto Range("B1:F20"). NOTA . C3. nel secondo si avrebbero le formule =A2*B2. =$A$1*B3. una serie identica all'altra. la formula =C9+1 atta a creare una serie progressiva di valore iniziale (variabile) posto in C9. un conto è scrivere in C1. putacaso E5:E11.. L’istruzione seguente può soddisfare tale requisito: Selection. Range("$B$1:$F$20") o Range("$B1:$F20") individuano il medesimo intervallo. 1).Formula = "=" & Selection. RC circolare) Scarto di n righe. mentre ne avremmo voluto una che dipendesse dal valore nella cella sovrastante E5.Osserviamo poi che i simboli $ che contrassegnano i riferimenti assoluti ($A$1) o misti ($A1 e A$11) non contano in molte istruzioni VBA. C10+1 in E6.R[-1]C colonne Scarto di colonne n righe e m R[2]C[-2] R[n]C RC[m] R[n]C[m] .. corso legale.. ma al prezzo di concatenamenti astuti ma laboriosi (specie con formule meno stupide!). a che C10 sia la cella attiva e di voler inserire in tale intervallo.. scarto di m R[2]C ... Peggio ancora vanno le cose se si vuol passare un oggetto Range come argomento di una routine. =A3*B3..

e sicuramente la maggioranza degli utenti lo trova prima o poi da solo: 1. data la superiore flessibilità della notazione R1C1. Una particolarità per i più abili e curiosi. Funzionano entrambe.Bold = True. Si provi con Range("B12") = "=RAND()" o con Cells(3. 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.R1C1:R[9] C Zona con cella 1 fissa. che pertanto è caldamente consigliato!. Da questa quasi perfetta virtù poliglotta (*) emerge però la difficoltà derivante dalle sintassi inglesi delle funzioni Excel? Si e no. con Excel 97 e 2000. attivare il Registratore delle macro. 4) = "=R[1]C+1". Ma la scelta Microsoft è pienamente giustificata. in francese o tedesco ecc. 2 =SOMMA(R1C1:R[9]C) scartata =SOMMA($A$1:A10) Si fa notare che talune equivalenze sono imperfette. Non così con Selection. una formula come la seguente è errata: Range(“A1”). La distinzione tra le proprietà FormulaR1C1 Formula e Value è solo formale e si può constatare. modelli con macro italiane vengono tradotte automaticamente al caricamento.Font. . scrivere: Range(“A1”). NOTA (*) – Le poche eccezioni hanno a che fare con stringhe italiane relative a talune finestre di dialogo. in quanto Excel tramuta in formula ogni stringa che inizia con =. La conseguenza.FormulaR1C1 = "=SOMMA(R1C1:R10C1)” Si deve.Font. La questione della lingua Nelle ultime edizioni del Visual Basic per applicazioni Microsoft ha definitivamente abbandonato le codifiche “localizzate”.Motivo = xlContinuo Fine Con Per fortuna. Ad esempio Selection. ad esempio. invece.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 possesso della propria edizione nazionale).ZonaCorrente . vengono inserite a beneficio di colleghi stranieri. persino: Value = "=R[-2]C+R[-1]C" L’inserimento di formule può addirittura far a meno tanto di Formula che di FormulaR1C1..FontStyle = "Grassetto". per il discorso che stiamo facendo. 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.IndiceColore = 6 . per essere il VBA rigorosamente e pienamente anglofono. Funzioni italiane e inglesi: tabella di conversione Ma come si fa a conoscere la sintassi inglese delle innumerevoli funzione del vasto repertorio Excel? A onor del vero un espediente c’è. Magari creando qualche iniziale malumore negli utenti italiani che avevano sudato con macro del tipo seguente: Con CellaAttiva. è che.

Basta caricarlo in Excel e fare clic sul pulsante “Traduttore” o sulla WordArt. Per ovviare all’inconveniente. comprendente quasi tutte le funzioni italiane di Excel con. interrompere il Registratore.xls. ad esempio “=MEDIA(A1:A10)”.xls FunzioniItaliane_Inglesi. 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. E il piacere di avere sottomano una tabella completa. per la consultazione. a beneficio anzitutto di se stesso. nel primo foglio.2. fra loro correlati:   TraduttoreFunzioni. Lo scopo di questo primo traduttore è subito visto.csv Il secondo è in formato CSV (Comma Separated Values) e. Si troverà qualcosa come: ActiveCell. Sì. 3. essa è reperibile nel file seguente: FunzioniItaliane_inglesi. si dirà.xls Nel quale sono riportate. Il primo risultato di tali sforzi si trova nei file seguenti. immettere in una cella qualsiasi la funzione desiderata. a fianco le equivalenti inglesi e descrizioni sintetiche sul significato di ciascuna. entrambe le funzioni e relative spiegazioni. poi portarsi nell’Editor Visual Basic e spulciare la Macro1 nel Modulo1 da esso creata. Per farla breve. mentre gli altri tre riportano solo le italiane. digitandola in italiano. Funzioni italiane e inglesi: due utili programmi traduttori Il file predetto è di immediata e agevole consultazione. dove lo mettiamo? Purtroppo si tenterebbe invano di reperire tale tabella nella Guida. ma che scomodità. sfruttando codice Visual Basic. le inglesi e le spiegazioni.FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)" E il gioco è fatto. Compare l’inequivocabile finestra di dialogo seguente: . come avverte la macro d’avvio del primo occorre assolutamente che si trovi nella medesima directory di TraduttoreFunzioni. ma in seguito abbiamo pensato di fare di più.

txt FunzioniInglesi. di ovvio significato.exe FunzioniItaliane. anche qui tutti tassativamente da collocare in una medesima cartella di file:     TraduttFunzioniExcel.Se però si fa clic sul pulsante “Copia  Appunti” l’utente è avvertito che questa funzionalità non la si è potuta implementare in VBA. In questo caso è possibile utilizzare il piccolo Traduttore direttamente nell’Editor Visual Basic di Excel: . Se non altro. Corrisponde ai seguenti 4 file. permettono a chi vuole di correggere eventuali errori e/o di modificare le spiegazioni a suo gusto.txt I vari archivi .txt sono testi puri separati.txt Spiegazioni.EXE. 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. ha realizzato in Visual Basic 6 l’equivalente utility . preso il coraggio a quattro mani.

Private Sub UserForm_Initialize() Dim MioRec As String.. Oltretutto sono abbastanza avanzate.Ecco le manovre da compiere: 1. A questo punto ci manca lo spazio per commentare le routine contenute nella cartella di lavoro TraduttoreFunzioni. Dato & ".xls. i As Integer.ListIndex = 0 End Sub La precedente Sub.csv" For Input As #1 i = 0 While Not EOF(1) Line Input #1.exe. 1) ReDim Preserve FunzionIngl_Spiegaz(i) FunzionIngl_Spiegaz(i) = MioRec i = i + 1 Wend Close #1 ListBox1. portarsi nell’Editor VBA digitando il codice tipo FormulaR1C1 ecc. con scarni commenti a beneficio dei più esperti. n .csv n = InStr(1. lanciare l’utility.. MioRec. in modo da sovrapporla all’Editor.xls.") Dato = Left(MioRec.Path & "\" ListBox1. i cui algoritmi sono suppergiù simili a quelli adottati nell’utility TraduttFunzioniExcel. ". che agisce al caricamento della UserForm. Open p & "FunzioniItaliane_Inglesi. 3. ossia TraduttoreFunzioni.. "". esordisce ponendo in p il percorso completo in cui si trova ThisWorkbook. dare un clic sul pulsante “Copia  Appunti”. Dato As String. selezionare la funzione italiana desiderata. poi di nuovo attivare l’utility (con Alt+Tab). n As Integer p = ThisWorkbook. Tale percorso è dato dalla proprietà Path.AddItem Dato MioRec = Replace(MioRec. 1. MioRec ‘pone successivamente in MioRec le righe del file . . 5.1) ListBox1. Comunque riportiamo qui di seguito una macro cruciale.". al quale va concatena la barra inversa “\”.Clear 'Forse qui è superfluo. nell’Editor premere Ctrl+V incollando la funzione inglese nel punto d’inserzione corrente. 2. 4.

come per qualsiasi altro VBA). “sono di casa”. molto spesso le funzioni per foglio di lavoro hanno come argomenti degli oggetti Range.xls. Al termine di questo articolo ci limitiamo a proporre tre esempi semplici ma pratici. Questi vettori. ponendo il primo nella lista delle funzioni italiane (ListBox1) e gli altri due nei vettori FunzionIngl_Spiegaz(i) e FunzionIngl_Spiegaz(i).In tal modo la successiva Open è in gradi di aprire il file .XLS possono tradursi in aggiunte (di estensione XLA). .xls. e il discorso vale per il VB standard. come anche si dice. Gli esempi in questione possono essere fruiti e sperimentati nel file seguente: Prime funzioni personali. Ma la peculiarità di Excel sta nel fatto che le funzioni d’utente si aggiungono alle normali funzioni Excel. sono visibili in tutta la UserForm (essendo definiti a livello modulo)."). in un caso della vita. A condizione che qualche anima buona gliel’abbia già preparate. Totali Alterni La figura che segue pone in drammatica evidenza come possa nascere.csv. NOTA . Circa le modalità per crearsi un’aggiunta si rimanda alla Guida. ergo possono essere utilizzate anche da utente finale su un foglio di lavoro.Com’è abbastanza logico attendersi. oltre che essere inserite nella cartella PERSONAL. Il successivo ciclo While… Wend provvede. Funzioni personali inserite in celle o intervalli Fin dalle origini il superfoglio Microsoft si è distinto dai rivali per la possibilità di creare funzioni personalizzate o. 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. Queste sono utili in primo luogo nell'ambito del codice Visual Basic (ove. il cui nome spiega tutto.csv a condizione che esso si trovi nella medesima directory del file . Librerie di funzioni d’uso ricorrente. ovviamente. l’esigenza della prima funzione proposta. funzioni d’utente. per così dire. riservandoci di approfondire il discorso sulle funzioni personali in un periodo successivo. a isolarne i tre campi (separati dal “. per ciascun record del file .

figura precedente). . Di qui l’idea di creare una funzione d’utente capace di comportarsi come la ben nota SOMMA(). 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. e grazie all’aggiustamento automatico dei riferimenti può essere copiata da L in M o inserita con Ctrl+Invio in L6:M22 in un sol colpo. È 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 . b) Se proprio occorre ciascuno può crearsi una funzione che somma le celle pari.In casi del genere gli utenti si arrangiano con formule di addizione. ma totalizzando solo le celle dispari.Count Step 2 SommaAlterna = SommaAlterna + . colonne e delle due diagonali sono uguali. Somme diagonali Queste somme diagonali nascono da uno sfizio del qui presente autore. sempre con Step 2. NOTA . che somma le celle dispari. che si è voluto cimentare coi quadrati magici realizzati su un foglio Excel.Cells(i) Next End With End Function Due sole osservazioni: a) la predetta funzione. va bene sia in colonna L che in colonna M (v.I quadrati magici di cui si parla contengono numeri da 1 a n^2 disposti in modo che le somme di tutte le righe. basta far girare i a partire da 2.

Cells(1. Regola .1 Next End Function Coloro poi non disdegnano siffatte frivolezze possono dare un’occhiata al foglio di lavoro Somme diagonali esplorandone le varie formule. che restituisce VERO o FALSO a seconda se Quad è magico o meno. più semplicemente. Media Ponderata Nella figura che segue è mostrata la parte bassa del solito modello. Function SommaDiagDisc(ZonaQuadrata As Range) Dim NumRig As Integer NumRig = ZonaQuadrata.Alle celle degli oggetti Range si può accedere tramite la proprietà Cells o. . Range(“A1:C5”).  Entrambe visibili nel Modulo1 della cartella . 2) equivale a Range(“A1:C5”)(1. senza commentarle. Sicché ad es. non si sa mai.xls di cui stiamo parlando. tramite indici. salvo ricordare una regola importante (e non a tutti nota…). ossia:  SommaDiagonale(ZonaQuadrata As Range. sulla destra con la funzione d’utente MediaPond(). Sulla sinistra.Count k = NumRig For i = 1 To NumRig SommaDiagAsc = SommaDiagAsc + ZonaQuadrata(i.Rows. esso viene svolto mediante formule normali. EstQuadratoMagico(Quad As Range).Count For i = 1 To NumRig SommaDiagDisc = SommaDiagDisc + ZonaQuadrata(i. k) k = k . Le riportiamo qui sotto.Comunque queste somme lungo le diagonali di un intervallo quadrato possono servire altrove. Discendente As Boolean) una funzione ibrida delle precedenti due. 2) (che è più elegante). i) Next End Function Function SommaDiagAsc(ZonaQuadrata As Range) Dim NumRig As Integer NumRig = ZonaQuadrata. E ad essi sono dedicate due funzioni più sofistiche. Vi si illustra come può nascere l’esigenza del calcolo di una media ponderata.Rows.

Ricordiamo solo che vanno inserite mediante Maiusc+Ctrl+Invio. basata sulle potenti. per forza. anche alla funzione MATR. Fuori programma: un esempio di calcolo matriciale Nel calcolo “tradizionale” della media ponderale si è ricorsi. dobbiamo rimandare alla Guida. che pochi utenti conoscono e per le quali ora. Nella fattispecie. in E33. SommaProd As Double.Count SommaProd = SommaProd + ZonaValori(i) * ZonaPesi(i) SommaPesi = SommaPesi + ZonaPesi(i) Next MediaPond = SommaProd / SommaPesi End Function Neanche qui dovrebbero necessitare commenti. ZonaPesi(i) equivale .Riproduciamo subito la funzione personale: Function MediaPond(ZonaValori As Range. che calcola la somma dei prodotti. termine a termine. Ma qui vogliamo privilegiare un’altra soluzione.PRODOTTO(). viene calcolata la somma dei prodotti. . a enfatizzarne la speciale natura matriciale. ZonaPesi As Range) Dim i As Integer. delle due zone D28:D30 ed E28:E30. calcoli la media ponderata =F31/SOMMA(D28:D30) In modo tradizionale-sì-ma-grazioso.Cell(i). E così tutti capiscono come mai la formula seguente. SommaPesi As Double For i = 1 To ZonaValori. nel modello. Perché ne parliamo qui? Ma perché nella cella F31 (v. 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. di due o più vettori.SOMMA. salvo forse ribadire l’accesso indicizzato a un oggetto Range (ad es. bellissime funzioni matriciali di Excel. termine a termine. “Spese d’acquisto”.ma è più bello – a ZonaPesi. circondata da graffe. “{“ e “}”. nella barra della formula.