Funzioni Excel applicate a tabelle Word!
(V. anche http://blog.shareoffice.it/giannigiaccaglini/articles/4915.aspx)
Questa notizia, ne sono certo, sorprenderà moltissima gente. In verità sto per svelare un segreto a me noto da tempo ma che di cui solo ora mi sono messo a studiare le potenzialità applicative.
Ma ecco il segreto, tradotto in passi da compiere.
- Portarsi nell’Editor VBA con Alt+F11.
- Dal menu Strumenti lanciare Riferimenti…, e nel successivo elenco scegliere Microsoft Excel Library 11.0 (o precedente).
- In un qualche Modulo VBA, anzi addirittura nella finestra Immediata (Ctrl+G) digitare:
?Excel.WorksheetFunction.Sum(1,2,3,4)
- Premere Invio, ottenendo il valore 10.
Le persone riflessive al passo 3 scoprono che dopo “…WorksheetFunction.” Accanto al punto l’intellisense fa sbucare molte ben note funzioni excelliane (in sintassi inglese, ahimé). Subito dopo gli stessi raziocinanti soggetti si pongono la seguente
Domanda: fusse che fusse che funzioni relative a intervalli si applichino pure, perlomeno, a colonne o righe di tabelle Word?
Purtroppo la risposta è negativa, com’era da attendere. Questi esempi sono sufficiente a disilludere gli ottimisti:
'Imposta una colonna come un’altra della tabella 1
Set Col = ThisDocument.Tables(1).Columns(2)
MsgBox Excel.WorksheetFunction.Sum(Col) 'NON funziona...
MsgBox Excel.WorksheetFunction.Sum(Col.Cells) 'NON funziona...
Ma una scappatoia c’è:
Regola. Le funzioni Excel relative a intervalli si applicano anche alle matrici VB. Buono a sapersi!
Ed ecco subito l’esempio che prova la validità di tale utile regoletta:
MsgBox Excel.WorksheetFunction.Sum(Array(1, 2, 3, 4)) 'FUNZIONA!
Chi ha capito l’antifona ora non ha difficoltà a comprendere questo codice “spericolato”:
Sub FunzioneSumPerTabellaWord()
'Esempio relativo a 3 celle di una data colonna
Dim Col As Column
Set Col = ThisDocument.Tables(1).Columns(2)
MsgBox Excel.WorksheetFunction.Sum( _
Array(Val(Col.Cells(1).Range.Text), Val(Col.Cells(2).Range.Text)))
End Sub
La non flessibilità di tale esempio non merita discussione, vediamo dunque qualcosa di più “adattativo”:
Sub FunzioneSumPerTabellaWord()
'Esempio relativo a una data colonna, ma di numero celle qualsiasi
Dim Col As Column, C As Cell
Set Col = ThisDocument.Tables(1).Columns(2)
Dim X() As Double 'Definisci matrice dinamica
For Each C In Col.Cells
ReDim Preserve X(i)
X(i) = Val(C.Range.Text)
i = i + 1
Next
MsgBox Excel.WorksheetFunction.Sum(X)
End Sub
Mi rivolgo a chi mastica decentemente non solo il VBA ma il VB standard, ergo sa cosa sono le matrici dinamiche. Costoro non avranno difficoltà a rendersi conto che l’appena esposta Sub registra i dati di ogni cella di quella tal colonna, convertiti in numeri dalla funzione Val, nella matrice X, alla quale subito dopo si applica la funzione Excel Sum. In virtù della (preziosa) Regola anzidetta.
Infine propongo una semplice funzione, avente per argomento una qualsiasi colonna di tabella Word:
Sub Sommatoria(Col As Column)
Dim C As Cell
Dim X() As Double 'Definisci matrice dinamica
For Each C In Col.Cells
ReDim Preserve X(i)
X(i) = Val(C.Range.Text)
i = i + 1
Next
Sommatoria = Excel.WorksheetFunction.Sum(X)
End Sub
Analoghe Function si possono definire per altre funzioni Excel, come la Average (Media aritmetica).
Qualcuno a questo punto salterà su obiettando: ma non è molto più semplice quest’altra funzione?:
Sub SommaNormale(Col As Column)
Dim C As Cell, S As Double
For Each C In Col.Cells
S = S + Val(C.Range.Text)
Next
Sommatoria = S
End Sub
Certamente, anzi è pure più veloce. Tuttavia se vogliamo sfruttare le funzioni più pregiate del vasto repertorio Excel la più cervellotica Sommatoria di cui sopra suggerisce una strada, che conviene percorrere. Non vi pare?
[ Un esempio potrebbe essere dato dalle funzioni di ricerca tabellare, quale
Lookup e compagnia bella, ma non vanno certo disprezzate le numerose funzioni che non agiscono su colonne, righe o tabelle ma su singoli valori (posti, magari, su
celle di una tabella Word.), come quelle per calcolare interessi composti, ammortamenti,
scaglioni Irpef (!) e simili: commercialisti & C. aguzzate le orecchie... ]
?>