Separare gli indirizzi su Excel con VBA
Negli ultimi tempi mi è capitato spesso di dover lavorare su basi di dati con anagrafiche, le cui tabelle erano suddivise in campi organizzati diversamente da come mi sarebbe servito.
Uno dei casi che mi ha dato da pensare è stato dover migrare i dati da una tabella con l’indirizzo intero (toponimo, via, civico, estensione) in un unico campo, ad una con civico ed estensione in un campo separato rispetto a toponimo e via.
La soluzione che ho trovato è l’utilizzo di due funzioni, scritte in VBA, che separano le due parti seguendo la logica per cui la prima parola che inizia con un carattere numerico fa da sparti acque. Il limite è che indirizzi come “Via 8 Marzo 36 Sc.B” non vengono separati come dovrebbero, ma nel mio caso erano una piccolissima parte, quindi isolarli a valle del processo e correggerli è stato abbastanza semplice e indolore.
Non ho scritto le funzioni di sana pianta, ma ho adattato al mio problema funzioni simili scovate nel web. Sicuramente è migliorabile, ad esempio unendo tutto in una sola funzione tipo SEPARA.INDIRIZZO(Stringa; Indice) dove con Indice si specifica l’indice dell’array che si vuole richiamare (ad es. “2” per il civico). Se qualcuno dovesse farlo me lo facesse sapere!
Ad ogni modo, l’utilizzo è abbastanza immediato: inserendo il codice riportato qui sotto in un nuovo modulo nella finestra di sviluppo, le nuove funzioni possono essere richiamate nelle formule con le stesse modalità delle funzioni built-in di Excel, seguendo la sintassi ESTRAI_VIA(Stringa) ed ESTRAI_CIVICO(Stringa).
Function ESTRAI_VIA(stringa) Dim i, Parole, Limite Parole = Split(stringa, ” “) For i = LBound(Parole) To UBound(Parole) If Mid(Parole(i), 1, 1) Like “[0-9]” Then Limite = i – 1 Exit For Else Limite = UBound(Parole) End If Next For i = LBound(Parole) To Limite If via <> “” Then via = via & ” “ & Parole(i) Else via = Parole(i) End If Next ESTRAI_VIA = via End Function
Function ESTRAI_CIVICO(stringa) Dim i, Parole, Limite Parole = Split(stringa, ” “) For i = LBound(Parole) To UBound(Parole) If Mid(Parole(i), 1, 1) Like “[0-9]” Then Limite = i Exit For Else Limite = UBound(Parole) + 1 End If Next For i = Limite To UBound(Parole) If civico <> “” Then civico = civico & ” “ & Parole(i) Else civico = Parole(i) End If Next If civico = “” Then civico = “snc” End If ESTRAI_CIVICO = civico End Function