Luis riceve informazioni in cui le date sono codificate in modo tale che anni, mesi e giorni vengano sostituiti con un singolo carattere ciascuno. Per ogni campo, vengono utilizzati i numeri da 1 a 9 e dopo le lettere, da a = 10, b = 11, …​ v = 31. Ad esempio, il codice data “bc2” significa b = 11 (anno 2011), c = 12 (mese) e giorno = 2. Luis si chiede se sia possibile ideare una funzione per sostituire la data codificata con un formato di data comune, come gg / mm / aaaa.

In realtà ci sono diversi modi per risolvere questo problema.

Un modo è impostare le “tabelle di equivalenza” all’interno di un foglio di lavoro, dove la colonna di sinistra include un carattere di codice e la destra indica il valore numerico associato a quel carattere. È quindi possibile creare una formula che utilizza CERCA.VERT per trovare i valori e convertire i risultati in una data.

Ad esempio, crea la tua tabella di equivalenza in alcune celle inutilizzate a destra dei tuoi dati. Nel mio caso, inserisco la tabella nelle colonne P e Q. Nella colonna P inserisco i caratteri del codice, da 1 a 9 e da a a z. (Assicurati di far precedere le cifre da 1 a 9 con un apostrofo in modo che siano memorizzate come testo anziché come numeri.) Nella colonna Q ho inserito i numeri da 1 a 35. L’intero intervallo (P1: Q35) ho quindi dato un nome di DateTable .

Ecco la formula, quindi, che restituirà una data decodificata per una data codificata memorizzata nella cella A1:

=DATE(2000+VLOOKUP(LEFT(A1,1),DateTable,2,0), VLOOKUP(MID(A1,2,1),DateTable,2,0),VLOOKUP(RIGHT(A1,1), DateTable,2,0))

Ricorda che questa è un’unica formula continua. Un’altra tecnica consiste nel bypassare del tutto le tabelle di equivalenza e utilizzare invece una formula per eseguire la conversione. Il seguente è un esempio che decodificherà una data nella cella A1:

=DATE(2000+FIND(LEFT(A1,1),"123456789abcdefghijklmnopqrstuvwxyz"), FIND(MID(A1,2,1),"123456789abc"),FIND(MID(A1,3,1), "123456789abcdefghijklmnopqrstuv"))

Questa formula utilizza la funzione TROVA per tradurre dal carattere del codice a un valore, quindi questi valori vengono utilizzati nella funzione DATA per restituire la data desiderata. Un’altra possibile formula si basa, invece, sui valori del codice carattere per creare la data:

=DATE(2000+CODE(MID(A1,1,1))-87+(CODE(MID(A1,1,1))<58)39,CODE(MID(A1,2,1))-87+(CODE(MID(A1,2,1))<58)39,CODE(MID(A1,3,1))-87+(CODE(MID(A1,3,1))<58)*39)

Infine, è possibile creare una funzione definita dall’utente per restituire la data decodificata. Quello che segue è solo un semplice esempio; esamina ogni carattere e lo converte in un valore numerico che viene poi utilizzato con la funzione DateSerial per creare un numero di serie della data di Excel:

Function DecodeDate(datecode As String)

Const X = "123456789abcdefghijklmnopqrstuvwxyz"

Dim D As Integer     Dim M As Integer     Dim Y As Integer

Application.Volatile     D = InStr(X, Right(datecode, 1))

M = InStr(X, Mid(datecode, 2, 1))

Y = 2000 + InStr(X, Left(datecode, 1))

DecodeDate = DateSerial(Y, M, D)

End Function

Va inoltre sottolineato che, indipendentemente dall’approccio utilizzato, esiste un difetto intrinseco nei codici data. L’anno utilizza i valori del codice da 1 a 9 e da a a z. Ciò significa che il codice data può essere uno dei 35 valori possibili. Quando viene aggiunto all’anno 2000 (l’anno base per come hai descritto il codice), significa che il valore massimo dell’anno che può essere codificato è 2035. Qualsiasi data successiva a quell’anno non funzionerà con questa codifica.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (12422) si applica a Microsoft Excel 97, 2000, 2002 e 2003.

Puoi trovare una versione di questo suggerimento per l’interfaccia a barra multifunzione di Excel (Excel 2007 e versioni successive) qui: