You are here:--[RISOLTO] Estrarre data di nascita dal CF: anni 1900 e 2000
[RISOLTO] Estrarre data di nascita dal CF: anni 1900 e 20002018-01-09T19:23:47+02:00

Home Forum Domande su Excel VBA e MACRO [RISOLTO] Estrarre data di nascita dal CF: anni 1900 e 2000

  • Autore
    Articoli
  • Avatarrexottantotto
    Partecipante
      Post totali: 158

      Ciao a tutti e Buon Anno,
      migrando da archi.forumup.it ripropongo in questo quanto proposto in questa discussione
      http://archi.forumup.it/viewtopic.php?t=9770&mforum=archi
      In questa discussione
      http://archi.forumup.it/viewtopic.php?t=2665&postdays=0&postorder=asc&start=0&mforum=archi
      trovata in archi.forumup è stato affrontato come estrarre la data di nascita e il luogo di nascita dal CF e risolto anche il problema della omocodia.
      In quella discussione avevo chiesto agli Esperti come affrontare anche il problema degli anni 1900 e 2000.
      Mi spiego.
      Estraendo la data di nascita da un codice fiscale con excel purtroppo non si ha certezza che la persona sia nata nel 19.. oppure nel 20..
      Ad esempio
      Se inseriamo questi dati in un programma di calcolo on line del c.f.

      COGNOME: ALBERTI
      NOME: MARCO
      SESSO: M
      NATO A: MILANO
      DATA DI NASCITA: 05/071901

      dà questo codice fiscale:

      LBRMRC01L05F205Z

      Se si estrae la data di nascita dal codice fiscale con vba dà come risultato:

      05/07/2001

      mentre nei dati inseriti nel programma di calcolo on line del c.f. la data è

      05/07/1901

      C’è una soluzione con vba Excel?

      Grazie

      • Questo argomento è stato modificato 1 anno, 9 mesi fa da BySalv BySalv.
    • Avatarrexottantotto
      Partecipante
        Post totali: 158

        Nel mio messaggio ci sono alcuni simboli e testi che non ho inserito: per favore mi sipiegate come fare?

        Grazie

        • Avatarrexottantotto
          Partecipante
            Post totali: 158

            Ciao Salv,

            ho visto che hai modificato il mio messaggio, eliminando le cose superflue.

            Posso farlo anch’io quando sono nella fase dell’inserimento e se si come?

            Grazie

             

             

        • BySalvBySalv
          Amministratore del forum
            Post totali: 524

            Ciao Rex, hai fatto copia/incolla quindi si e portato dietro il codice html, l’ho sistemato.

            Premesso che l’Agenzia delle Entrate è l’unico ente autorizzato ad emettere il Codice Fiscale, quindi qualsiasi altro metodo non è attendibile.

            Credo che al momento attuale non sia ancora stato definito un metodo valido per considerare l’anno 1900-2000, tranne se non faranno in modo che le due cifre per l’anno non siano in esadecimale o qualche altro sistema.

            Hanno definito il metodo per eliminare l’omocodia ma non ancora, almeno che io sappia, per gli ultracentenari, ma visto l’aumentare dell’età dovranno trovarlo.

            Qundi ci saremo ancora a domandare se abbiano 105 o 5 anni.

            Ma mi sembra che 1 venga considerato già 2001.

            Comunque si può programmare la macro per l’estrazione della data ad un numero in modo che consideri 2001 e non 1901.

            Ciao by Sal  :bye:

          • Avatarrexottantotto
            Partecipante
              Post totali: 158

              Ciao,

              OK per quanto riguarda la pulizia del mio messaggio.

              Per quanto riguarda invece l’oggetto della discussione capisco che “forse” si può fare creando una macro (con VBA anche?) per l’estrazione della data ad un numero in modo che consideri 2001 e non 1901.

              E qui casco: come fare?

              Ci vuole un Esperto di VBA.

              Grazie

              EDIT

              Mi sono dimenticato di dire che il forum è

              OTTIMO

              FACILE

              LEGGIBILE

              Complimenti.

               

               

              • Questa risposta è stata modificata 1 anno, 9 mesi fa da Avatar rexottantotto.
            • BySalvBySalv
              Amministratore del forum
                Post totali: 524

                Ciao Rex, si può optare anche per qualche formula, la funzione STRINGA.ESTRAI() e qualche SE().

                Sapendo a priori dove sta la data che sono 5 caratteri dal 7° al 9°, Anno-2, Mese-1, Giorno-2.

                in tre celle scrivi tre STRINGA.ESTRAI(), estraendo i caratteri che servono, questa la prima cella per l’anno.

                =STRINGA.ESTRAI(A2;7;2)

                l’altra per il mese

                =STRINGA.ESTRAI(A2;8;1)

                l’ultima per il giorno

                =STRINGA.ESTRAI(A2;9;2)

                a questo punto sapendo l’anno possiamo stabilire se la data può essere del 2000 o del 1900, sapendo la lettera possiamo risalire al mese ed infine per il giorno se supera 31 vuole dire che il CF e di una donna quindi facendo -40 del numero avremo la data.

                questa una base.

                vedi cosa ne esce.

                Ciao By Sal  :bye:

                 

              • Avatarrexottantotto
                Partecipante
                  Post totali: 158

                  In questa discussione su archi forum
                  http://archi.forumup.it/viewtopic.php?t=9738&postdays=0&postorder=asc&start=20&mforum=archi
                  avevo posto lo stesso problema.
                  Riporto il punto in cui sono arrivato.
                  Esempio:
                  se io inserisco questo CF
                  LBRLRT01H15E136C
                  e applico questa formula (o un’altra) per estrarre la data di nascita
                  =DATA(STRINGA.ESTRAI(D8;7;2);TROVA(STRINGA.ESTRAI( D8;9;1);”ABCDEHLMPRST”);RESTO(STRINGA.ESTRAI(D8;10;2);40))
                  mi dà questo risultato:
                  15/06/1901
                  mentre se estraggo la data di nascita con vba (codice di sid)
                  Sub ESTRAZIONE_DATE()
                  Dim j As Long
                  Dim vCF As Variant, vFinale() As Variant

                  With Sheets(“Foglio1”) ‘nome tuo foglio
                  vCF = .Range(“D2:D” & .Range(“D” & Rows.Count).End(xlUp).Row)
                  ReDim vFinale(1 To UBound(vCF), 1 To 1)
                  For j = 1 To UBound(vCF)
                  vFinale(j, 1) = ESTRAI_DATA(vCF(j, 1))
                  Next j
                  .Range(“J2:J” & Rows.Count).ClearContents
                  .Range(“J2:J” & UBound(vCF) + 1).Value = vFinale
                  End With
                  End Sub

                  e

                  Public Function ESTRAI_DATA(ByVal CF As String) As Variant (codice di sid)
                  Dim nAnno As Integer
                  Dim vMese As Variant
                  vMese = Array(“A”, “B”, “C”, “D”, “E”, “H”, “L”, “M”, “P”, “R”, “S”, “T”)
                  On Error GoTo USCITA
                  nAnno = IIf(Val(Mid(CF, 7, 2)) <= Right(Year(Date), 2) * 1, Val(Mid(CF, 7, 2)) + 2000, Val(Mid(CF, 7, 2)) + 1900)

                  ESTRAI_DATA = DateSerial(nAnno, Application.WorksheetFunction.Match(Mid(CF, 9, 1), _
                  vMese, 0), Val(Mid(CF, 10, 2)) Mod 40)
                  USCITA:
                  If Err.Number <> 0 Then
                  ESTRAI_DATA = “CODICE FISCALE NON VALIDO”
                  End If
                  End Function
                  mi dà questo risultato:
                  15/06/2001
                  Preciso: il problema non sta nei codici perchè, come spiegato da sid, estrarre le date di nascita avendo solo le ultime 2 cifre dell’anno dà risultati imprevisti.
                  Volevo vedere, se partendo da questi due codici, con un marchingegno si può risovere il problema.
                  E quindi mi è venuro in mente questo:
                  se si estraggono tutte e due le date di nascita e poi lasciare all’utente la possibilità di sceglierla e utilizzarla?.
                  E’ mera fantasia?
                  Non so mettere il codice come nell’altro forum: me lo potete spiegare?

                  Grazie

                • BySalvBySalv
                  Amministratore del forum
                    Post totali: 524

                    Ciao Rex, La funzione di sid che saluto, in effetti ti sceglie l’anno, ma non capisco di quale utilità possa essere avere 2 date per poi scegliere quale possa essere quella idonea.

                    Penso che ti stia creando problemi inutili al momento, perche non ci sono troppi centenari in giro.

                    per il Codice, vedi che la finestra per rispondere in alto a dx ce scritto “Visuale – Testo” ammettendo che devi inserire un commento nella scheda visuale selezioni il testo poi clicca su le virgolette capovolte la terza icona dopo la “I”, invece per il codice passa alla scheda Testo selezioni il Codice e premi “Code” la terzultima voce.

                    Ciao By Sal  :bye:

                     

                  • Avatarrexottantotto
                    Partecipante
                      Post totali: 158

                      Sono io che non so spiegarmi.

                      Nel mio file inserisco le persone con il codice fiscale:

                      LBRLRT01H15E136C

                      Della stessa persona non conosco la data di nascita.

                      Se io estraggo dal codice fiscale la data di nascita applicando questa formula:

                      =DATA(STRINGA.ESTRAI(D8;7;2);TROVA(STRINGA.ESTRAI( D8;9;1);”ABCDEHLMPRST”);RESTO(STRINGA.ESTRAI(D8;10;2);40))

                      mi dà come risultato

                      15/06/1901

                      se invece estraggo la data con vba

                      mi dà questo risultato

                      15/06/2001

                      Questo perchè nel codice fiscale l’anno è riportato solo con due cifre.

                      01H15

                      E’ vero che ci sono pochi centenari, ma è possible che non ci sia soluzione con vba?

                       

                       

                    • BySalvBySalv
                      Amministratore del forum
                        Post totali: 524

                        Ciao Rex, non hai guardato bene la Funzione di Sid questa riga di codice:

                        nAnno = IIf(Val(Mid(CF, 7, 2)) <= Right(Year(Date), 2) * 1, Val(Mid(CF, 7, 2)) + 2000, Val(Mid(CF, 7, 2)) + 1900)`

                        fa un confronto con l’anno odierno se l’anno odierno e maggiore della data allora considera l’anno 2000 altrimenti considera l’anno 1900, lo puoi vedere in particolare qui “+2000” e “+1900”, considera 100 anni.

                        A questo punto se abbiamo una data di 2 cifre esempio 17 scrive 2017 se invece le due cifre della data sono 19 allora scrive 1919, per cui 01 lo considera 2001 e non 1901, perche è minore di 18.

                        Una macro che non ha questo confronto ti porterà anche lei 1901 come la formula, fintanto non si troverà un modo di segnalare in 2 cifre l’anno 2000.

                        Ma anche la formula opportunamente composta potrà portarti lo stesso risultato del VBA.

                        Dici se possiamo considerarla Risolta.

                        Ciao By Sal  :bye:

                        • Questa risposta è stata modificata 1 anno, 9 mesi fa da BySalv BySalv.
                      • Avatarrexottantotto
                        Partecipante
                          Post totali: 158

                          Faccio i test sul mio file e poi faccio sapere.

                          Per il momento grazie.

                           

                        • Avatarrexottantotto
                          Partecipante
                            Post totali: 158

                            Ho fatto i test sul mio file.

                            http://www.filedropper.com/estraidatadinascitadalcf

                            Le incongurenze sono evidenziate in giallo e con carattere rosso.

                          • BySalvBySalv
                            Amministratore del forum
                              Post totali: 524

                              Ciao Rex, il problema non è la macro o le formule, la visualizzazione per l’anno dovrebbe essere a 2 cifre e non 4, il modo di visualizzarle cambia in base al formato che si è dato a Windows.

                              Con le formule non viene applicato ma con le macro si perche ce l’interprete dei comandi.

                              Guarda questo stralcio di Guida:

                              Se una data con un anno a due cifre viene immessa in una cella in formato testo o come un argomento di testo in una funzione, ad esempio =ANNO(“1/1/31”), l’anno verrà interpretato nel modo seguente:

                              Da 00 a 29 vengono interpretati come gli anni compresi tra il 2000 e il 2029. Se ad esempio si digita la data 28/5/19, Excel la interpreta come 28 maggio 2019.

                              Da 30 a 99 vengono interpretati come gli anni compresi tra il 1930 e il 1999. Se ad esempio si digita la data 28/5/98, Excel verrà la interpreta come 28 maggio 1998.

                              Ricordavo qualcosa, ma non l’avevo ancora messo a fuoco, ce il modo per rimediare ma non so se convenga oppure no, devi andare in “Pannello di Controllo” scegliere “Paese e lingue” poi Impostazioni aggiuntive si apre un altra maschera scegli la scheda “Data” ed imposta il tuo periodo per il 2000, ma come ho detto non so fino a quando conviene.

                              l’immagine dei comandi:

                              Ciao By Sal

                            • Avatarrexottantotto
                              Partecipante
                                Post totali: 158

                                Non mi metto a smanettare nel “Pannello di Controllo” per evitare di fare dei guai.

                                Mi sembra di capire che non c’è alcuna soluzione.

                                Mi devo arrendere?

                              • BySalvBySalv
                                Amministratore del forum
                                  Post totali: 524

                                  Ciao Rex fai una prova almeno, non viene modificato niente al posto di 1930 scrivi 1900 ed al posto di 2029 scrivi 1999 e dai ok.
                                  al limite riscrivi le date che c’erano prima.

                                  Ciao By Sal  :bye:

                                • BySalvBySalv
                                  Amministratore del forum
                                    Post totali: 524

                                    Ciao Rex ti ho modificato un poco le tue macro, ma già erano funzionanti, è bastato inserire il parametro del Secolo.
                                    ecco il codice delle macro, la prima “ESTRAZIONE_DATE” la seconda la funzione di estrazione “ESTRAI_DATA1”, inseriscile in un modulo, ma attenzione se le inserisci nel file che hai inviato devono andare in sostituzione di quelle esistenti.

                                    Sub ESTRAZIONE_DATE()
                                    Dim j As Long
                                    Dim vCF As Variant, vFinale() As Variant
                                    
                                    With Sheets("Foglio1") 'nome tuo foglio
                                    vCF = .Range("D2:D" & .Range("D" & Rows.Count).End(xlUp).Row)
                                    ReDim vFinale(1 To UBound(vCF), 1 To 1)
                                    For j = 1 To UBound(vCF)
                                    vFinale(j, 1) = ESTRAI_DATA1(vCF(j, 1), 1900) ' messo 1900 per secolo
                                    Next j
                                    .Range("J2:J" & Rows.Count).ClearContents
                                    .Range("J2:J" & UBound(vCF) + 1).Value = vFinale
                                    End With
                                    End Sub
                                    
                                    Public Function ESTRAI_DATA1(ByVal CF As String, ByVal nSecolo As Integer) As Variant
                                    'nSecolo può essere 1900, 2000, ecc...
                                    Dim vMese As Variant
                                    vMese = Array("A", "B", "C", "D", "E", "H", "L", "M", "P", "R", "S", "T")
                                    On Error GoTo USCITA
                                    ESTRAI_DATA1 = DateValue(Val(Mid(CF, 7, 2)) + nSecolo & "/" & Application.WorksheetFunction.Match(Mid(CF, 9, 1), _
                                    vMese, 0) & "/" & Val(Mid(CF, 10, 2)) Mod 40)
                                    USCITA:
                                    If Err.Number <> 0 Then
                                    ESTRAI_DATA1 = "CODICE FISCALE NON VALIDO"
                                    End If
                                    End Function

                                    In questo modo non ti riporterà l’anno 2000, ma solo il 1900, quindi attenzione se ci sono nati nell’anno 2000 li riporterà come se fossero nati nel 1900, perciò se è nato nel 2001 lo riporterà come 1901.

                                    Io non capisco perchè vuoi l’anno a 4 cifre.

                                    Perciò ho detto che per adesso gli anni dovrebbero essere considerati a 2 cifre, non è stato ancora codificato nel Codice Fiscale l’anno 2000, secondo me l’anno dovrebbero considerarlo in “Esadecimale

                                    Ciao By Sal  :bye:

                                  • Avatarrexottantotto
                                    Partecipante
                                      Post totali: 158

                                      Ciao,

                                      le funzioni “funzionano”, scusa il bisticcio di parole.

                                      Se inserisco un codice foiscale di uno nato nel 2001 mi restituisce 1901 come mi hai anche detto tu.

                                      Siccome ho capito che non è possibile fare con quattro cifre, ritengo di fermarmi qui.

                                      Grazie per l’aiuto.

                                      Non so come si mette RISOLTO se potete provvedere voi e dirmi come si fa per il futuro.

                                      Grazie

                                       

                                       

                                    La discussione ‘[RISOLTO] Estrarre data di nascita dal CF: anni 1900 e 2000’ è chiusa a nuove risposte.

                                    Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

                                    Questo sito utilizza i cookie per fornire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o cliccando su "Accetta" permetti il loro utilizzo.

                                    Chiudi