Office (VBA e dintorni)

Tutto quel che riguarda VBA di Microsoft Office

Reinventiamo il word processor

Un pezzo di codice divertente, senza alcuna utilità pratica... rispolverato dai meandri dei miei archivi, frutto di un passatempo di diverso tempo fa. Una funzione che fa niente di particolare: riceve in input un testo e un margine (in numero di caratteri), quindi restituisce il testo formattato in modo da rispettare i margini indicati. E' possibile specificare l'allineamento (bandiera a sinistra, a destra, al centro o giustificato) e la presenza o meno del righello e dei margini (per default viene disegnato un piccolo righello orizzontale che ricorda quello di Wordstar). L'allineamento default è quello giustificato, che riempie le parole di spazi per...

Chi conta davvero

Ogni tanto nasce l'esigenza di contare, è più forte di noi :) Tempo fa mi sono scritto in fretta e furia un frammento di codice che recupera le occorrenze di una stringa all'interno di un'altra stringa e non mi son mai preoccupato di testarlo seriamente. Per caso ieri ho scoperto che quella semplice routine funziona bene se deve cercare singoli caratteri all'interno di una stringa; ad esempio conta("pipppo", "p") restituisce 4. Ma sbaglia piuttosto grossolanamente in fase di ricerca di gruppi di lettere perchè prima raggruppa le sottostringhe e poi restituisce il numero dei gruppi. Così ad esempio conta("1111", "11")...

La giusta forma per le stringhe, reloaded

Quasi un anno fa proponevo (clicca qui per leggere il post) una semplice soluzione per simulare il comportamento di certe funzioni di output di altri linguaggi, le quali permettono di inserire dei segnaposto nella stringa di input che vengono riempiti (per posizione o per nome) dal contenuto delle variabili passate in argomento. Suggerisco qui alcune modifiche a quella funzioncina per superare alcuni limiti. Ora si possono usare segnaposto vuoti, che vengono riempiti in automatico, e si può forzare l'ordine di presentazione dei parametri passati alla funzione indicandoli nei segnaposto numerici. Ad esempio: print_format("{} {} {}", "a", "b", "c") ---> "a b c" print_format("{2} {1} {0}",...

Giovani e vecchi manager

Una semplice versione di un "ini manager"... Finalmente ne ho avuto bisogno pure io! Senza ricorrere a classi o artifici strani di manipolazione stringhe, prendo l'idea di Scott Lylerly e la faccio mia con qualche piccolo aggiustamento :) L'utilizzo è davvero semplice: ini_manager ("r|w", "section", "key", <"value">) dove "r" sta per read e "w" sta per write, quindi con una sola chiamata decido quale azione intraprendere (se in lettura o in scrittura). Il codice poi effettua a un certo punto una chiamata ricorsiva a se stesso che ho voluto inserire (naturalmente si può modificare questo punto) per sollevare errore se in modalità scrittura la...

La giusta forma per le stringhe

Diciamo che l'idea è nata abbastanza per caso. Smanettando con altri linguaggi è facile notare che ci sono alcune facilitazioni per la formattazione delle stringhe, mediante l'uso sapiente di placeholders e modificatori si possono realizzare formattazioni pregevoli delle stringhe in output che agevolano sicuramente il debug o la presentazione coerente dei dati. MI vengono in mente le convenzioni di formattazione delle stringhe di python, Java, C#, C++, .Net e chissà quanti altri linguaggi evoluti offrono questa posisbilità... ma non VBA! Allora ho deciso di costruirmi la mia semplice funzioncina personalizzata :) E' talmente semplice che non prevede l'uso di modificatori o quantificatori, per...

Per la precisione!

La funzione Timer() è accurata solo fino a circa 55 millisecondi... ecco qui un'idea del solito grande Francesco Balena per ottenere un benchmark accurato al singolo millisecondo! Option Explicit Private Type SMPTE hour As Byte min As Byte sec As Byte frame As Byte fps As Byte dummy As Byte pad(2) As Byte End Type Private Type MMTIME wType As Long units As Long smpteVal As SMPTE songPtrPos As Long End Type Private...

Stampe d'autore

In Excel alcune volte mi è capitato di dover impostare, anche temporaneamente, una stampante diversa da quella predefinita... Application.ActivePrinter è piuttosto ostico nell'impostazione di questa proprietà perchè bisogna conoscere esattamente sia il nome della stampante desiderata sia la locazione (es. "su Ne01:" per una stampante di rete nelle versioni Excel localizzate in italiano). Ecco quindi un metodo che sfrutta un paio di API per aggirare l'ostacolo. Il codice seguente va incollato in un modulo; per avviarlo si esegue la sub Main. La procedura presenta in una inputbox l'elenco delle stampanti installate nel sistema (non elenca quella già predefinita), numerate da 1 in poi;...

Il suono delle cose

Ogni cosa ha un suono... anche i nomi :) e questo può tornare utile soprattutto nelle ricerche. In questo breve post vi illustro una mia versione di Soundex. Soundex è un algoritmo di fonetica per l’indicizzazione di parole secondo il loro suono o pronuncia. Nato essenzialmente per la pronuncia inglese, può essere trasportato in altre lingue come l’italiano. L’obiettivo è di poter raggruppare parole omofone (dal suono simile) affinché possano essere abbinate per un ricerca veloce, nonostante differenze o errori di ortografia. In un database di prodotti, la ricerca di "MATITA" troverà corrispondenze con "MATITA" e "MATITE", ma anche con "MATTITA"....

Excel. Generatore di password causali

Dopo molto tempo, torno a scrivere qualcosa su questo blog, l'argomento è più che altro il soddisfacimento di una curiosità intellettuale. Stavo cercando di distribuire una piccola applicazione Access ad un numero finito di utenti, e pensavo di tenere sotto controllo gli accessi con la semplice attribuzione di una password predeterminata e non modificabile. Invece di inventarmi password astruse, ho chiesto aiuto ad Excel per generarne alcune in automatico. E già che c'ero (l'appetito vien mangiando) ho pensato di creare una funzione più generica :) Googlando (sono vecchio ma mi devo abituare ai neologismi!) ho trovato un articolo datato ma interessante, da cui...

Parole, parole, parole... il Contastorie

E' un problema ricorrente, quello di contare gli elementi uguali in un insieme. Anche recentemente è passato in Lista una argomento analogo. Così mi sono messo d'impegno e ne è nata una Classe che, con pur impegno didattico, vuole giocare un pochino con le parole di una frase; si tratta di una collection class che, correttamente istanziata, permette di contare il numero di parole presenti nella frase e di stabilire quale sia la parola più lunga o quella più corta. La Classe WordsCollectionClass è degna di ulteriori migliorie, naturalmente, e ciascuno - dopo aver copincollato il codice sorgente che trovate cliccando sul...

VBA. Hora fugit (chi ha tempo non aspetti tempo)

Al giorno d'oggi siamo sempre tutti di corsa, sempre affaccendati, sempre ridotti all'ultimo (come per il regalo di Natale). Prendiamoci quindi un po' di tempo e vediamo come funziona la gestione dei timer in ambiente Office. Il tempo è danaroVBA non mette a disposizione i controlli Timer. Ogni applicativo Office quindi, per gestire lo scorrere dell'inesorabile Ruota, si arrangia come può; ad esempio con un gestore OnTime dei rispettivi oggetti Application (Excel e Word), o con la proprietà AdvanceTime dell'oggetto SlideShowTransition (PowerPoint). Per Access esiste l'evento Timer delle maschere; Outlook invece non mette a disposizione alcun metodo specifico. In Word: Application.OnTime(When, Name,...

Excel. Valutazioni personali

Con questo post vi illustro come realizzare una semplice funzione definita dall'utente senza utilizzare codice VBA e che sfrutta il concetto del metodo Evaluate, per valutare l'espressione passata come argomento.Riprendo e "italianizzo" l'idea di un certo David Hager in un post di qualche anno fa (lo trovate, se vi interessa, a questo indirizzo ). PremessaLa funzione si occuperà di valutare un'espressione, così come inserita nella cella alla propria immediata sinistra, restituendo il valore numerico risultante dalla valutazione dell'espressione.Complicato? un esempio aiuterà a chiarire meglio.Questa funzione ci consentirà di sommare i valori presenti in una cella mostrando il valore risultante dalla...

VBA - Facciamo le pulizie

Antefatto Qualche settimana fa inviai alla Redazione di VB Tips & Tricks una piccola funzione, che ha il nobile e utile scopo di estrarre da una stringa i soli caratteri alfabetici (o solo i numerici). La funzioncina è stata pubblicata nella sezione Tips del sito, con le correzioni e le migliorie suggerite anche da Luciano Bastianello. Il titolo della Tips è (appunto) Estrarre solo le cifre o le lettere contenute in una stringa (2)" e si trova, oltre che nell'elenco delle recenti, anche nella sezione "Stringhe - Numeri - Date". Mi sono deciso ad estendere le funzionalità del codice prodotto; avevo bisogno...

Excel: commenti lusinghieri

h1 { color: black; font-size: 12pt; font-family: courier new; background: silver; } Commenti a (s)proposito Commenti nascosti Oggi ho avuto a che fare con i "commenti" nelle celle di Excel. Spesso me ne dimentico, ma i "commenti" di Excel sono degli oggetti, quindi un'istruzione come [a3].Comment.Text non produce errore se nella cella [a3] c'è un commento, ma produce un bell'errore di runtime 91 ("Variabile oggetto o variabile del blocco With non impostata") se il commento non esiste. Dicevo che spesso me ne dimentico, soprattutto perchè non mastico commenti di Excel tutti i giorni :o) Così oggi ho sprecato mezza giornata per trovare causa e rimedio dell'errore (vabbè,...

Excel sulla via di Damasco, ovvero: conversioni lungo la via

L'idea (alquanto bizzarra, lo confesso) mi è venuta leggendo un post di Gianni Giaccaglini, apparso nel suo Blog su ShareOffice. Il tema trattato riguardava la conversione di numeri, scritti in lettere, in numeri scritti in cifre e viceversa. Di funzioni del primo tipo ne esistono diverse, l'argomento è passato anche qui su VB-T&T e io stesso mi sono fatto la mia funzioncina che, inserito un numero (ad esempio 401), lo traduce in modo letterale (per ottenere il "quattrocentouno" dell'esempio). Leggermente più complicato è il discorso inverso; sul Blog di Giaccaglini sono comparse un paio di soluzioni che io però ho...

Word, VBA e Collection Class. Anche VBA ha gli attributi (nascosti)

VBA è il "parente povero" di Visual Basic 6, perchè ha qualche marcia in meno. Ma qualche risultato decente, in termini di produttività spicciola, lo si può raggiungere lo stesso... Un giorno mi posi il problema di capire le "Collection class". Queste sono classi particolari che avvolgono un oggetto Collection, mantenendone i riferimenti all'interno della classe che li avvolge, e ne espongono proprietà e metodi con un'interfaccia simile, in modo che il codice creda di avere a che fare davvero con una Collection.   Implementai quindi una Collection Class in un mio piccolo modello Word...