Numérotation personnalisée

Dans une table, je souhaite avoir une numérotation automatique de la forme 2009/001, 2009/002… Et surtout faire en sorte que cette numérotation reprenne à 1 l’année suivante : 2010/001, 2010/002, etc. Comment faire ?

Principe

Ce qui est déjà sûr, c’est que le NuméroAuto d’Access ne convient pas dans ce scénario. Les raisons ?

  • Un NuméroAuto est un champ numérique uniquement, il ne peut pas contenir de caractères particuliers.
  • Le NuméroAuto crée toujours une suite croissante, sans jamais repartir à 1.
  • Par définition, la gestion du champ est faite par Access, automatiquement. Vous ne pouvez donc pas décider de son comportement.

On va donc devoir écrire un bout de code VBA qui s’occupera de tout ça. Tant qu’à faire, il serait pratique que le numéro fourni soit le plus flexible possible. Notamment :

  • Pouvoir intégrer l’année et/ou le mois, entre autres.
    Du style : 2009.001, 2009.12.001
  • Pouvoir choisir l’ordre de ces informations.
    Exemple : 2009.12.001, ou 12.2009.001.
    Le numéro proprement dit – le 001 – sera par contre toujours à droite.
  • Pouvoir choisir le nombre de caractères pour la partie variable.
    Exemple : 2009.001, ou 2009.00001.
  • Pouvoir intégrer d’autres caractères dans le numéro complet :
    Exemple : ABC-2009-XY-12/001.
Remarque
Pour essayer d’être clair dans ce qui suit, j’appellerai « numéro complet » le résultat final renvoyé par la fonction (par exemple : ABC-2009.001).
La partie tout à droite (celle qu’on cherche à incrémenter) sera appelée « partie variable« .

La table

  • Puisqu’il s’agit de numéroter des lignes, vous disposez bien sûr d’une table (dans la suite : tblProduits).
  • Dans cette table, le champ à numéroter doit être de type Texte (puisqu’il pourra contenir des caractères quelconques), et non pas NuméroAuto.
  • Il doit aussi avoir une taille suffisante pour permettre la numérotation. Par exemple, pour des numéros de la forme ABC-2009-XY-12/001, votre champ sera de type Texte, avec au minimum 18 caractères.
  • Ce champ sera généralement la clef primaire de la table. Dans la suite, notre champ s’appelle Code Produit.
Info
En pratique, la table et sa clef primaire peuvent porter n’importe quel nom. Le code VBA qui vient permettra d’en tenir compte.

Le code

Recopiez le code qui suit dans un module standard de votre base de données :

Tester le code

  1. Placez-vous dans la fenêtre Exécution (CTRL + G).
  2. Tapez quelque chose comme :
    ? AutoNumber("tblProduits", "Code Produit", "[YYYY].")
  3. Validez par [Entrée].
    Vous devriez obtenir quelque chose comme :CAPTURE

Syntaxe de la fonction AutoNumber

La fonction AutoNumber() reçoit 5 paramètres. Seuls les 2 premiers sont obligatoires (mais sans le paramètre « Format », tout ça perd un peu de son intérêt !)

  • Le nom de la table à manipuler.
  • Le nom du champ à numéroter (donc généralement la clef primaire). Sans crochets.
  • Une chaîne de caractères décrivant le format du numéro complet, hors partie variable (voir plus loin).
  • Le nombre de chiffres de la partie variable, tout à droite du numéro final (par défaut : 4).
  • La date de référence pour le calcul des éléments temporels (voir plus loin aussi !). Par défaut : la date du jour.

Si tout ça n’est pas clair pour l’instant, consultez tout de suite le paragraphe Exemples, plus bas.

A propos du « format »

Le « format » est une chaîne de caractères qui va vous permettre de définir la composition du numéro final. L’avantage du système est sa grande flexibilité : vous pouvez choisir quelles informations placer dans le numéro, et dans quel ordre.
Le format est constitué d’une suite de caractères qui peuvent être :

  • des codes particuliers entre crochets, comme [YY], [YYYY] et quelques autres ;
  • n’importe quel autre caractère, à l’extérieur des crochets.

Exemples de combinaisons possibles

  • "" : le format le plus simple est une chaîne vide.
    Dans ce cas, le numéro est également simple : 0001.
  • "[YY]" : le numéro final doit démarrer par l’année (Y), sur 2 chiffres.
    Vous obtiendrez pour la 1ère facture de 2009 : 090001.
  • "[YYYY]" : le numéro final doit démarrer par l’année, sur 4 chiffres.
    Exemple : 20090001.
  • "[YY][MM]" : le numéro final doit démarrer par l’année et par le mois.
    Exemple : 09120001.
  • "[MM][YY]" : la même chose, mais inversée (sans doute moins pertinent… mais possible !).
    Exemple : 120900001.
  • "[YY]ABC[MM]" : le numéro final doit démarrer par l’année, suivie des lettres ABC, suivies du mois.
    Exemple : 09ABC12.

Le numéro final est construit de la manière suivante :

  1. On remplace tous les codes du format par leur valeur réelle (qui est fonction de la date).
    Par exemple, [YYYY] est remplacé par 2009, et ainsi de suite.
  2. Une fois le « préfixe » obtenu (exemple : 200912/), on cherche dans la table la valeur maximale correspondante (exemple : 200912/007
    ).
  3. On en déduit la partie variable (exemple : 008).
  4. On ajoute la partie variable à droite du préfixe. On obtient 200912/008.

Liste des codes disponibles

Les codes disponibles décrivent des portions de temps :

  • [YY] : année sur 2 chiffres.
  • [YYYY] : année sur 4 chiffres.
  • [Q] : trimestre, sur 1 chiffres (soit : 1, 2, 3 ou 4).
  • [MM] : mois, sur 2 chiffres (de 01 à 12).
  • [WW] : semaine, sur 2 chiffres (de 01 à 52).
  • [DD] : jour du mois, sur 2 chiffres (de 01 à 31).

Exemples

Voici quelques exemples qui illustrent le fonctionnement de AutoNumber dans la fenêtre Exécution. Ça vous donnera une idée des combinaisons possibles. Quand aucune date n’est précisée, il faut avoir en tête que les tests ont été faits en Novembre 2008.

La date de référence

Vous vous posez peut-être la question de la date de référence ? Dans une majorité des cas, vous omettrez effectivement ce paramètre, et le numéro sera calculé à partir de la date du jour.
Mais il se peut que vous ayez besoin de déclencher une numérotation indépendante de la date du jour. Du genre : j’émets une facture le 20/12/2008, mais elle doit être imprimée et comptabilisée en janvier 2009. Dans ce cas, vous pourriez écrire :

Vous obtiendrez 200901.001, quelle que soit la date du jour.

Rappel
Si la date est passée directement, elle doit être au format #mm/jj/aaaa#. Consultez cet article pour plus d’infos. S’il s’agit d’un champ de table ou de formulaire, aucune conversion n’est nécessaire, par contre.

Le formulaire de saisie

Maintenant que vous voyez le principe de fonctionnement, il reste quand même à automatiser la numérotation !

  1. Construisez un formulaire reposant sur votre table tblProduits (ou sur une requête elle-même est basée sur la table).
  2. Ouvrez le formulaire en mode Création.
  3. Faites apparaître les propriétés du formulaire (et pas d’un objet du formulaire), onglet Événement.
  4. Cliquez dans l’événement Avant MAJ, et réglez-le sur « Procédure événementielle« , à l’aide de la liste déroulante.
  5. Cliquez sur les points de suspension à droite de l’événement, vous obtenez le code VBA associé.
  6. Aménagez le code pour qu’il ressemble à :

Remplacez bien sûr les paramètres en fonction de votre table. Ici, si vous avez suivi, on décide que les numéros de produits auront la forme ABC09.01 en 2009, ABC10.01 en 2010, etc.

Attention
Si vous modifiez la table en direct (sans passer par le formulaire), la numérotation est à votre charge. Il n’y a qu’au niveau du formulaire qu’elle est automatique.
Remarque

Vous aimerez aussi...

145 réponses

  1. FEDERHPIL Gérald dit :

    Bonjour Mr INISAN

    Tout d’abord je vous présente mes meilleurs voeux pour la nouvelle année.
    Voici mon problème:

    Dans un formulaire FACTURE, j’ai la possibilité de choisir entre une facture de type normale et une facture de type PROFORMA. En fonction du choix grace à un menu déroulant, j’ai mis un bouton avec évenement sur clic L’ insertion d’un numéro incrémenté utilisant la fonction AUTONUMBER, fonction que j’ai trouvé sur votre forum et grace à vos exlications. Aujourd’hui je souhaiterais aller plus loin, c’est à dire automatiser complètement en fonction du choix de l’utilisateur avec menu déroulant , soit FACTURE N°, soit FACTURE PROFORMA N°, en utilisant la fonction IFF, à ce jour je n’ai toujours pas trouvé la bonne syntaxe. ( le nom du déroulant = Type de facture).

    Voici les codes
    If IsNull(Me.Nrfacture) Then
    Me.Nrfacture = Autonumber(« Tblfactures », « Nrfacture », « FAC.[YYYY]. », 4)
    End If
    If IsNull(Me.Nrfacture) Then
    Me.Nrproforma = Autonumber(« Tblfactures », « Nrproforma », « FPF.[YYYY]. », 4)
    End If

    Pouvez vous m’aider ?

    Je vous en remercie par avance

    GERALD

    • Hervé Inisan dit :

      A vue de nez, ça pourrait donner quelque chose comme ceci :

  2. vikio dit :

    Bonjour …
    Au passage, cet article est très intéressant … merci merci !

  3. Gérald dit :

    Question : Est il obligatoire régler ce code sur l’évènement Avant MAJ ? est il possible de le déclencher à partir d’un bouton ? car je souhaiterais avoir deux numérotations différentes sur un même formulaire ? merci de votre réponse. Cordialement GERALD

    • Hervé Inisan dit :

      Ce n’est pas obligatoire effectivement (c’est juste plus ergonomique quand il n’y a qu’un numéro à affecter).
      Maintenant, les 2 numérotations sont à appliquer au même enregistrement de la table qui est « sous » le formulaire ?

      • Gerald dit :

        Merci pour votre réponse, il y aura deux champs différents, soit l’un, soit l’autre en fonction du genre d’enregistrement. ( soit devis, soit travail en régie). Donc il est possible d’affecter cette commande à un bouton ? Gerald

  4. Angel Lopez dit :

    Bonsoir,
    J’ai Trouvé la solution

    Me.idDates = AutoNumber(« TOperation », « IdDates », « [YY][MM][DD], », 4,[DateOperation])

    Merci
    Angel

    • Hervé Inisan dit :

      Effectivement, c’est comme ça qu’il fallait faire ! 🙂

      • Angel Lopez dit :

        Bonsoirs,
        J’ai un autre problème le champs recevant l’autoNumber est :
        taille : décimal
        Précision : 12
        Echelle :6
        Comment dois faire pour faire Fonctionner l’AutoNumber avec ce format
        Merci
        Cordialement
        Angel

        • Hervé Inisan dit :

          Comme indiqué dans l’article, le champ recevant la numérotation doit être de type Texte, parce qu’il peut contenir des caractères alphanumériques. Par conséquent, ça ne marchera pas avec un type numérique.

          • Angel Lopez dit :

            Bonjour,
            Merci pour votre réponse rapide.
            Accepteriez vous de m’aider?
            J’ai adapté une base Access 2010 pour gérer mes comptes ; elle Fonctionne bien, mais je suis limité par la rigidité de celle ci concernant les stats et aussi le mode de saisie des données ne me conviens pas .
            J’ai donc crée un formulaire de saisie . le module qui effectue la Numero par IdDate est le suivant pensez vous que je puisse déclencher cette action à partir d’ un formulaire indépendant .
            J’utilise cet utilitaire à titre personnel
            Un Oui ou non serait bien un fils conducteur Mieux
            Le Module :
            Private Function NextIdDate(vvCompte As Long, vvDate As Date)
            Dim vid As Double
            Dim rst As Recordset

            Set rst = vgDb.OpenRecordset(« SELECT Max([idDate]) AS MaxId From TOperation Where IdCompte =  » & vvCompte &  » AND cdbl(DateOperation) = » & CDbl(vvDate))
            If rst.EOF Then
            vid = CDbl(vvDate)
            Else
            vid = CDbl(Nz(rst.Fields(« MaxId »), vvDate))
            End If
            ‘ Si l’entier de Vid = 0 Alors on revoit la vvDate + 0.0001 Sinon La nouvelle valeur + 0.0001
            NextIdDate = IIf(Int(vid) = 0, CDbl(vvDate), vid) + 0.0001

            Exit Function

            End Function

            Merci de votre aide
            Cordialement

          • Hervé Inisan dit :

            Si ce module est un module standard et que la fonction doit être appelée ailleurs, il ne faut pas qu’elle soit Private. Sinon, je ne vois pas dans le code quelque chose qui poserait problème pour l’exploiter ailleurs (le fait que la fonction renvoie un Double ne me semble pas si pratique, mais je ne connais pas le projet).
            J’imagine aussi que le formule où la fonction sera utilisé sera plutôt dépendant qu’indépendant ?

  5. Angel Lopez dit :

    Bonsoir ,
    je viens de mettre en oeuvre votre excellent code, cela fonctionne bien , mais je souhaiterai que cet autoNumber soit crée non pas à partir de la date du jour mais à partir de la date de saisie de mon Formulaire [DateOperation]
    Cela est il réalisable
    je ne suis pas très doué en VBA voir Nul
    Merci de votre aide
    Cordialement
    Angel

  6. Gamain dit :

    Bonjour,
    j’ai une question rattachée à ce sujet et je ne trouve pas de réponse dans la discussion.
    La base concernée est sous Access 2013.
    Un table T_Produits contient le champ [Produit]
    Une autre table rattachée à la précédente comme sous-feuille de données contient le même champ [Produit], et un champ [ingrédients]
    Un Produit comporte un nombre variable d’ingrédients => plusieurs enregistrements d’ingrédients pour un même produit.
    Je souhaite créer une requête qui attribuera un n° de rang à chaque ingrédient. Ce numéro de rang doit redémarrer à 1 pour chaque produit.
    Merci d’avance pour l’aide que vous pourrez m’apporter.
    Je ne sais pas (ou très peu) travailler en VBA.
    Pascal

    • Hervé Inisan dit :

      Le numéro de rang est ici pour des raisons graphiques (« voir une séquence » à l’écran), ou pour des raisons de gestion (« stocker le numéro dans la table ») ?

      • ThiBat dit :

        Bjr RV, merci pour la solution que vous proposez mais la question posée par Gamain correspond exactement à ma problématique et je ne sais pas si vous en avez apporté la réponse ?
        Mon pb : G d directions qui recrutent chaque année, selon un quota, je souhaiterai créer une table de suivi avec un incrément comme par ex : 2015-DIRx-001 et donc qui se ré-incrémente pour l’année et la direction.
        Si vous avez donné une rep à Gamain, elle m’intéresse bcp.
        Merci par avance pour votre réponse.
        Cordialement, ThiBat

        • Hervé Inisan dit :

          Si j’ai suivi, cet autre article devrait répondre au problème. L’idée étant de faire en sorte que le format soit du style « [YYYY]-DIR?-« , à vue de nez, si x est un seul caractère/chiffre variable. Ca peut aussi être « [YYYY]-????-« , si on peut extraire complètement DIRx de l’enregistrement.

  7. Mélis dit :

    Bonjour,

    Merci beaucoup pour ce tutoriel très efficace.
    Cependant, j’ai une erreur que je n’arrive vraiment pas à résoudre…
    Lors de l’exécution du code TEST, l’erreur suivante s’affiche :
    « Impossible d’obtenir les champs Memo, OLE, ou Hyperlink Object dans l’argument d’agrégat [le nom de la colonne de la table que je veux modifier].
    Auriez-vous une piste pour résoudre cette erreur ?

    Le champs dans ma table est un type Texte long.

    Je vous remercie beaucoup !

    Mélis.

  8. SODRE Kassoum dit :

    Merci pour cet forum.
    1. J’ai suivi toutes les instructions et tous les tests. Et tout marche. Mais mon problème c’est que le N° ne change pas. Il ne fait que répéter le même N° (2015.0001).

    Je précise que c’est un nouveau champ que je viens de créer dans une table ayant auparavant des enregistrements. Je suis à l’enregistrement N°30 et je voulais que la numérotation automatique commence par 2015.0031 et suite.
    2. Si ça marche, comment régler ce problème de cette numérotation dans un système réseau que vous avez évoquer dans vos commentaires ci-dessous?

    Merci d’avance.

    • Hervé Inisan dit :

      Est-ce que le formulaire de saisie contient le code qui va bien ?

    • Christina dit :

      Bonjour, j’ai le même problème que SODRE Kassoum, le numéro ne change pas dans mon formulaire, du coup impossible de créer de nouveau enregistrement.

      • Hervé Inisan dit :

        Je n’ai pas assez d’infos pour diagnostiquer… 😉
        Est-ce que la fonction s’exécute dans la fenêtre Exécution ?
        Comme précédemment : est-ce qu’il y a le code qui va bien dans le formulaire ?

        • Christina dit :

          🙂 Et bien la fonction s’exécute dans la fenêtre d’Exécution mais si j’appuie plusieurs fois sur entrée cela reste à 0001 (Je ne sais pas si ça peut aider).
          Le code est bien dans le formulaire, dès que je fais une nouvelle saisie, le numéro est bien généré comme je l’ai indiqué mais reste sur 0001 à la fin pour chaque nouvel enregistrement. :/ Le message est donc le suivant : « Modification non effectuées risque de doublons… » Alors en attendant je change le numéro manuellement .

          • Christina dit :

            Finalement après plusieurs tests cela fonctionne avec une autre table. Donc je pense que j’ai un problème de relation !! Je vais bien finir par trouver ! Merci!

          • Hervé Inisan dit :

            C’est une piste : ça veut dire que la structure est en place et marche. Maintenant, je vérifierais le code du formulaire, le type de données de la clef primaire, entre autres choses.

          • Hervé Inisan dit :

            Dans la fenêtre Exécution, le numéro renvoyé sera toujours le même (c’est normal, puisque le test dans cette fenêtre extrait un numéro, mais n’écrit rien dans la table, donc n’incrémente pas le prochain numéro).

  9. henry dit :

    Bonjour, un grand merci pour ce compteur perso.
    J’ai une question, je veux l’appliquer une numérotation auto sur mes lignes de bl, afin de gérer le colisage. je souhaite avoir l’incrémentation sur les numéros de colis du BL.
    Sauf que la numérotation se fait sur le total des toutes les lignes de la table et non que sur les lignes de mon BL.
    Avez-vous une idée pour mon problème ?
    Merci

    • Hervé Inisan dit :

      Je ne connais pas la structure des tables, donc c’est difficile de répondre.
      Pour info : quel est le code qui déclenche la numérotation ?
      (le code du BeforeUpdate)

      • henry dit :

        Bonsoir Hervé,
        Je sais pas si je me suis fait comprendre lors de mon dernier message.
        J’en suis désolé.

        Dans mon sous formulaire colis pour le numéro de colis voilà ce qui
        déclenche la numérotation :
        Private Sub Form_BeforeUpdate(Cancel As Integer)
        If IsNull(Me.Num_colis) Then
        Me.Num_colis = AutoNumber(« TB_Colis », « Numcolis », «  »)
        End If
        End Sub

        Vous faut-il une autre information ?

        Par avance merci.
        Henry

  10. Adn dit :

    Simple et efficace merci

  11. Christina dit :

    Bonjour,
    C’est super, cela fonctionne très bien!! En revanche je souhaiterai après modification d’un champs dans mon formulaire faire apparaitre dans un message le numéro personnalisé (et non pas le numéro se trouvant en bas de me formulaire) avez-vous une solution ?

    Cordialement,

    • Hervé Inisan dit :

      A priori, comme le numéro personnalisé est stocké dans un champ de la table (dans mon exemple : Code Produit), il suffit d’afficher ce champ sur le formulaire. Si la valeur du champ est modifiée, elle s’affichera automatiquement à l’écran.

  12. Ouattara dit :

    Bonjour
    Le tutoriel est tres efficace. Je n’arrive pas à l’intégrer dans mon formulaire puisque le module n’est pas lié au formulaire. Comment je dois proceder svp?

  13. Guylaine dit :

    Bonjour,
    Je tiens à vous remercie pour cet article car je suis débutante et je ne maitrise pas du tout le language VBA, ces explications me sont très utile car, c’est exactement ce que je recherche depuis au moins trois semaines. Sur mon formulaire de location, on me demande d’insérer un n°facture sur forme 0001. Tout ce qu’il y a de plus simple ! Car, j’imagine que le code devrait se simplifié ? Toutefois, je n’y arrive pas. J’ai recopier le code ( sans rien changer) dans un module standard de ma base de données et j’ai automatisé la numérotation Avant MAJ avec le code en fonction de ma table:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
    If IsNull(Me.N°FACTURE) Then
    Me.N°FACTURE = AutoNumber(« T_Contrat », « N°FACTURE », «  », 4)
    End If
    End Sub

    Est ce que vous pouvez m’indiquer ce qui doit être modifier s.v.p.?
    Merci infiniment de votre aide.

    • Hervé Inisan dit :

      Vu de loin, ça m’a l’air pas mal. Je me méfierais simplement du ° dans le nom de champ (mais ça peut passer). Du coup, j’écrirais ça :

      Qu’est ce qui ne fonctionne pas exactement ? (y a-t-il un message d’erreur ?)
      Sinon, pour mémoire : il faut créer un enregistrement et valider la saisie pour que le numéro soit appliqué.

      • Guylaine dit :

        Bonjour Hervé,
        Merci beaucoup pour ton aide ! Après avoir entrée le code et automatisé la numérotation, il n’y avait plus de message d’erreur. Cependant, au lieu d’avoir la forme 0001, je n’avais que 1 comme n°facture. Je ne peux pas vous dire exactement ce qui c’est passé, mais j’ai recopié le code que vous m’avez donné comme suit :

        Option Compare Database

        Private Sub Form_BeforeUpdate(Cancel As Integer)
        If IsNull(Me![N°FACTURE]) Then
        Me![N°FACTURE] = AutoNumber(« T_Contrat », « N°FACTURE », «  », 4)
        End If
        End Sub

        Private Sub N°FACTURE_BeforeUpdate(Cancel As Integer)
        If IsNull(Me![N°FACTURE]) Then
        Me![N°FACTURE] = AutoNumber(« T_Contrat », « N°FACTURE », «  », 4)
        End If
        End Sub

        Et après avoir enlevé la « source contrôle » pour que la zone de texte devienne « indépendant ». Ça fonctionne… Alors, je vous remercie infiniment pour votre aide.

        • Hervé Inisan dit :

          Content que ça marche. 🙂
          Pour chipoter : seule la première procédure (Sub) est utile, à savoir cette partie :

          Si les deux sont présentes, ce n’est pas très grave, mais ça fait redondance (donc plus de maintenance du code à terme).
          D’autre part, ça devrait quand même marcher si la « Source Contrôle » est « N°Facture ».
          Pour compléter : est-ce que le champ, dans la table, est bien de type Texte ?

          • Guylaine dit :

            Très bien je vais essayé de garder seulement la première procédure.
            Oui la “Source Contrôle” était “N°Facture” dont le champ dans la table est de type NuméroAuto ! Alors, pour que cela fonctionne, je dois mettre mon champs de type texte , c’est bien ça ?

          • Hervé Inisan dit :

            Oui, il faut bien un champ de type Texte. Comme il est indiqué dans l’article, un NuméroAuto ne convient pas ici, puisqu’on ne peut pas passer par la numérotation d’Access. Et comme le champ peut potentiellement contenir des caractères (il est formaté, d’une manière générale), il faut un type Texte.

      • lenoir dit :

        Bonjour HERVE INISAN
        merci pour votre publication
        pouvez m’aider si je devais appliqué ce formatage sur une facture.

        explication

        je travailles sur une facture
        et j’aimerais avoir après la mise à jour de mon champs designation
        Si unité = ‘M3’ or ‘KG’
        le champs
        le format Quantité s’affcihe 0,000
        122,000
        et SI unité = ‘M2’
        le format Quantité s’affcihe 0,00
        122,00
        SI unité = ‘ML’ OR ‘U’
        le format Quantité s’affcihe 0
        122

        • Hervé Inisan dit :

          Dans un cas comme celui-là, je verrais plus loin, parce que le système va s’étendre. L’idéal serait :
          1. De créer une table des unités.
          2. Cette table aurait comme champs :
          – Id
          – Unité
          – Décimales (ou Format, à voir)
          3. De relier cette table à la table Produits ou Détail de facture (selon l’endroit où on veut utiliser l’unité et son arrondi).
          4. De faire en sorte de formater la valeur de façon uniforme (par une fonction Access ou une fonction VBA spécifique, à voir aussi).
          Un peu plus long à caler, mais plus extensible puisqu’on peut imaginer toutes sortes d’unités, avec leur arrondi propre, et sans un seul « Si ».

          • lenoir dit :

            merci pour votre reponse.
            j’essais cette proposition
            mais pouvez vous calé une condition
            me premettant d’appliquer cela sur un Etat
            car c’est le resultat fininal qui est vraiment important.

            moi j’ai pensez à un module pour gérer cette condition dans l’affichage de la quantité en fonction de l’unité dans l’Etat de ma facture fininal,
            mais problème de syntaxe
            merci de m’aider si il ya une possibilité

          • Hervé Inisan dit :

            Pour faire simple, je suppose :
            – que l’unité est liée à un champ qui donne le nombre de décimales (j’appelle ce champ [Décimales]),
            – que ce champ est disponible sur l’état.
            On peut alors faire un formatage dynamique avec un champ calculé dont la formule serait :

            La fonction FormatNumber() a d’autres paramètres si nécessaire (sinon, par défaut, elle utilise le paramétrage du panneau de configuration).

  14. Hervé Inisan dit :

    mel > Pas directement : la numérotation personnalisée fournie ici repose sur les tables Access. Pour l’utiliser dans Excel, il faudrait adapter un peu le code de façon à travailler sur des feuilles/cellules.

  15. mel dit :

    Merci Hervé, je pense que ça fait un by. j’espère que vs vs portez bien, et bonjour la communauté.
    juste une question : « Est-il possible d’utiliser la numération personnalisée sur un userform Excel ? » si oui comment ?

  16. Hervé Inisan dit :

    JY > Super ! 🙂

  17. JY dit :

    Excellent!
    Je ne maîtrise pas le VBA, je ne comprends pas toutes les étapes du processus, mais l’exposé est clair et l’application fonctionne conformément à ce que je souhaitais. Merci!

  18. Hervé Inisan dit :

    Asfour > Super ! 🙂

  19. Asfour dit :

    Merci Beaucoup Hervé ça ma vraiment aide j’ai fait le test et tout fonctionne…

    Merci beaucoup

  20. Hervé Inisan dit :

    Asfour > Cet autre article du blog doit correspondre à ta question. Bons tests !

  21. Asfour dit :

    bonjour,

    Je souhaitais vous remercier grandement pour votre article, ça ma vraiment aide mais j’ai un petit problème.
    enfaîte je l’utilise pour le numéro de facture mais le numéro il se remet a zéro tous les mois
    exemple:2014 01 0001 et le 2eme moi 2014 02 0001.

    je veux qu’il continue le numéro auto et il change seulement le moi exemple si je suis a la facture 10 30 janvier le numéro de la prochaine facture donc en février sera 2014 02 00011 et pas 2014 02 0001

    Merci

  22. Hervé Inisan dit :

    Nanille > J’ai publié un nouvel article qui devrait répondre à ta question. C’est ici !

  23. Nanille dit :

    Bonjour,

    Je me suis basée sur votre code pour essayer de créer mon numéro auto qui est basé sur le principe de récupérer les 3 premières lettres de 2 champs de ma table et d’y ajouter une incrémentation de numéro.
    Je pensais avoir réussi, mais en réalité, il doit y avoir un problème avec le code pour trouver la valeur maximal du numéro dans le champs, car quand je rempli mon formulaire, seul le numéro 0002 s’affiche, qu’il n’y ait pas encore de code de 6 lettres ( le numéro devrait alors être 0001), qu’il y ait un 0001, qu’il y ait un 0004…
    Vous est-il possible de regarder mon code et voir s’il y a un soucis dedans ?
    Le voici :

    ‘ —
    ‘ NUMEROTATION AUTOMATIQUE PERSONNALISEE
    ‘ —
    ‘ Entrée : strTable <- Nom de la table.
    ‘ strField <- Nom du champ contenant le numéro
    ‘ strFormat <- Gabarit décrivant comment formater
    ‘ le numéro.
    ‘ intDigits <- Nombre de caractères pour le
    ‘ numéro proprement dit.
    ‘ dtDate <- Date de référence pour le calcul
    ‘ de l’année, du mois…

    Function AutoNumber( _
    ByVal strTable As String, _
    ByVal strField As String, _
    Optional ByVal strFormat As String = «  », _
    Optional ByVal intDigits As Integer = 4, _
    Optional ByVal dtDate As Date = #1/1/100#)

    ‘ Quelques variables…
    On Error GoTo AutoNumberErr
    Dim varMarkers As Variant, varMark As Variant
    Dim strCriteria As String
    Dim strNum As String, lngNum As Long, strPart As String

    ‘ Quelques retraitements…

    strField = « [ » & strField & « ] »
    strFormat = Replace(strFormat, « ‘ »,  » » »)

    ‘ On cherche la valeur maximale déjà employée dans la table
    strCriteria = strField &  » LIKE ‘ » & strFormat & « *' »
    strNum = Nz(DMax(strField, strTable, strCriteria), «  »)

    ‘ On crée le nouveau numéro
    lngNum = IIf(strNum = «  », 1, Val(Mid(strNum, Len(strFormat) + 1)) + 1)
    strFormat = strFormat & Format(lngNum, String(intDigits, « 0 »))

    ‘ Valeur finale
    AutoNumber = strFormat
    Exit Function

    AutoNumberErr:
    MsgBox « Erreur :  » & Err.Description, vbCritical
    AutoNumber = «  »
    Exit Function
    End Function

    Private Sub Famille_AfterUpdate()

    If IsNull(Me.Clé_espèce) Then
    strTable = Table_espèce
    strField = Clé_espèce

    strCode = AutoNumber(« Table_espèce », « Clé_espèce », « ?????? », 4)
    strCode = Replace(strCode, « ?????? », Format(Mid$([Embranchement], 1, 3), « > ») & Format(Mid$([Famille], 1, 3), « > »))
    Me.Clé_espèce = strCode
    End If

    End Sub

    Merci en tout cas de tous ces articles sur access, étant débutante en la matière, ils me sont d’une grande utilité.

  24. Hervé Inisan dit :

    Sinoe > Comme le numéro est calculé côté client, il peut y avoir deux numéros identiques en cas d’accès strictement simultané. Mais comme le champ est une clef primaire, il est possible d’ajouter des tests si ça devait se produire…

  25. Sinoe dit :

    Merci pour ce petit programme, juste une question.
    Marche t’il en reseau

  26. Hervé Inisan dit :

    Nizalwey > Merci, ça fait toujours plaisir ! 🙂

  27. Nizalwey dit :

    Bonjour,

    Je souhaitais vous remercier grandement pour votre article. Je n’ai jamais vu de tutoriel plus explicite est aussi bien expliqué que le vôtre. Tout marche du tonnerre, j’ai compris immédiatement après votre explication et je peux même dire queça fais du bien d’avoir enfin des codes pondus par d’autres qui marchent instantanément ( ou je cherche peu être très mal… )

    Bref, merci encore et très bonne continuation !

  28. Moha dit :

    Bonjour
    Je tiens à vous remercier Mr Hervé pour votre aide tous marche bien.
    Pour la question de Sylvie, j’ai associé le code à un bouton appeler « Numéroter » qui déclenche la numérotation sur un clic avant la validation et l’enregistrement des donnée c’est comme ça que le n° s’affiche.

  29. Hervé Inisan dit :

    sylvie > Le phénomène est normal : l’événement qui déclenche le calcul du numéro est appelé juste avant le transfert des données vers la table (Form_BeforeUpdate).

    Il y a plusieurs pistes pour améliorer l’ergonomie :

    1. Si l’utilisateur a un doute, il peut appuyer sur Maj + Entrée, ce qui force le transfert manuellement. Ça enregistre les données du formulaire (pas le formulaire lui-même). Ça peut d’ailleurs s’automatiser, sous forme d’un bouton « Enregistrer« , par exemple.
    2. Pour que l’utilisateur ne soit pas tenté de renseigner cette zone, je verrouillerais le champ (propriétés : Verrouillé = Oui, Activé = Non, et une couleur de champ spécifique pour le différencier des autres).
  30. sylvie dit :

    Bonjour,
    Je rencontre la difficulté suivante : lorsque je saisis un enregistrement dans un formulaire où j’ai défini une numérotation automatique avec un format spécifique, aucun numéro ne s’affiche. La numérotation n’apparaît qu’après l’enregistrement ou l’actualisation du formulaire, ce qui est gênant pour l’utilisateur car il peut croire que l’information est manquante et qu’il doit la saisir.
    Merci de votre aide.

  31. Hervé Inisan dit :

    Moha > L’article est en ligne. Ça se passe par ici. Bons tests !

  32. Hervé Inisan dit :

    Moha > Je n’ai pas beaucoup de temps ces jours-ci, mais j’ai noté la question. Dès que j’ai un moment, je posterai un article là-dessus (ce sera plus clair que de répondre dans un commentaire). Le principe consiste à utiliser les Recordsets (ADO ou DAO) pour automatiser l’écriture « en masse » des données.

  33. Moha dit :

    Hervé
    le NumAttetation est une numéro série de 8 chiffre seul ce numéro est modifiale pour chaque commande par exemple la commande du 22/08/2012 est de 150 Attestations allant du 68003211 au 68003360 usage « A ». donc la question comment saisir cette série de 150 attestations d’un seul coup?

  34. Moha dit :

    Bonjour Hervé
    le NumAttestation est une numérotation personnalisée, sous forme de série par exemple j’ai reçu une commade de 150 Attestations dont les n° de série sont de 68003211 à 68003360 et je veux les saisir toutes d’un seul coup. pour l’instant je les saisi dans excel et je les copie dans ma tables.

  35. Hervé Inisan dit :

    Moha > Et le NumAttestation est une numérotation personnalisée, comme décrite dans l’article, ou un NuméroAuto ?

  36. Moha dit :

    Bonjour
    Oui effectivement toutes les informations sont communes pour chaque série d’attestations et uniquement le Clé (NumAttestation )qui se change.

  37. Hervé Inisan dit :

    Moha > Si l’ensemble des informations est différent pour chaque attestation, il n’y a pas vraiment d’autre solution que de saisir manuellement. Si toutes les infos (ou une très grande partie) sont communes (à part la clef primaire), c’est possible via des Recordsets, en VBA.

  38. Moha dit :

    Bonjour
    Merci Mr Hervé ça marche très bien pour la numérotation auto. j’ai un autre problème
    Dans ma base de données j’utilise une table qui gère le stock des attestations d’assurance automobile qui sont numérotées par série (NumAttestation ; date commande; date réception; usage; situation ; date situation; motif) est ce qu’elle y a une méthode pour saisir ces attestations à la fois (plus que 100 attestations) au lieu de les saisir une par une.

  39. Hervé Inisan dit :

    Moha > Oui. Il suffit de remplacer, dans l’exemple plus haut, la date #1/1/2009# par quelque chose comme Me![Nom du champ Date du formulaire]. ou Me.Nom_Du_Champ. Avec la 2ème syntaxe, VBE suggère le nom du champ.

  40. Moha dit :

    Bonjour
    Je tiens à vous remercie pour cet article juste une question :
    Est ce qu’on la « dtDate » peut avoir comme référence comme la date saisie dans un champs du formulaire?

  41. Hervé Inisan dit :

    bebech > Super !

  42. bebech dit :

    C était bien ça, tout fonctionne !
    Merci beaucoup, bonne continuation 😉

  43. Hervé Inisan dit :

    bebech > Effectivement, l’erreur vient de là. Dans un If, si tu écris ton instruction juste après le Then, tu supposes que :

    1. Il n’y a qu’une seule instruction à exécuter (ici, ça pourrait passer).
    2. Dans ce cas, le End If ne doit pas être écrit. Voir la page Conditions (If) pour les détails.
      C’est pour ça que le compilateur te signale une erreur : le premier If (sur une ligne) est considéré comme complet, et le End If n’a pas de raison d’être.

    Ou alors, tu fais un Entrée après le Then

  44. bebech dit :

    Merci pour la réponse rapide,
    Je possède bien les éléments que tu cite , cepandant, le problème reste la . Voici ma ligne entière :
    If IsNull (Me.[Code Produit]) Then Me.[Code Produit]=AutoNumber(« tblProduits », « Code Produit », « [YY] » )
    End If

  45. Hervé Inisan dit :

    bebech > Vu le message, tu dois avoir un bloc de code ouvert mais pas fermé (ou fermé mais pas ouvert :)). Du genre : If Then sans End If, ou End If sans If Then. Vérifie le code de ton formulaire, si c’est là que ça se produit. Tu peux aussi faire Débogage / Compiler pour cibler le bout de code qui pose problème.

  46. bebech dit :

    Bonjour,
    Déjà merci pour cet article, je pense que une fois mon problème résolu, il va m ôter un grand poids. Tout d abord, j ai très peu d expérience avec access ( j ai appris sur le tas il y à 3 semaine, apprentissage juste par quelques pdf) donc pardon à l avance si je comprend mal.
    Donc voilà ou j en suis: j ai réussi à tapper tout le modulé, je l ai testé et il affiche le format que je veut. Mais je n arrive pas à l appliquer à mon formulaire . Les variables sont les mêmes que dans l exemple : j ai une table nommé tblProduits avec 2 champs ( code produit et nom produit ) . Un formulaire vide nommé formulaire1 d origine la table . Je tape le code evenementiel et je lancé le formulaire et la, rien ne se passe sur mle tableau. Quand je rajoute une zone texte en lien avec le nom du produit et que je rentre un nom de produit , j ai un message d erreur : erreur de compilation: end if sans bloc if. Qu ai je mal fait ?
    Merci d avance !

  47. Hervé Inisan dit :

    zizalajones > Si AutoNumber() est adaptée à tes besoins, il suffit que tu adaptes cette ligne (voir le paragraphe « Formulaire de saisie ») :

    Tu adaptes en remplaçant :

    • Code_Produit et "Code Produit" par le nom du champ à numéroter. Attention à la différence de syntaxe.
    • tblProduits par le nom de ta table.
    • "ABC[YY]." par "C"
    • 2 par 6 (le nombre de chiffres souhaités, pour obtenir une séquence 123456 ; le premier numéro sera donc C000001).
  48. zizalajones dit :

    Bonjour, c’est très proche de ce dont j’ai besoin, par contre, étant débutant en VBA/ACESS, j’ai fais plusieurs essais pour modifier le code, mais sans succès. J’ai simplement besoin que le numéro soit présenter comme suit : C123456
    est ce que vous pouvez m’indiquer ce qui doit être modifier dans le code ?
    merci de votre aide

    ZizalaJones

  49. Hervé Inisan dit :

    ED > Quelle est ton instruction INSERT INTO actuelle ?

  50. ED dit :

    Bonjour,

    j’ai essayé ce code de la fonction autonumber.
    il marche correctement dans le formulaire lors d’un ajout d’enregistrement.
    mais des que je passe par vba docmd.runsql insert into pour générer des nouveaux enregistrement
    message d’erreur car je ne sais ou placer le me.champ = autonumber etc..
    Merci de m’aider

  51. Hervé Inisan dit :

    Yohan > C’est possible, en modifiant un peu la fonction AutoNumber. Mais je ne sais pas si c’est une bonne idée : si les 01-, 02-, etc. de ta numérotation sont des mois, et que tu tries sur ce champ, tu vas obtenir :

    • 01-2011
    • 01-2012
    • 01-2013
    • 02-2011
    • 02-2012

    alors qu’avec AutoNumber, par défaut, tu auras :

    • 2011-01
    • 2011-02
    • 2012-01
    • 2012-02
    • 2013-03

    … ce qui me semble plus facile à consulter (on a un ordre chronologique).

  52. Yohan dit :

    Bonjour,
    Ma question est peut être bète, je suis en train de créer une base de données pour des dossiers qui sont triés sous format 01-2011 .. 02-2011 .. 03-2011 …
    Alors, possible de mettre le num a gauche?

  53. SamJack dit :

    MERCI, Grand MERCI à toi! Hervé Inisan. topic de grande qualité.

  54. Hervé Inisan dit :

    jbl > Il s’agit sans doute d’un problème d’actualisation du formulaire (c’est typique quand on « voit » les données correctes après un aller/retour). Un Me.Requery placé en fin de calcul force cette actualisation (plutôt que Suivant/Précédent).

  55. Hervé Inisan dit :

    chery > Si le champ fonctionne dans la table, mais ne se voit pas sur le formulaire, c’est qu’il n’est tout simplement pas affiché sur le formulaire. Dans ce cas :

    • Si le formulaire est basé sur la table (ou sur une requête basée elle-même sur la table), le champ doit être présent dans la « liste des champs » (voir l’icône correspondante). Il suffit de le glisser de la liste des champs sur le formulaire.
    • Si la requête source du formulaire ne contient pas le champ, il faut d’abord ajouter le champ sur la grille de requête, avant de pouvoir le placer sur le formulaire.
  56. chery dit :

    Bonjour merci beaucoup pour ta publication,elle m’a vraiment
    beaucoup aidé!!ça fonctionne comme je veux!
    le pb c’est que le num ne s’affiche pas dans mon formulaire,mais il s’incrémente et s’affiche dasn ma table.
    j’aimerai l’avoir visible dans le formulaire,comment faire?
    j’ai un control NumPiece,et j’aimerai que le numero qui s’enregistre dans la table s’affiche dans ce control pour me permettre d’imprimer!

  57. jbl dit :

    Bonjour
    j’ai été confronté au problème suivant dans le cas d’une application destinée à l’enregistrement du courrier.
    En utilisant un affichage par défaut du formulaire de saisie réglé à formulaire unique, le (numéro d’enregistrement) »code produit » ne s’affiche pas pendant la saisie, et n’est visible qu’en remontant sur l’enregistrement précédent.
    J’ai contourné le problème en plaçant le code du formulaire au niveau « avant insertion » au lieu de « avant mise à jour ».
    J’ai ensuite réglé les propriétés de la zone de texte « code produit » sur « arrêt tab: non » et « verrouillé: oui » pour des raisons pratiques.
    Est-ce pertinent ?

  58. Hervé Inisan dit :

    BoualemM > Quelle est l’erreur précise ?

  59. BoualemM dit :

    Bonjour,

    j’ai aussi fait ménages les noms de champs et de tables (en remplaçant Code Produit et tbl Produits par tes propres infos, qui sont sans doute différentes).sur Mon Programme mais ça marche pas toujour

    Private Sub Form_BeforeUpdate(Cancel As Integer)
    If IsNull(NO_LIVRE) Then

    NO_LIVRE = AutoNumber(« tblLivre », « ID_LIVRE », « Liv-« )

    End If

    toujour errere
    Merci d’avance

  60. Hervé Inisan dit :

    axelose > Je ne suis pas sûr d’avoir suivi : si le champ For_Id est clef étrangère, il n’y a sans doute pas de raison de lui appliquer une numérotation automatique. Une clef étrangère dépend de la clef primaire d’une autre table, c’est donc plutôt cette clef primaire qu’il faut numéroter. Ou bien…?

  61. axelose dit :

    bonjour
    voila j’ai trouver ce lien parasard, et je le trouve tres riche et interessant,je profite de pooser ma question=
    je souhaite mettre en place une numérotation automatique personnalisée basée sur le champ For_id( clef etrtangére )de mon formulaire principale . Le compteurde mon sous formulaire devra donc s’initialiser à chaque changement dans le champ For_id.(il revien a 1)
    merci

    Merci d’avance

  62. Fraethiane dit :

    Merci beaucoup pour ce code 🙂 Exactement ce que je cherchais!

  63. Hervé Inisan dit :

    Douzoumka > Dans ce cas, si seuls les derniers chiffres sont variables, le format serait du type "2002 203 10 " (la partie fixe), et la valeur du paramètre intDigits serait réglée à 5.

  64. Douzoumka dit :

    bsr Hervé,j’ai lu avec attention votre code, je crois que vous pouvez m’aider. Je suis nul en VBA; Sachez le. Actuellement je suis sur une application de gestion sinistre automobile. au fait j’ai une table SINISTRE(code_sin numeroAuto,numero_sin Texte,annee_sin date) il y’a encore d’autres champs par la suite. le code_sin est la clé primaire qui lie d’autres tables. Je veux que numero_sin soit automatique et de format numero_sin 2002 203 10 00001( ici ce qui varie c’est seulement les cinq derniers chiffres tels que 00001,00002,00003 ainsi de suite. si vous avez besoin de plus de détails, je vous le donnerai. merci d’avance

  65. Hervé Inisan dit :

    Jean-Claude > Normalement, ça doit fonctionner dans cette configuration. Mais il me faudrait plus de précisions sur le « ça ne marche pas » : il y a une erreur à l’exécution ? il se produit quelque chose ou rien ? En cas d’erreur, quel est le message donné par Access ?

  66. markuus dit :

    Merci beaucoup,

    Cela régle un gros problème sur la base de donnée que je développe !

    @+

  67. Jean-Claude PETIT dit :

    Bonjour M. INISAN, j’ai bien suivi votre procédure (version 1) mais cela ne fonctionne pas. Est-ce que cela provient de la version access (version utilisée access 2003) sous windows 7. Y a t’il des ponctuations à changer ? ou bien des mots de VB non reconnus ? Je souhaite utiliser ce code afin d’automatiser la numérotation des devis, mais hélas
    Si vous pouviez m’aider – merçi par avance
    Jean-Claude PETIT, le 28.12.2010

  68. Hervé Inisan dit :

    Manu23 > Ces lignes doivent être placées dans le BeforeUpdate du formulaire (voir le paragraphe « Le formulaire de saisie », dans l’article), entre le If/Then et le End If.

    Il faut aussi que tu aménages les noms de champs et de tables (en remplaçant Code Produit et tbl Produits par tes propres infos, qui sont sans doute différentes).

  69. Manu23 dit :

    Hervé Inisan > Merci pour ton aide, j’ai repris ton exemple et ça me donne :
    Dim strFormat As String
    strFormat = Me.Date_reception & « – » & Me.cmbEntreprise & « – » & « – » & Left(cmbPassage, 1) & « – » & Me.cmbLot
    Me.Code_Produit = AutoNumber(« tblProduits », « Code Produit », strFormat, 3)

    mais comme je l’ai dit, je débute, alors maintenant, j’en fait quoi de ce code ?
    Merci
    Manu

  70. Hervé Inisan dit :

    Manu 23 > A vue de nez, tout le format est statique, et il sera effectivement créé par concaténation. Du style (en reprenant l’exemple de cet article) :

    txtAnnee, cmbEntreprise et autres sont les zones de saisie ou les listes déroulantes du formulaire.

  71. Manu 23 dit :

    Bonjour,
    Je débute dans Access et ne connaît pas du tout le VBA
    On me demande de créer un numéro automatique pour une de mes tables, jusque là c’est facile. Sauf que ce numéro doit reprendre des infos d’autres champs (qui sont presque tous des listes déroulantes venant d’autres tables) + un numéro qui doit repartir à 1 si le numéro avant est unique. J’espère que je me fait comprendre …
    concret :
    mon numéro unique est du type : 2010-FEL-P-06bis-1 où 2010 est l’année de reception du courrier (entrée direct dans le formulaire), FEL les 3 premieres lettres de l’entreprise (liste déroulante), P la premiere lettre d’un autre champs (liste déroulante), 06 (ou 06 bis) la totalité d’un champs (liste déroulante) et 1 le numéro unique automatique.
    Je pense que le plus simple est de travailler par concaténation, mais je ne sais pas comment faire. Qu’en pensez vous ? Comment dois je procéder ?
    Je peux vous envoyer ma base si besoin.
    Merci

  72. Hervé Inisan dit :

    islemus > Sur le principe, il faudrait modifier aussi la variable strCriteria pour l’étoile soit avant le format, et non plus après. Et il faut revoir le DMax() qui recherche une valeur maximale sur l’ensemble du champ (la valeur maximale doit être à la fin, dans mon traitement). En résumé, un peu d’aménagements quand même. 😉

    Mais je ne pense pas que ce soit une bonne idée de placer le numéro en début : ça ne va pas être pratique pour les tris alphabétiques sur le numéro, parce que la séquence sera du type : 001/10, 001/11, 001/12, 002/10, 002/11… au lieu de 001/10, 002/10, 001/11, 002/11, 001/12.

  73. islemus dit :

    Bonjours

    Est-il possible d’inverser les champs afin d’avoir la N°SEQ/YY.
    si oui doit-on modifier selement
    « la cherche la valeur maximale déjà employée dans la table » et
    et faire
    strFormat = Format(lngNum, String(intDigits, « 0 »)) & strFormat ?

    un très grand merci pour vos efforts

  74. tiyo dit :

    Merci beaucoup sa marche niquel.

  75. Hervé Inisan dit :

    Cercan > Si tu souhaites utiliser la fonction AutoNumber, il y a un premier souci : le code indicé/non indicé ne doit pas se trouver à la fin. La fonction est prévue pour faire ses calculs sur la partie droite du code complet. Par contre, un code comme 99/FR/00-00000 devrait le faire.

    Ensuite, il y le problème qui consiste à injecter des données variables (le pays et la case à cocher formatée) dans le code, pour son calcul. Cet autre article du Grenier devrait aider (il s’agit d’un cas proche, à adapter bien sûr).

  76. Hervé Inisan dit :

    @tiyo Non, la fonction AutoNumber n’a pas besoin d’être modifiée. C’est au niveau de son appel que ça se joue (dans le BeforeUpdate du formulaire). Dans ton cas, un format « [MM] » ou « [YYYY][MM] » devrait faire l’affaire.

  77. Cercan dit :

    Bonjour,
    Je cherche à réaliser un numéro automatique personnalisé de cette facon: 99/FR/10000-00

    – 99 = 2 derniers chiffres année en cours (ca c’est ok)
    – FR est l’initiale du pays choisi dans un champ par liste déroulante
    – Incrémentation à chaque nouveau projet (1er projet 10000; 10001…)(ok également)
    – Les deux derniers chiffres sont utilisés pour indicer ou pas le projet par une case à cocher.(00 non indicé et 01 indicé)

    Ce que je n’arrive pas à faire c’est récupérer l’initiale du pays qui à été choisie dans un champ (liste déroulante des pays) du meme formulaire et idem pour l’indice (case à cocher, si cocher j’indice sinon j’indice pas)

    Merci d’avance pour l’aide que vous pourrez m’apporter.

  78. tiyo dit :

    Salut inisan,
    voila je voudrais savoir si c’est bien cette partie du code qu’il faut modifié la réinitialisation du compteur :
    //Marqueurs à remplacer
    varMarkers = Array(« YYYY », « YY », « Q », « MM », « WW », « DD »)

    Par exemple pour réinitialiser le compteur 0001 tout les mois, est-ce bien comme cela :
    //Marqueurs à remplacer
    varMarkers = Array(« YY », »MM »)

  79. Hervé Inisan dit :

    Foster > En fait, il y a 2 parties dans le code, comme expliqué dans l’article :

    • La fonction AutoNumber() doit être entièrement recopiée dans un module standard.
    • Ensuite, le formulaire qui sert à la mise à jour des données doit recevoir un bout de code qui va automatiser les choses. Suis la procédure pas à pas du paragraphe « Le formulaire de saisie », elle est relativement détaillée.

    Il faut bien sûr que tu adaptes les noms de tables, les noms de champs, et les codes (du type [YY]) en fonction de ta base de données.

  80. Hervé Inisan dit :

    J_Ted > Cet autre article devrait répondre à la question. Je n’ai pas de quoi tester sur ton cas précis, mais en remplaçant le Format(Date, "MM") de l’article par le champ id_sec (et en enlevant le marqueur [YY] qui ne sert pas), ça devrait passer.

  81. Foster dit :

    Bonjour,
    Etant débutante sur access et ne maitrisant pas du tout le language VBA, ces explications sont plus que pratique puisque cela correspond exactement à ce que je recherche.
    Seul hic, j’avoue ne pas savoir où ni comment mettre le code VBA pour mon champs.
    Merci d’avance

  82. J_Ted dit :

    Enfin, le numéro complet (calculé et concaténé à id_sec) est sous la forme NADE0001, NADE0002, EBBO0001, EBBO0002, etc.

    Merci

  83. J_Ted dit :

    Bonjour,

    A la suite de mon problème, le champ à numéroter est id_chor (texte) qui s’initialise à 1 chaque fois que id_sec change. id_chor sera la clé primaire et l’identifiant unique de chaque membre.

    D’avance merci.

  84. Hervé Inisan dit :

    J_Ted > Pas sûr que ça puisse se transposer dans ce cas, mais on ne sait jamais… Quel est le champ à numéroter ? Et quel est le format souhaité ?

  85. J_Ted dit :

    Bonjour,

    Je suis très intéressé par ce sujet car j’ai sous la main un projet semblable.

    En effet, je suis débutant en programmation et je travaille avec Access 2007 où j’ai une table (choriste) avec les champs suivants : num (numeroAuto), noms (texte), prenoms (texte), id_sec (texte, id_voix (texte).

    je souhaite mettre en place une numérotation automatique personnalisée basée sur le champ id_sec sur lequel les regroupements sont faits. Le compteur devra donc s’initialiser à chaque changement dans le champ id_sec.

    Merci d’avance

  86. ludi_in_the_sky dit :

    Merci, c’est exactement ce que j’ai fait. C’est fou cette tendance qu’on peut avoir à se compliquer la vie alors que la solution est toute simple !!

    Encore merci !

  87. Hervé Inisan dit :

    ludi_in_the_sky > Dans ce cas, il y a sûrement une table des aires, et une table des jeux. Le numéro de l’aire est sans doute clef étrangère dans la table des jeux. Et le jeu peut avoir un NuméroAuto (ou un numéro manuel) en plus. Du coup, la numérotation de cet article ne s’applique pas : il faut prévoir les 2 champs (Numéro de l’aire / Numéro du jeu) dans la table, et les afficher par concaténation.

  88. ludi_in_the_sky dit :

    Bonjour,

    est-il possible de créer un numéro pour une table qui serait basé sur le numéro d’une autre table ?
    Je créé une base pour gérer des aires de jeux, et j’aimerais que chaque jeu reprenne le numéro de son aire de jeux ainsi qu’un numéro propre à lui.

    Bien cordialement

  89. jacques dit :

    Bonjour,

    Je voudrais utiliser cette Fonction pour numéroter plusieurs lignes à la fois (50 environ en utilisant une variable).

    Quel tytpe de boucle je dois utiliser, et comment ?

    Salutations

  90. haitsahel dit :

    merci infiniment

  91. Hervé Inisan dit :

    haitsahel > Oui, c’est possible. Il suffit d’utiliser les marqueurs « [YY][MM][DD] », notamment [DD] qui donne le jour du mois. Dans les exemples plus haut, il y en a un de ce type.

  92. haitsahel dit :

    salut cher Inisan
    est-il possible de reprendre la numerotation à partir 1 chaque jour ? Merci bcp

  93. Hervé Inisan dit :

    abdoumoh > Ben, ça n’a pas trop de rapport avec la numérotation personnalisée de l’article 😉

    Mais sur le principe, si tu as un champ Moyenne, tu peux :

    1. créer une requête basée sur la table.
    2. Ajouter ce type de champ calculé :

  94. abdoumoh dit :

    Dans une table moyenne, je souhaite avoir dans le champ mention « nul, quand le moyen 0 à 9,99, passable quand le moyen 10 à 11,99, assez Bien quand le moyen 12 à 13,99, Excellent quand le moyen >=14 »
    Comment le faire ?

  95. Hervé Inisan dit :

    sergy > En fait, je raisonnerais autrement : il s’agit d’atteindre un enregistrement complet (tous les champs) correspondant à une clef connue. Pour ça, le plus simple et ergonomique consiste à créer une « liste de recherche ». Voir ici.

  96. sergy dit :

    Je souhaiterai savoir comment faire pour afficher la valeur d’un champ correspondand à un autre champ en choisissant par un contrôle dans un formulaire. Exemple concret :j’ai une table des locataires dont les champs sont les suivants : n°logement, nom locataire,adresses. En choisissant le n° du logement du locataire par un contrôle dans un formulaire, je voudrais que s’affiche directement son nom et son adresse dans une case de mon formulaire.

  97. Hervé Inisan dit :

    Blaise > C’est une solution qui peut convenir également (en fait, chacun a sans doute sa fonction de numérotation ! ;-)).

    Par contre, ton exemple est spécifique à une table (à moins d’aménager ou de partager la numérotation entre les tables), et le format est moins « flexible ». C’est surtout ça qui fait la longueur (la question de départ était surtout un prétexte pour une solution paramétrable).

    My 2 (euro) cents… 🙂

  98. Blaise dit :

    Bonjour ou bonsoir,

    Je suis étonné par la démesure de la réponse par rapport à la simplicité de la question. Sorry

    Créer une table « Tbl_Parametres » avec :
    – un champ Date « ticket_code_date »
    – un champ Ordre « ticket_code_ordre »

    – Créer la fonction suivante

    Function Fn_Code_Ticket() As Long
    Dim Ado_Tbl_Param As New ADODB.Recordset
    Dim Tck_Code_Date As Date
    Dim Tck_Code_Ordre As Integer
    Dim Numero As Long
    Ado_Tbl_Param.Open « Tbl_Parametres », CurrentProject.Connection, adOpenDynamic, adLockOptimistic
    Ado_Tbl_Param.MoveFirst
    Tck_Code_Date = Ado_Tbl_Param(« ticket_code_date »)
    If Year(Tck_Code_Date) = Year(Date) Then
    Tck_Code_Ordre = Ado_Tbl_Param(« ticket_code_ordre »)
    End If
    Tck_Code_Ordre = Tck_Code_Ordre + 1
    Numero = Year(Date) * 1000
    Numero = Numero + Tck_Code_Ordre
    Ado_Tbl_Param(« ticket_code_date ») = Date
    Ado_Tbl_Param(« ticket_code_ordre ») = Tck_Code_Ordre
    Ado_Tbl_Param.Update
    Ado_Tbl_Param.Close
    Set Ado_Tbl_Param = Nothing
    Fn_Code_Ticket = Numero

    End Function

    – Dans la fenêtre d’éxecution (par exemple)
    ? fn_code_ticket
    2008031

    – Dans le formulaire d’encodage
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    ‘ [Le champ à mettre à jour] = Fn_Code_Ticket()
    end sub

    – ET Afficher avec un format « 0000/000 »

  99. haitsahel dit :

    (à tester ; je me dis qu’il peut y avoir un effet de bord sur le DMax).

    Comme vs l’avez deviné le DMax ne marche pas . Merci d’avoir essayé

  100. haitsahel dit :

    Merci bcp .
    Est-il possible d’obtenir la partie variable sans les zeros se trouvant à gauche?

  101. Hervé Inisan dit :

    haitsahel > Oui. A priori, il faut remplacer la ligne (vers la fin du listing) :

    par :

    En faisant en sorte que le paramètre intDigits vale 1, ça devrait également coller, sans modifier le code (à tester ; je me dis qu’il peut y avoir un effet de bord sur le DMax). Je pense aussi qu’il est préférable de garder une cohérence dans la numérotation. Si tu abandonnes le « calage à gauche », le tri alpha sur les numéros deviendra :

    1. 2009/1
    2. 2009/11
    3. 2009/12
    4. 2009/2

    au lieu de :

    1. 2009/001
    2. 2009/002
    3. 2009/011
    4. 2009/012

    Tu as peut-être une application qui s’y prête ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *