IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème avec numérotation automatique [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2018
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2018
    Messages : 283
    Par défaut Problème avec numérotation automatique
    Bonjour à toutes et tous


    J'ai un tableau structuré "Tab_Devis" dont l'entête est ligne 4 de ma feuille.
    J'y reprends un ensemble de données du devis (nom, adresse, ...).
    Dans la colonne "N°" je cherche à générer automatiquement le numéro d'ordre du devis.

    Pour ce faire, j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Incrémenation du compteur Devis (D pour Devis )Colonne "N°"
        DerCelD = Cells(Rows.Count, "C").End(xlUp).Row
        Cells(DerCelD + 1, "C").Value = DerCelD - 3 ' 3 = pourquoi ?
    Ce code fonctionne à partir du 2d devis ligne 6. Mais pas pour le premier devis ligne 5. En effet, le compteur m'indique 2 cellule C6, alors qu'il devrait m'indiquer 1 cellule C5.

    Auriez-vous une solution ?
    Merci
    Philippe

  2. #2
    Membre éclairé
    Homme Profil pro
    curieux
    Inscrit en
    Février 2025
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2025
    Messages : 40
    Par défaut
    Bonjour,
    Pour obtenir 1 en ligne 5 il faut faire "ligne – 4", pas -3. Il y a une confusion car vous écrivez 1 ligne sous la valeur "DerCel". Aussi vous faites référence à la feuille active, faites attention à ce qu'il s'agisse bien de celle du tableau.
    J'écrirai simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ActiveSheet.Cells(Rows.Count, "C").End(xlUp).Offset(1)
      .Value = .Row - 4
    End With

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 532
    Par défaut
    Hello,

    Une simple formule dans la 1er cellule fera l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ROW() - ROW(Tab_Devis[[#Headers], []])
    Ou en français:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =LIGNE() - LIGNE(Tab_Devis[[#En-têtes]; []])
    Ensuite, plus besoin de s'en occuper, l'extension automatique du tableau fera le job.

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 572
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 572
    Par défaut
    Bonjour à tous

    A noter néanmoins qu'avec une formule, tout tri, insertion ou suppression de lignes, volontaire ou non, renumérote tout donc plus aucun repère avec l'état précédent...

    On n'utilise pas .End(xlUp).Row avec un TS...

  5. #5
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 517
    Par défaut
    Bonjour je rejoint la position de Chris.
    Très mauvaise idée que de numéroter par rapport au numéro de ligne.
    A l'instar de Access il faut leur donner un identifiant unique, la fonction Max s'y prête bien. Cela permet en cas de suppression de ne pas avoir de doublon ou autre.
    Si l'on prends comme exemple la colonne ID d'un tableau structuré deux petites fonctions feront l'affaire. Ces fonctions sont à mettre dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    '@Description "Récupère la valeur maximale des index incrémentés de 1 en option."
    Public Function GetMaxID(ByVal Table As Excel.ListObject, ByVal Column As Variant, Optional ByVal WithIncrement As Boolean) As Long
    Private Const COLUMN_NAME As String = "ID"    
    If Not Table Is Nothing Then
            If Table.ListRows.Count > 0 Then
     
                Dim Index As Long
                Index = IndexColumn(Table, Column)
                If Index > 0 Then
                    Dim IdMax As Long
                    IdMax = Application.WorksheetFunction.Max(Table.ListColumns(Index).DataBodyRange)
                    GetMaxID = IdMax + IIf(WithIncrement = True, 1, 0)
                Else
                    GetMaxID = 0
                End If
            Else
                GetMaxID = 1
            End If
        Else
            GetMaxID = 0
        End If
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    '@Description "Vérifie l'index d'une colonne. Si Column n'est pas renseigné la fonction renvoie la première colonne si elle existe."
    Public Function IndexColumn(ByVal Table As Excel.ListObject, ByVal Column As Variant) As Long
        If Not Table Is Nothing Then
            With Table
                If Column = vbNullString Or Column = 0 Then
                    Dim Index
                    If .ListColumns.Count > 0 Then Index = 1
                Else
                    If TypeName(Column) = "String" Then
                        Dim Counter As Long
                        Counter = 1
                        Do While Counter <= .ListColumns.Count And Not Index
                            If StrComp(Table.ListColumns(Counter).Name, Column, vbTextCompare) = 0 Then Index = Counter
                            Counter = Counter + 1
                        Loop
                    ElseIf TypeName(Column) = "Long" Or TypeName(Column) = "Integer" Then
                        If Column > 0 And Column <= .ListColumns.Count Then
                            Index = Column
                        End If
                    End If
                End If
     
            End With
            IndexColumn = Index
        Else
            IndexColumn = False
        End If
    End Function
    EDIT : Correction d'un bug potentiel Merci à Philippe.

    Certains code sont tirés du très bon travail de Laurent OTT :

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 178
    Billets dans le blog
    53
    Par défaut
    Bonjour Jean-Paul,
    Il y a un petit souci avec ces deux fonctions.
    L'argument Column de GetMaxID est optionnel alors que l'argument Column de la fonction IndexColumn invoquée par la première ne l'est pas. Donc si l'on appelle la fonction GetMaxId sans utiliser l'argument Column, il y aura inévitablement une erreur à la ligne If Column = vbNullString Or Column = 0 Then de la fonction IndexColumn
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/05/2006, 03h05
  2. Réponses: 7
    Dernier message: 10/11/2005, 14h12
  3. Cocher une case avec affichage automatique
    Par Toff !!!!! dans le forum Access
    Réponses: 3
    Dernier message: 27/09/2005, 13h36
  4. Menu déroulant avec préselection automatique
    Par Invité dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/06/2005, 12h11
  5. [MFC] zone de texte avec "wrap" automatique
    Par bigquick dans le forum MFC
    Réponses: 3
    Dernier message: 21/04/2005, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo