L'approche manuelle

Avant de lancer des usines à gaz ;) souvenez-vous, lorsque vous êtes sur un champ de saisie, que la combinaison de touches Ctrl + " (guillemets) reprend la valeur du même champ, pour le dernier enregistrement saisi.

Ça fonctionne au niveau des tables, des requêtes et des formulaires. Sur tous les écrans où vous pouvez faire de la saisie, en résumé !

L'approche automatique

On peut automatiser tout ça, pour les cas où vous devez dupliquer plusieurs champs en une fois. Il y a plusieurs façons de faire, en voici une qui se veut réutilisable sur différents formulaires.

Commencez par recopier ce bloc de code dans un module standard de votre base de données :

' ---
' DUPLIQUER UN ENREGISTREMENT
' ---
'
Sub DupliquerEnregistrement( _
    frm As Access.Form, _
    avarChamps As Variant, _
    Optional ByVal blnFin As Boolean = True)
   
    ' Quelques variables...
    Dim rst As DAO.Recordset
    Dim varChamp As Variant
   
    ' Source de données du formulaire
    On Error Resume Next
    Set rst = frm.RecordsetClone
   
    ' Se positionner en début ou en fin de table
    If blnFin Then
        rst.MoveLast
    Else
        rst.MoveFirst
    End If
   
    ' Transférer les données
    If rst.EOF Then
        MsgBox "Aucune donnée à dupliquer !", vbInformation
    Else
        For Each varChamp In avarChamps
            frm(varChamp) = rst(varChamp)
        Next
    End If
   
    ' Libérer les ressources
    Set rst = Nothing
End Sub

Cette procédure reçoit 3 arguments, dont le dernier est facultatif :

  1. L'objet Formulaire concerné par la duplication d'enregistrement.
  2. La liste des champs à dupliquer. En effet, il n'est généralement pas nécessaire de dupliquer un enregistrement entier (ne serait-ce que la clef primaire). Et d'ailleurs, dupliquer un enregistrement entier est généralement une mauvaise pratique dans une base de données.
  3. Une valeur booléenne qui vaut True si on doit dupliquer le dernier enregistrement (c'est le cas par défaut) ou False s'il faut dupliquer le premier enregistrement de la table (au cas où !).

Mise en place

Maintenant que le bloc Sub / End Sub est en place dans votre base, vous pouvez l'utiliser sur différents formulaires. Imaginez un formulaire avec des champs Nom, Prénom, Email, Adresse, Code postal, Ville, etc. Voici une application sur ce formulaire :

  1. Créez un bouton sur ce formulaire, et donnez-lui un nom (dans mon cas : btnValeursPrecedentes ; oui, je sais, c'est long ! :)).
  2. Faites apparaître le code VBA de l'événement Sur clic du bouton, et modifiez-le comme ci-dessous. Remplacez bien sûr les noms de champs par vos champs réels, dans la variable avarChamps.
Private Sub btnValeursPrecedentes_Click()
    Dim avarChamps As Variant
   
    ' La liste des champs à dupliquer
    avarChamps = Array("Nom", "Prénom")
   
    ' On appelle la procédure de copie
    DupliquerEnregistrement Me, avarChamps
End Sub

Passez en mode Formulaire, sur un enregistrement vide, cliquez sur le bouton, et dites "Ooooh !" :)

Si vous souhaitez dupliquer les champs du premier enregistrement de table (au lieu du dernier par défaut), remplacez la ligne de copie par :

DupliquerEnregistrement Me, avarChamps, False
Note

Le code VBA suppose que votre formulaire est un formulaire dépendant (donc lié à une table ou requête), et que les champs du formulaire ont le même nom que les champs de la table associée.

C'est le cas presque tout le temps, notamment si vous avez construit votre formulaire via l'Assistant Access.