Maiuscola primo carattere

 

Può capitare a volte di avere un elenco di nomi tutto in minuscolo o tutto in maiuscolo e di voler visualizzare visualizzare i nomi col solo carattere iniziale maiuscolo.

Vediamo subito una tabella di esempio:

Possibili elenchi in minuscolo o in maiuscolo
Tabella finale
nome NOME Nome
migliavacca luigi MIGLIAVACCA LUIGI Migliavacca Luigi
rizzi carlo RIZZI CARLO Rizzi Carlo
liberali franca LIBERALI FRANCA Liberali Franca
di maggio mario DI MAGGIO MARIO Di Maggio Mario
scicchitano andrea SCICCHITANO ANDREA Scicchitano Andrea
d'ascanio giuseppe D'ASCANIO GIUSEPPE D'Ascanio Giuseppe
edelvisi maurizio EDELVISI MAURIZIO Edelvisi Maurizio
gerardini silvano GERARDINI SILVANO Gerardini Silvano
pasotti alessio PASOTTI ALESSIO Pasotti Alessio

Esiste in VBA la Funzione StrConv che restituisce una stringa convertita come specificato da un appropriato argomento:

Argomento Valore Descrizione
vbUpperCase 1 Rende maiuscola la stringa
vbLowerCase 2 Rende minuscola la stringa
vbProperCase 3 Rende maiuscola la prima lettera di ogni parola della stringa

Da questa tabella è logico intuire che l'argomento da usare con la Funzione StrConv è vbProperCase.

La sintassi da usare è: StrConv(string, costante).

Proviamo ad applicare questa funzione al nostro intervallo:

Sub MaiuscolaPrimaLettera()
Dim Stringa, Parola
Dim Righe, R, Colonne
Dim Intervallo As Range
' prima fase: determino li'intervallo su cui lavorare
With Range("F1").CurrentRegion
Righe = .Rows.Count
Colonne = .Columns.Count
Set Intervallo = .Resize(Righe, Colonne)
End With
If IsEmpty(Intervallo) Then
MsgBox "L'intervallo è vuoto"
Exit Sub
End If
' seconda fase: conversione delle stringhe mettendo in maiuscolo i soli primo caratteri
For R = 1 To Righe
Stringa = Intervallo(R, 1)
If Stringa <> "" Then
Parola = StrConv(Stringa, vbProperCase)
Intervallo(R, 1) = Parola
End If
Next
End Sub

Tuttavia il risultato ancora non è soddisfaciente. Infatti vediamo che il nome D'ascanio Giuseppe conserva la "a" dopo l'apostrofo ancora minuscolo.

Nome
Migliavacca Luigi
Rizzi Carlo
Liberali Franca
Di Maggio Mario
Scicchitano Andrea
D'ascanio Giuseppe
Edelvisi Maurizio
Gerardini Silvano
Pasotti Alessio

A questo punto dobbiamo intervenire nel codice passando ad esaminare la presenza dell'apostrofo.

per controllare la presenza dell'apostrofo viene usata la Funzione InStr:

Apostrofo = InStr(1, Parola, "'")

Nella variabile Apostrofo viene memorizzato un numero superiore a 0 (zero) che indica la posizione dove è stato trovato l'apostrofo, altrimenti restituisce 0 (zero).

Se viene trovato l'apostrofo si rende maiuscolo il carattere immediatamente successivo usando la Funzione UCase.

Apostrofo = InStr(1, Parola, "'")
If Apostrofo Then
Mid(Parola, Apostrofo + 1, 1) = UCase(Mid(Parola, Apostrofo + 1, 1))
End If

Dopo questa ulteriore verifica avremo la giusta trasformazione:

d'ascanio giuseppe oppure D'ASCANIO GIUSEPPE verrà trasformato in D'Ascanio Giuseppe

 

Questo è finalmente il codice completo:

Sub MaiuscolaPrimaLettera()
Dim Stringa, Parola, Apostrofo
Dim Righe, R, Colonne
Dim Intervallo As Range
' prima fase: determino li'intervallo su cui lavorare
With Range("F1").CurrentRegion
Righe = .Rows.Count
Colonne = .Columns.Count
Set Intervallo = .Resize(Righe, Colonne)
End With
If IsEmpty(Intervallo) Then
MsgBox "L'intervallo è vuoto"
Exit Sub
End If
' seconda fase: conversione delle stringhe mettendo in maiuscolo i soli primo caratteri
For R = 1 To Righe
Stringa = Intervallo(R, 1)
If Stringa <> "" Then
Parola = StrConv(Stringa, vbProperCase)
' questa la modifica per maiuscolare anche la prima lettera dopo l'apostrofo
Apostrofo = InStr(1, Parola, "'")
If Apostrofo Then
Mid(Parola, Apostrofo + 1, 1) = UCase(Mid(Parola, Apostrofo + 1, 1))
End If
' sostituzione della stringa originale
Intervallo(R, 1) = Parola
End If
Next
End Sub

Una domanda: servirà questa routine?

Se sarà utile a qualcuno ne sarò lieto.