Estrarre data da codice fiscale



  • Estrapolare data da cod fis
    di Fabilino (utente non iscritto) data: 21/01/2009

    Salve a tutti, avete uno script che da un codice fiscale mi permette di ricavare una data di nascita, uso excel-visual basic.
    grazie mille



  • di Ricky53 data: 21/01/2009

    Ciao,
    benvenuto nel forum.
    con una ricerca mediante google troverai degli esempi free in excel, da questi potrai ricavare quanto ti occorre.
    conosci le regole che consentono di calcolare il codice fiscale? sempre con google le troverai.

    se avrai difficoltà scrivi e ti fornirò le informazioni per arrivare alla soluzione.

    ciao da ricky53



  • di R (utente non iscritto) data: 21/01/2009

    Unico problema l'anno (09 potrebbe essere 2009 o 1909) io ho considerato da 01 in po nel 2000 ... ti allungo anche una function (visto che parli di script ho usato le reg exp ) per la verifica formale del cf, doverosa prima ri richiamare datadacf.
    saluti
    r
     
    Sub Test()
    Dim cf As String
    cf = "AAABBB71E67E111P"
    If Verifica_CF_Form(cf) Then
        Debug.Print DataDaCF(cf)
    End If
    End Sub
    
    
    Function DataDaCF(cf As String) As Date
    Dim Y As Long, D As Long, M As Long, sM As String
    Dim arrM
    
    arrM = Array("A", "B", "C", "D", "E", "H", "L", "M", "P", "R", "S", "T")
    
    Y = CLng(Mid(cf, 7, 2))
    
    If Y < Year(Date) - 2000 Then
        Y = Y + 2000
    Else
        Y = Y + 1900
    End If
    
    sM = Mid(cf, 9, 1)
    
    For D = 0 To 11
        If sM = arrM(D) Then
            M = D + 1
            Exit For
        End If
    Next
    
    D = CLng(Mid(cf, 10, 2))
    
    If D > 31 Then
        D = D - 40
    End If
    DataDaCF = DateSerial(Y, M, D)
    End Function
    
    
    Public Function Verifica_CF_Form( _
        testo As String) As Boolean
        
    Dim RE As Object
    Set RE = CreateObject("VBScript.RegExp")
    RE.Global = True
    RE.Pattern = _
        "^([A-Z]{6})" & _
        "(d{2})" & _
        "([A-EHLMPR-T]{1})" & _
        "(70|71|[0-6]{1}d{1})" & _
        "([A-Z]{1})([0-9L-NPQ-V]{3})" & _
        "([A-Z]{1})$"
    Verifica_CF_Form = RE.Test(testo)
    End Function
    
    
    






  • di Fabilino (utente non iscritto) data: 22/01/2009

    Grazie per la risposte, siete stati molto gentile. ora provo quel codice che mi avete dato. mi ero scritto del codice da solo ma non è molto raffinato.
     
    Sub estrai()
    Dim a As String
    Dim tutto As String
    Dim giorno As String
    Dim mese As String
    Dim anno As String
    a = Cells(1, 1)
    tutto = mid(a, 7, 5)
    anno = mid(tutto, 1, 2)
    mese = mid(tutto, 3, 1)
    giorno = mid(tutto, 4, 2)
    If mese = "a" Or mese = "A" Then
     mese = "01"
    ElseIf mese = "b" Or mese = "B" Then
     mese = "02"
    
    ElseIf mese = "c" Or mese = "C" Then
     mese = "03"
    
    ElseIf mese = "d" Or mese = "D" Then
     mese = "04"
    ElseIf mese = "e" Or mese = "E" Then
     mese = "05"
    ElseIf mese = "h" Or mese = "H" Then
     mese = "06"
    ElseIf mese = "l" Or mese = "L" Then
     mese = "07"
    ElseIf mese = "m" Or mese = "M" Then
     mese = "08"
    ElseIf mese = "p" Or mese = "P" Then
     mese = "09"
    ElseIf Cells(1, 4) = "r" Or mese = "R" Then
     mese = "10"
    ElseIf Cells(1, 4) = "s" Or mese = "S" Then
     mese = "11"
    ElseIf Cells(1, 4) = "t" Or mese = "T" Then
     mese = "12"
     End If
    If giorno > 40 Then
    giorno = giorno - 40
    End If
    Cells(1, 2).Value = giorno & "/" & mese & "/" & anno
    
    End Sub



  • di Enzo (utente non iscritto) data: 23/01/2009

    Ciao fabilino
    io sono del parere che l'importante e' raggiungere lo scopo anche con istruzioni che come intendi dire tu non sono "raffinate".
    volevo solo permettermi di darti un consiglio solo per evitare di riscrivere piu' comandi all'interno di if
    se eventualmente mettevi dopo l'istruzione mese = mid (tutto.....) mese = format (mese,">") avresti ottenuto la lettera subito in maiuscolo senza poi dover inserire nelle istruzioni elseif "se maiuscolo o minuscolo"
    tutto qui
    ciao



  • di R (utente non iscritto) data: 23/01/2009

    Ciao enzo,
    l'importante non è raggiungere lo scopo quando si vuole migliorare ... l'importante è sempre migliorare ... uno sforzo maggiore all'inizio viene sempre ripagato.
    alcune osservazioni su quanto scritto da fabiano:
    1 se vuoi ottenere un valore da una routine utilizza una function ...
    2 se vuoi che la tua function sia riutilizzabile adattabile e facile da usare creala con agromenti ovvero fai si di passare alla funzione degli argomenti e di avere come risultato ciò che ti occorre ... (le tue function potranno essere usate anche come udf ovvero funzioni usabili nel tuo foglio di calcolo)
    3 tutti quegli or sono un or rore puoi risolvere facilmente rendendo la stringa maiuscola all'inizio a = ucase(cells(1, 1))

    saluti
    r






  • di Ricky53 data: 23/01/2009

    Ciao,
    condivido quanto scritto da "r", aggiungerei, sotto l'aspetto didattico che al posto dei 12 "if" puoi utilizzare il "select case", le condizioni sono sempre 12 ma la leggibilità e semplicità di gestione è sicuramente maggiore.

    ciao da ricky53



  • di Ricky53 data: 23/01/2009

    Ciao,
    prima ho dimenticato di scrivere che comunque la soluzione di "r" (proposta in un suo precedente intervento) che usa una array ed un ciclo è la più semplice ed è anche ottimizzata.

    ciao di nuovo da ricky53


  • Grazie a tutti
    di Fabilino (utente non iscritto) data: 23/01/2009

    Innanzi tutto complimenti per la professionalità, il forum è molto interessante.

    io programmo in c++, il visual basic lo conosco da mezza giornata, spero di migliorarmi.

    il mio problema è che ho un gestionale fatto in delphi che si appoggia a sql serve 2005. mi sono esportato più di mille codici fiscali a cui corrispondono quasi tutte date di nascita sbagliate, e grazie a questa macro in un sol colpo ho riottenuto le date giuste.
    saluti
     
    Sub estrai()
    Dim i As Integer
     Dim a As String
    Dim tutto As String
    Dim giorno As String
    Dim mese As String
    Dim anno As String
    Range("A1").Select
    Do While Selection.Value <> ""
    a = ActiveCell.Value
    tutto = Mid(a, 7, 5)
    anno = Mid(tutto, 1, 2)
    mese = Mid(tutto, 3, 1)
    giorno = Mid(tutto, 4, 2)
    If mese = "a" Or mese = "A" Then
     mese = "01"
    ElseIf mese = "b" Or mese = "B" Then
     mese = "02"
    ElseIf mese = "c" Or mese = "C" Then
     mese = "03"
    ElseIf mese = "d" Or mese = "D" Then
     mese = "04"
    ElseIf mese = "e" Or mese = "E" Then
     mese = "05"
    ElseIf mese = "h" Or mese = "H" Then
     mese = "06"
    ElseIf mese = "l" Or mese = "L" Then
     mese = "07"
    ElseIf mese = "m" Or mese = "M" Then
     mese = "08"
    ElseIf mese = "p" Or mese = "P" Then
     mese = "09"
    ElseIf mese = "r" Or mese = "R" Then
     mese = "10"
    ElseIf mese = "s" Or mese = "S" Then
     mese = "11"
    ElseIf mese = "t" Or mese = "T" Then
     mese = "12"
     End If
    If giorno > 40 Then
    giorno = giorno - 40
    End If
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.FormulaR1C1 = giorno & "/" & mese & "/" & anno
    ActiveCell.Offset(1, -1).Range("A1").Select
    Loop
    End Sub