1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| Public Function NuméroterLignesFormulaire(NomDuContrôle As Control)
'NB ceci s'inspire très largement de GetLineNumber
' voir : http://support.microsoft.com/kb/120913/fr
'Exemple pour la source d'un contrôle :
' LeContrôlePourNuméroter =NuméroterLignesFormulaire([ztDateAchat])
Dim sSQL As String, RS As DAO.Recordset, CountLines As Long
Dim loParent As Object
' Recherche le formulaire parent
' Boucle nécessaire au cas où le parent du contrôle soit
' un contrôle à onglet par exemple
Set loParent = NomDuContrôle
Do
Set loParent = loParent.Parent
If TypeOf loParent Is Access.Form Then
Exit Do
End If
Loop
'construire un Recordset égal à celui de la source du formulaire
If Left(loParent.RecordSource, 6) = "SELECT" Then 'la source est une requête
sSQL = loParent.RecordSource
Else 'la source est une table
sSQL = "SELECT * FROM " & loParent.RecordSource & ";"
End If
Set RS = CurrentDb.OpenRecordset(sSQL)
'Rechercher le type de donnée pour choisir la bonne syntaxe de comparaison
Select Case RS.Fields(NomDuContrôle.ControlSource).Type
Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, DB_DOUBLE, DB_BYTE 'c'est donc numérique
RS.FindFirst "[" & NomDuContrôle.ControlSource & "] = " & NomDuContrôle
Case DB_DATE 'c'est une date
RS.FindFirst "[" & NomDuContrôle.ControlSource & "] = #" & Format(NomDuContrôle, "mm/dd/yy") & "#"
Case DB_TEXT 'si c'est du texte (le texte ne peut contenir de double quotes (")
'par contre, l'apostrophe (') est permise
RS.FindFirst "[" & NomDuContrôle.ControlSource & "] = """ & NomDuContrôle & """"
End Select
' remonter jusqu'au début en comptant les lignes.
Do Until RS.BOF
CountLines = CountLines + 1
RS.MovePrevious
Loop
' on restitue le résultat
NuméroterLignesFormulaire = CountLines
' Fermeture du Recordset
RS.Close
End Function |
Partager