Visto he il problema della data "breve" (ggmmaa) è dato dal fatto che viene convertita in formato americano ho pensato, prendendo spunto dalla userform dell'esempio linkato da Mauro che impone un anno di quattro caratteri), di fare in modo che l'anno breve
diventi lungo inserendo un suffisso.
A tale scopo ho creato una function che, a meno di non aver sbagliato gli anni, si comporta come farebbe excel in caso di inserimento di data breve gg/mm/aa (se non sbaglio per valori compresi tra 00 e 29 antempone il 20 (anni duemila) altrimenti antempone
il 19 (anni 1900).
A questo punto dichiaro la variable Data come Date e se da errore il tutto viene passato alla condizione If Err.Number <> 0 then.
Ho anche, in verità, creto una routine apposita da lanciare con l'evento change dopo aver dichiarato una variabile a livello di modulo.
In questo modo penso sia più flessibile gestire quando lanciare il "convertitore" di data.
Facendo qualche prova mi pare che si risolva il problema di date errate nel senso che non rappresentano una data valida (ovviamente non quello di inserimento da parte una data sbagliata rispetto alla data che avrebbe dovuto inserire).
Questo il codice modificato (se avete voglia di provarlo ovviamente)
'----
Option Explicit
Dim rngTarget As Range
Private Sub Worksheet_Change(ByVal Target As Range)
Const Cella1 As String = "A1"
Dim cTrg As Range, i As Long
On Error GoTo Esci
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
If Target.Row > Me.Range(Cella1).Row And _
Target.Column = Me.Range(Cella1).Column Then
If Target.Rows.Count = 1 Then
Set rngTarget = Target
Call InserimentoSemplificatoDate
Else
i = 0
For Each cTrg In Target.Cells
i = i + 1
Set rngTarget = Target.Cells(i, 1)
Call InserimentoSemplificatoDate
Next cTrg
End If
End If
Esci:
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
Sub InserimentoSemplificatoDate()
'da richiamare con l'evento Worksheet_Change
'Inserimento date facilitato
'Inserire le date in formato ggmmaa o ggmmaaa o nei normali formati data
'Le celle devono essere formattate come testo
'rngTarget rappresenta l'oggetto Target dell'evento Worksheet_Change
'tale variabile è da dichiarare tra le prime righe del modulo del relativo foglio
Dim AnnoLimite As Integer
Dim StringaData As String
Dim GG As String, MM As String, AA As String, iAA As String
Dim Data As Date
Dim NunChrAnno As Integer
On Error GoTo Esci
AnnoLimite = 2016
StringaData = rngTarget.Value
If StringaData = "" Then GoTo Esci
If Not IsDate(StringaData) Then
If Len(StringaData) <> 6 And Len(StringaData) <> 8 Then
MsgBox "Data errata", vbExclamation, "Data"
rngTarget.Value = 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)
AA = PrefissoAnnoBreve(Mid(StringaData, 5, NunChrAnno)) & Mid(StringaData, 5, NunChrAnno)
Data = CDate(GG & "/" & MM & "/" & AA)
Else
Data = rngTarget.Value
End If
If IsDate(Data) And Year(Data) >= AnnoLimite Then '<--- nel mio caso la condizione Year(Data) è solo =
rngTarget.Value = Format(CDate(Data), "dd/mm/yyyy")
Else
MsgBox "Anno errato", vbExclamation, "Data"
rngTarget.Value = Empty
End If
Esci:
If Err.Number <> 0 Then
Debug.Print Err.Number, Err.Description
MsgBox "Data errata", vbExclamation, "Data"
rngTarget.Value = Empty
End If
End Sub
Function PrefissoAnnoBreve(sAnnoBreve As String) As String
If Len(sAnnoBreve) = 2 Then
If sAnnoBreve >= "00" And sAnnoBreve <= "29" Then
PrefissoAnnoBreve = "20"
Else
PrefissoAnnoBreve = "19"
End If
End If
End Function
'---
p.s. ho fatto anche una modifica che se le righe in cui vengono inserite le date sono più di una (Ctrl+Invio) la procedura le compili tutte. E' una cosa che va oltre la richiesta ma, visto che stavo rimaneggiando, ho voluto provare questa cosa :-)
Ovviamente si può impostare che se il numero di righe sia più di una la procedura venga saltata o eseguita altra azione (così come ho lasciato che in caso di più colonne target il tutto passi per Err.Number <> 0).