Prova così:
Ovviamente ipotizzo che nella stringa cf ci sia il Codice Fiscale:
ANNO = CLng(Mid$(cf, 7, 2))
If ANNO < Year(Date) - 2000 Then
ANNO = ANNO + 2000
Else
ANNO =ANNO + 1900
End If
Ciao
Ti aggiungo perchè la trovo una cosa molto funzionale, la verifica
dell'inserimento tramite RegEX in LateBinding... cosa a mio avviso
molto tecnica:
Public Function Verifica_CF(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 = RE.Test(testo)
End Function
Purtroppo non è codice mio, ma è roba vecchia e non ricordo dove l'ho
trovata...
@Alex
Il controllo del codice fiscale con un codice diverso preso se non
ricordo male dal sitocomune lo faccio e funziona.
> > ANNO = CLng(Mid$(cf, 7, 2))
>
> > If ANNO < Year(Date) - 2000 Then
> > ANNO = ANNO + 2000
> > Else
> > ANNO =ANNO + 1900
> > End If
dove lo metto questo codice?
Grazie.
Giuseppe.
Dovresti scrivere una funzione VBA, anzi tante funzioncine ognuna
delle quali restituisce il dettaglio...
Nel tuo caso:
Function GetYearFromCF(CF as String) as Integer
Dim intY as Integer
intY = CLng(Mid$(CF, 7, 2))
If intY < Year(Date) - 2000 Then
intY = intY + 2000
Else
intY =intY + 1900
End If
GetYearFromCF=intY
End Function
A quel punto nella TextBox che deve restituire l'anno al posto di
OrigineControllo, dove metti il tuo calcolo... scrivi:
=GetYearFromCF([ControlloCodiceFiscale])
Così puoi fare per il sesso, il luogo di nascita ecc...
L'altro codice che ti ho scritto serve solo a VALIDARE il CF in base
ad Espressioni Regolari.
Ciao
@Alex
> Dovresti scrivere una funzione VBA, anzi tante funzioncine ognuna
> delle quali restituisce il dettaglio...
> Nel tuo caso:
>
> Function GetYearFromCF(CF as String) as Integer
> Dim intY as Integer
> intY = CLng(Mid$(CF, 7, 2))
>
> If intY < Year(Date) - 2000 Then
> intY = intY + 2000
> Else
> intY =intY + 1900
> End If
> GetYearFromCF=intY
> End Function
e se l'anno di nascita è 2010 che si fa?
> A quel punto nella TextBox che deve restituire l'anno al posto di
> OrigineControllo, dove metti il tuo calcolo... scrivi:
> =GetYearFromCF([ControlloCodiceFiscale])
>
> Così puoi fare per il sesso, il luogo di nascita ecc...
>
> L'altro codice che ti ho scritto serve solo a VALIDARE il CF in base
> ad Espressioni Regolari.
L'ho provato per curiosità ma restituisce sempre false.
> Ciao
> @Alex
--
Ciao
Geppo
Sei certo di aver capito come funziona...?
Perchè prima di essere scettico non lo provi e lo comprendi...?
> L'ho provato per curiosit ma restituisce sempre false.
Verifica di avere RegEx come Librerie.
> --
> Ciao
> Geppo
@Alex
Non sono scettico ........ effettivamente col 2010 non ci sono problemi,
mentre con l'anno in corso si possono riscontrare anomalie a meno che non
aggiunge un "=":
If intY <= Year(Date) - 2000 Then
Giusto?
>> L'ho provato per curiosit ma restituisce sempre false.
>
> Verifica di avere RegEx come Librerie.
Non funziona comunque.......per curiosità da te funziona?
> @Alex
--
Ciao
Geppo
uhmmmmm......forse *geppo* intendeva l'anno corrente (oltre agli
ultracentenari)
>
>> L'ho provato per curiosit ma restituisce sempre false.
>
> Verifica di avere RegEx come Librerie.
Se mancano le librerie non dovrebbe dare errore sull'oggetto?
Comunque non sapevo che i codici dei comuni potessero avere un
alfanumerico nei tre digit, normalmente, numerici (pos. 13-15)
Il controllo dovrebbe poi fallire se c'e' qualche spazio in fondo
--
ac (x=y-1)
--
ac (x=y-1)
ho provato ma non va comuque.
--
Ciao
Geppo
Si hai ragione ho provato e non rende mai True... credo che ci siano
anomalie nelle regole assegnate a REGEX... magari rivedendole in modo
puntuale si corregge di certo, il concetto è in tutti i modi corretto
e la cosa utile da sfruttare è il LateBinding su RegEx... poi prenditi
il tempo
che ti serve, sempre che la cosa ti sia utile, per perfezionare
l'epressione.
@Alex
Ciao Alex, e saluti anche a Geppo ed Alessandro Cara che sono
intervenuti.
Con la tua funzione e l'origine messa in una casella di testo ho
risolto.
Grazie.
> Comunque non sapevo che i codici dei comuni potessero avere un
> alfanumerico nei tre digit, normalmente, numerici (pos. 13-15)
Scusa Alessandro ma i codici comuni sono formati da 4 caratteri di cui
il primo alfabetico e gli altri tre numerici posizione dalla 12ª alla
15ª posizione nel codice fiscale.
> Il controllo dovrebbe poi fallire se c'e' qualche spazio in fondo
Se la casella di testo contenente il codice fiscale è stata impostata
con una maschera di Input selezionata su codice fiscale e su evento
dopo aggiornamento viene impostata la funzione di controllo del codice
fiscale il problema non si pone.
Giusto?
Saluti.
Giuseppe.
Per chiunque possa interessare, il pattern cosi composto cosi sembra andare:
"^([A-Z]{6})(\d{2})([A-EHLMPR-T]{1})(70|71|[0-6]{2})([A-Z]{1})([0-9L-NPQ-V]{3})([A-Z]{1})$"
Il ^ indica che il controllo è da eseguirsi all'inizio della stringa..... la
cifra tra {} limita il controllo ai primi 6 caratteri che possono essere
solo lettere "maiuscole" (se si preferisce validare il codice anche con le
minuscole va modificata cosi ([A-Za-z]{6}) questo vale anche per il
controllo in altri punti del codice)
'=========
^([A-Z]{6})
'=========
controlla che dopo i primi 6 caratteri ci siano solo due cifre {2}
'=====
(\d{2})
'=====
questa controlla che dopo i primi 8 caratteri venga inserito il carattere
giusto ed uno solo "maiuscolo"{1}
'===============
([A-EHLMPR-T]{1})
'===============
questa controlla che dopo i primi 9 caratteri siano presenti solo due cifre
{2} comprese tra 0-6 oltre cui sono valide solo 70 e 71
'============
(70|71|[0-6]{2})
'============
questa controlla che dopo i primi 11 caratteri sia presente una sola lettera
{1} "maiuscola"
'=========
([A-Z]{1})
'=========
questa controlla che dopo i primi 12 caratteri siano presenti solo 3
caratteri composti da numeri compresi tra 0 e 9 e dalle lettere comprese tra
L a NPQ a V
'==============
([0-9L-NPQ-V]{3})
'==============
questa controlla che alla fine della stringa sia presente un solo carattere
(la fine della stringa viene indicata dal carattere $)
'=========
([A-Z]{1})$
'=========
Uno spettacolo queste "Regular Expression" che di certo meritano un
approfondimento.
Grazie @Alex
--
Ciao
Geppo
Questo e' quello che sapevo anch'io ma il "pattern" postato da @Alex,
per quelle posizioni, afferma tutt'altro (cfr post di Geppo con la
spiegazione del pattern)
--
ac (x=y-1)
'======questa =====================
> questa controlla che dopo i primi 12 caratteri siano presenti solo 3
> caratteri composti da numeri compresi tra 0 e 9 e dalle lettere
> comprese tra L a NPQ a V
> '==============
> ([0-9L-NPQ-V]{3})
> '==============
diventa:
questa controlla che dopo i primi 12 caratteri siano presenti solo 3
caratteri composti da numeri compresi tra 0 e 9
'==============
([0-9]{3})
'==============
pertanto il "pattern" corretto è:
"^([A-Z]{6})(\d{2})([A-EHLMPR-T]{1})(70|71|[0-6]{2})([A-Z]{1})([0-9]{3})([A-Z]{1})$"
Infatti è giusto quello che dite.......sono io che non corretto il
"pattern".
Pardon
--
Ciao
Geppo
Ho scritto che il codice non era mio e non l'ho testato..., ma visto
che ora lo avete fatto voi... lo aggiorno.
@Alex
Scusate l'ignoranza ma io ho sempre utilizzato su evento prima di
aggiornare della casella di testo contente il codice fiscale
Dim Msg As Integer
If Len(Me.codfisc) > 11 Then
If CheckCodFiscale(codfisc) = False Then
Msg = MsgBox("Codice Fiscale errato. Proseguire ugualmente?",
vbYesNo, "CF errato")
If Msg = 6 Then
Cancel = False
Exit Sub
Else
Cancel = True
Exit Sub
End If
Else
Cancel = False
Exit Sub
End If
con la
Public Function CheckCodFiscale(CFis As String) As Boolean
'Autore: Federico Luciani
'Accetta: CFis = Codice fiscale da verificare
'Restituisce: true se il Codice fiscale è corretto
'Modificata da Giovani Menga
ecc..... presa dal sito comune.
Questo thread, partito con il problema delle prime due cifre
dell'anno, è scivolato, credo, sul codice da usare per il controllo
del codice fiscale inserito.
E' così? Devo sostituire la funzione di cui sopra con il codice di
questa discussione o si deve integrare in qualche altro evento?
Vi prego di togliere questo dubbio a me e credo anche a coloro che
seguono il gruppo.
Grazie.
Giuseppe.
'Restituisce: true se il Codice fiscale č corretto
'Modificata da Giovani Menga
ecc..... presa dal sito comune.
Questo thread, partito con il problema delle prime due cifre
dell'anno, č scivolato, credo, sul codice da usare per il controllo
del codice fiscale inserito.
E' cosě? Devo sostituire la funzione di cui sopra con il codice di
questa discussione o si deve integrare in qualche altro evento?
Vi prego di togliere questo dubbio a me e credo anche a coloro che
seguono il gruppo.
Grazie.
Giuseppe.
____Risposta:
Questo cdice č sufficiente (ovviamente reintroducendo la parte che ha
tolto.
Seguiamolo:
"If Len(Me.codfisc) > 11 Then"
primo controllo č che sia maggiore di 11...
qui probabilmente lui verfica che tu non abbia un codice fiscale uguale alla
partita iva
se č cosě,
verifica il codice fiscale chiamando la funzione di sotto
" If CheckCodFiscale(codfisc) = False Then"
se č sbagliato lui ti avvisa ma non ti blocca (č possibile che scceda,
quando il ministero ha riscontrato una omocodia e da un codice fiscale
diverso)
se scegli sě č ok
se invece il test č positivo lui usa cancel = false (questo probabile perchč
ha usato l'evento codicefiscale_beforeupdate)
quindi questo codice funziona
Vai perň su AccessGroup.it c'č (se on ricordo male) un articolo di Sv che ha
notato un piccolo bug su questa funzione
MA
Controllo *solo* formale e non *da* usare obbligatoriamente e' solo un
altro modo per farlo.
Di funzioni per il controllo del CF se ne trovano a dozzine, vanno tutte
bene - se funzionano -. Quello postato da @Alex, in particolare, usa le
espressioni regolari. E' impreciso nella gestione del giorno di nascita
(fa *passare* i giorni da 32 a 36 e non li relativizza al mese) ma non
e' nello scopo del pattern, credo, controllare in maniera *fine* la
validita' del CF.
--
ac (x=y-1)
Questo risolve il problema dei giorni e gli spazi alla fine:
"^([A-Za-z]{6})(\d{2})([A-EHLMPR-Ta-ehlmpr-t]{1})(3[0-1]|2[0-9]|1[0-9]|0[1-9])([A-Za-z]{1})([0-9]{3})([A-Za-z]{1})
*$"
--
Ciao
Geppo
Hanno ragione le donne ad incavolarsi e chiedere che ci sia parita' di
diritti!
--
ac (x=y-1)
> Hanno ragione le donne ad incavolarsi e chiedere che ci sia parita' di
> diritti!
Porca Pupazza, poi de sti tempi:
(3[0-1]|2[0-9]|1[0-9]|0[1-9]|4[1-9]|6[0-9]|7[0-1])
P.S.: Maestro, visto che hai il cosiddetto "occhio clinico", se riscontri
altre anomalie ti prego di "spararle" tutte insieme.
Grazie
--
Ciao
Geppo
> "If Len(Me.codfisc) > 11 Then"
> primo controllo che sia maggiore di 11...
> qui probabilmente lui verfica che tu non abbia un codice fiscale uguale alla
> partita iva
Si Alex è così.
> se sbagliato lui ti avvisa ma non ti blocca
nel mio caso è sufficiente. Anche perchè chi deve inserirlo è
avvertito e gli dò la possibilità di ricalcolarlo visto che ho
implementato nel db la form e la funzione che esegue il calcolo.
> Vai per su AccessGroup.it c' (se on ricordo male) un articolo di Sv che ha
> notato un piccolo bug su questa funzione
Lo farò sicuramente.
Grazie.
Giuseppe.
Mi sembra, e bada bene oggi e' l'8 marzo, che hai *ammazzato* tutte
quelle nate tra il 10 ed il 19.
--
ac (x=y-1)
è una battuta? Non l'ho capita.
Se non è una battuta non ho capito cosa intendi.
--
Ciao
Geppo
--
ac (x=y-1)
ecco, si hai ragione .... non avendo fatto copia/incolla, facevo il "test"
su quella corretta e non capivo.
Copia / incolla:
"^([A-Za-z]{6})(\d{2})([A-EHLMPR-Ta-ehlmpr-t]{1})(3[0-1]|2[0-9]|1[0-9]|0[1-9]|4[1-9]|5[0-9]|6[0-9]|7[0-1])([A-Za-z]{1})([0-9]{3})([A-Za-z]{1})
*$"
questa va.
Grazie ancora
--
Ciao
Geppo
Comunque potrebbe (dovrebbe) esserci anche un flag di "case insensitive"
--
ac (x=y-1)
Si, effettivamente c'è un flag ma non credo sia possibile utilizzarlo in
questo "ambiente".
--
Ciao
Geppo