Excel funzioni in ambiente VBA

Excel funzioni in ambiente VBA

 

 

 

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 funzioni in ambiente VBA

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:

  • Funzioni Excel fruibili nel codice VBA;
  • Funzioni Excel inseribili in celle o intervalli di un foglio di lavoro;
  • Funzioni personalizzate o “d’utente”.

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.

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, 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.

  • WorksheetFunction è pleonastico, serve più che altro a filtrare le funzioni in parola dal mare magnum delle proprietà e metodi dell’oggetto Application. Quest’ultimo invece è obbligatorio.
    In altri termini,
    Application.WorksheetFunction.Sum e Application.Sum sono equivalenti (ma, ovviamente,
    Sum,da solo, è errato!).
  • La sintassi inglese dell’ambiente VBA si estende alle funzioni Excel, pure nell’edizione italiana (e non si dimentichi che il separatore degli argomenti è la virgola, non il punto e virgola).
  • Il punto (.), utilizzato in diverse funzioni sul foglio di lavoro, sparisce in ambito VBA (ovvio: qui il punto funge da basilare separatore di oggetti, proprietà e metodi!).
  • Mancano all’appello funzioni assai particolari (come tutte le ingegneristiche) nonché le funzioni di trattamento testi e quelle di date e orari. Delle ultime due non si sente la mancanza, visto che esistono già nel Visual Basic standard.

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).

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, 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ì:

  • in ogni altro ambiente VBA, nel VBA di Word, di Access ecc.;
  • in VB standard, vale a dire in un qualsiasi programma Visual Basic.

Ricordiamo la manovra da compiere, nell’Editor Visual Basic:

  • dal menu Strumenti scegliere Riferimenti…
  • nella susseguente finestra, attivare la Microsoft Excel 9 Object Library.

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)


NOTA - Si osservi che il richiamo diretto, tramite “Excel.” pur essendo un meccanismo di OLE Automation, fa a meno delle complicazioni sintattiche del tipo CreateObject & affini.

Vi sono però, e non vanno dimenticate, delle controindicazioni:

  • la libreria di Excel è piuttosto “pesante”;
  • le funzioni create direttamente in VB sono più veloci;
  • nella macchina dell’utente deve, ovviamente, essere installato Excel.

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.

Funzioni inserite in celle o intervalli, tramite FormulaR1C1

Uso delle proprietà Formula e FormulaR1C1

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.


NOTA - L’inserimento in un sol colpo di un dato o di una formula in un intero intervallo è una peculiarità di Excel, che nell’uso manuale si estrinseca con la pressione di Ctrl+Invio.

Conviene fare un esempio tipico (ancorché banale assai):


B                        C                        D                   E                      F                        

. . . . . . . . . . . .
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é.


NOTA - Non si vorrebbe polemizzare, ma ci capita troppo spesso che utenti mediamente esperti o persino sedicenti guru VBA usino macro strapiene di metodi Select, a volte con salti continui anche da foglio a foglio, che quasi sempre si possono tranquillamente evitare!

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


NOTA - L’uso di FormulaR1C1 oltre che più elegante, ha il pregio di inserire soltanto formule, mentre il metodo Copy copia pure i formati, il che spesso complica le cose.

Perché conviene lo stile R1C1 dei riferimenti

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.


NOTA - Si provi con Selection.Formula = "=" & Selection.Cells(1, 1).Offset(-1, 0)Address(False, False) & "+ 1". Si raggiunge lo scopo, ma al prezzo di concatenamenti astuti ma laboriosi (specie con formule meno stupide!).

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 =.

La questione della lingua

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.


NOTA (*) – Le poche eccezioni hanno a che fare con stringhe italiane relative a talune finestre di dialogo. Ad esempio Selection.Font.FontStyle = "Grassetto". Non così con Selection.Font.Bold = True, che pertanto è caldamente consigliato!.

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’è, e sicuramente la maggioranza degli utenti lo trova prima o poi da solo:

  • attivare il Registratore delle macro;
  • immettere in una cella qualsiasi la funzione desiderata, digitandola in italiano, ad esempio “=MEDIA(A1:A10)”;
  • interrompere il Registratore, poi portarsi nell’Editor Visual Basic e spulciare la Macro1 nel Modulo1 da esso creata.

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.

Funzioni italiane e inglesi: due utili programmi traduttori

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:

  • TraduttoreFunzioni.xls
  • FunzioniItaliane_Inglesi.csv

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:

  • TraduttFunzioniExcel.exe
  • FunzioniItaliane.txt
  • FunzioniInglesi.txt
  • Spiegazioni.txt

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:

  • lanciare l’utility;
  • portarsi nell’Editor VBA digitando il codice tipo FormulaR1C1 ecc., poi di nuovo attivare l’utility (con Alt+Tab), in modo da sovrapporla all’Editor;
  • selezionare la funzione italiana desiderata;
  • dare un clic sul pulsante “Copia à Appunti”;
  • nell’Editor premere Ctrl+V incollando la funzione inglese nel punto d’inserzione corrente.

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.

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, 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.


NOTA - Com’è abbastanza logico attendersi, molto spesso le funzioni per foglio di lavoro hanno come argomenti degli oggetti Range.

Totali Alterni

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:

  • la predetta funzione, che somma le celle dispari, va bene sia in colonna L che in colonna M (v. figura precedente), 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;
  • Se proprio occorre ciascuno può crearsi una funzione che somma le celle pari, basta far girare i a partire da 2, sempre con Step 2.

Somme diagonali

Queste somme diagonali nascono da uno sfizio del qui presente autore, che si è voluto cimentare coi quadrati magici realizzati su un foglio Excel.


NOTA - I quadrati magici di cui si parla contengono numeri da 1 a n^2 disposti in modo che le somme di tutte le righe, colonne e delle due diagonali sono uguali.

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:

  • SommaDiagonale(ZonaQuadrata As Range, Discendente As Boolean) una funzione ibrida delle precedenti due;
  • EstQuadratoMagico(Quad As Range), che restituisce VERO o FALSO a seconda se Quad è magico o meno.

Entrambe visibili nel Modulo1 della cartella .xls di cui stiamo parlando.

Media Ponderata

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).

Fuori programma: un esempio di calcolo matriciale

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.

 

Excel funzioni in ambiente VBA

 

 

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 funzioni in ambiente VBA

 

"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

 

Argomenti

Termini d' uso, cookies e privacy

Contatti

Cerca nel sito

 

 

Excel funzioni in ambiente VBA