Dopo la superbike :-)
Per provare a "riassumere" e cercare di trovare una possibile soluzione all'iniziale domanda di gtsolid in relazione alla prima soluzione:
- al posto di scrivere 09/07/2016 vorrei scrivere 09072016 e il programma dovrebbe in automatico riconoscere la data.
La proposta è la seguente Function. Ho trasformato la sub in un'unica Function perché mi sembra più versatile sia per un utilizzo tramite evento change ma anche in caso di inserimento dati tramite una TextBox (nel foglio come nell'esempio che seguirà o in
una UserForm di inserimento dati).
Inserisco lo screen di una maschera presa per l'inserimento delle fatture emesse nel programma utilizzato per la contabilità dove l'inserimento della data di registrazione avviene tramite digitazione della data in un textbox):

Questa la Function, nella quale non ho indicato alcun vincolo di data, la quale effettua, quindi, solo la trasformazione in formato "dd/mm/yyyy" e controlla la validità.
Ma potrebbe essere implementata ad esempio per controllare che le date inserite siano comprese entro un dato ambito temporale (ad es. per date comprese in un dato anno o in un trimestre, ecc. ecc.).
Alla funzione va assegnata una stringa di testo (es. 010116 o 01012016 o 01/01/16 o 01/01/2016 (o altre date inserite in modalità standard).
Come obbligo, in caso di inserimento "breve", è d'obbligo digitare sempre ddmmaa o ddmmaaaa.
Diversamente la Function segnala la stringa di testo inserita come data non valida.
Il risultato della Function è a sua volta una stringa di testo che però può essere convertita in data.
'----
'Modulo1
Option Explicit
'<--- Funzione che converte una stringa di testo ddmmaa o ddmmaaa in una data --->
'<--- Una prima condizione è che le celle dove vengono inserite le date siano in formato testo --->
'<--- Una seconda condizione è che le date in "formato breve" siano sempre inserite digitando: _
- ggmmaa (es. 010116 per la data 01/01/2016) _
- ggmmaaaa (es. 01012016 per la data 01/01/2016) _
Un inserimento differente dalle due suddette modalità dà luogo ad un errore di data non valida _
E ' sempre possibile inserire le date in modalità classica (gg/mm/aa, gg/mm/aaaa)
'<--- la funzione potrebbe essere utilizzata per textbox presenti nel foglio o in una userform --->
'<--- in tal caso già la text box restituisce una stringa di testo --->
Public Function FunctionDataBreve(StringaData As String) As String
Dim GG As String, MM As String, AA As String
Dim PrefissoAnnoBreve As String
Dim Data As Date
Dim NunChrAnno As Integer
On Error GoTo Esci
If StringaData = "" Then FunctionDataBreve = Empty: GoTo Esci
If Not IsDate(StringaData) Then
If Len(StringaData) <> 6 And Len(StringaData) <> 8 Then
MsgBox "Data non valida", vbExclamation, "Data"
FunctionDataBreve = Empty
GoTo Esci
End If
If Len(StringaData) = 6 Then
NunChrAnno = 2
ElseIf Len(StringaData) = 8 Then
NunChrAnno = 4
End If
GG = Mid(StringaData, 1, 2)
MM = Mid(StringaData, 3, 2)
If MM < 1 Or MM > 12 Then Err.Raise 13
AA = Mid(StringaData, 5, NunChrAnno)
If Len(AA) = 2 Then
If AA >= "00" And AA <= 29 Then
PrefissoAnnoBreve = "20"
Else
PrefissoAnnoBreve = "19"
End If
End If
AA = PrefissoAnnoBreve & AA
Data = CDate(GG & "/" & MM & "/" & AA)
Else
Data = CDate(StringaData)
End If
FunctionDataBreve = Format(CDate(Data), "dd/mm/yyyy")
Esci:
If Err.Number <> 0 Then
MsgBox "Data non valida", vbExclamation, "Data"
FunctionDataBreve = vbNullString
End If
End Function
'----
Qui il link ad un file di esempio
Inserimento Data Breve (ggmmaa o ggmmaaaa).xlsm
Nel file è presente una cella (enorme! :-) ), la B4, dove inserendo le date, tramite l'evento Worksheet_Change, viene assegnato a se stessa il valore della data "convertito" e ad un'altra cella B14, dopo conversione in data della stringa di testo risultato
della function.
Inoltre ho inserto una TextBox nella quale inserendo la data, la stessa convertita dalla function, viene assegnata, con il comando LostFocus della textbox, alla textbox stessa, alla cella B4 e alla cella B14 dopo conversione in data.
Senpre nel foglio è presente una cella di verifica che legge il contenuto della cella B4 tramite la formula DATA.VALORE per verificare che la data inserita (sia tramite l'evento change che tramite la textbox) rappresenti effettivamente una data.
Se vi va fate sapere cosa ne pensate :-)