Numéroter automatiquement les lignes d'un format Tableau

Bonjour,

Je mets à jour périodiquement une base de données d’indicateurs (Base de Données) en copiant collant une feuille de mise à jour (Mise à jour) ayant ce jeu d’indicateurs et en modifiant la date et les valeurs, pour la nouvelle période. Les 2 bases sont au format Tableau et j’ai automatisé avec une macro le copier-coller et la remise à blanc de la feuille Mise à Jour.

A) Ajout du Tableau T_MAJ au Tableau T_DONNEES

J'ai écrit deux macros avec 2 syntaxes différentes : format Plage de données et format Tableau.

a) La macro MàJ01 (Syntaxe Plage) fonctionne correctement,

b) La macro MàJ02 (Syntaxe Tableau) fonctionne mais insère aussi la ligne des titres. Je ne sais pas modifier la syntaxe (Références structurées?). Par ailleurs, je n'ai pas bien compris la gestion du numéro d'index (1) de ListObjects.

Ma question : Comment corriger MàJ02 pour ne pas insérer la ligne de titre?

B) Numérotation automatique de l'ID des lignes de mise à Jour rajoutées à la Table T_DONNEES

La même macro (syntaxe Plage) est appliquée sur un format Plage et ça marche par contre sur un format Tableau ça ne marche pas.

a) La macro NumAuto01 complète la série des numéros d'identification de la plage de données de la feuille DONNEES01, quelque que soit les numéros déjà enregistrés. Sur un format Plage de données, ça fonctionne.

b) La macro NumAuto02 est censée faire la même chose mais sur un format Tableau T_DONNEES (Feuille DONNEES). Dans ce cas, ça ne fonctionne pas. C'est la dernière ligne remplie du Tableau, la 9, qui est identifiée et non la dernière ligne remplie de la colonne A (dans le cas présent la 4 - car les autres cellules de la colonne A sont déjà remplies). Donc ma question : Quel code pour que cette numérotation fonctionne aussi sur un format Tableau?

J'ai attaché le fichier de démo.

30essaiv04.xlsm (102.02 Ko)

Merci pour toute indication.

GMeunier

Bonjour Gmeunier le forum

Ton fichier en retour

Tu ouvres ton fichier et dans la feuille Donnée là ou tu as ton tableau, tu lances la macro TestParitec

et tu me redis

a+

Papou

Papou, bonjour,

La macro fonctionne parfaitement avec le format Tableau! Il faut que je l'intègre dans le module qui fait la mise à jour et que je comprenne le code!!

Je confirme dans la journée.

Merci pour la réactivité,

GMeunier

Re Gmeunier le forum

tu rajoutes simplement dans la macro concernée, à la fin du traitement que tu souhaites

call TestParitec 

et c'est tout

si bien entendu, le tableau est bien dans la feuil7 de ton fichier??

a+

Papou

PS: si tu as des difficultés, tu me passes le fichier et je te le modifierai

J'ai compris. Je reviendrai pour confirmer.

Merci encore

Mon fichier de travail est en pièce attachée ;

Il y a 2 étapes.

1) La première étape, Macro MàJ01 consiste à copier le tableau Mise à jour et à l’ajouter au tableau base de Données puis d’effacer les colonnes variables du tableau MàJ en prévision de la prochaine mise à jour. J’avais un problème avec l’instruction Range("B2", Range("B2").End(xlDown)).Clear pour nettoyer la colonne B car l’instruction Clear efface la validation, de plus elle s’arrête d’effacer si il y a une ligne vide. J’ai remplacé par .Value = « « et il semble que cela fonctionne.

2) La seconde étape est la numérotation des nouvelles lignes à la suite de celles du tableau Données avec la macro PariTec proposée. Elle fonctionne parfaitement avec le fichier d’essai que j’avais proposé (mais il faut au moins un numéro renseigné) et le l’ai adapté au fichier complet pour laquelle je veux l’utiliser. Cela fonctionne mais je ne comprends pas toutes les instructions.

a. J’ai compris que la déclaration des variables utilisait un système ancien aa et i As Long (&) ?

b. J’ai modifié la feuille => Feuil2 (Données)

c. J’ai modifié la lettre de la colonne la plus à droite => I

d. Je ne comprends pas la signification du 3 dans End(3) ?

Par ailleurs, il me semble que aa est une variable (un tableau ?) mais je n’arrive pas à la visualiser avec Debug.Print aa qui bug !

Par i fonctionne avec Debug.Print

Voir fichier attaché

Je suis preneur de toute clarification

Ça progresse !

GMeunier

Mon fichier

Bonjour à tous

Puisqu'on travaille avec des tableaux structurés utilisons le code VBA approprié aux ListObjects

Sub MàJTableauOK()
    'Syntaxe tableau
    Dim ligne As Long
    'Sélection de la feuille Mise à Jour (Feuil1) dans le cahier
    'Sélection du tableau Mise à Jour - Syntaxe Tableau
    'Sélection de la feuille Base de données
    'Numéro de la première ligne vide
    With Sheets("Données").ListObjects("T_Données").Range
        ligne = .Rows.Count + .Row
    End With
    'Confirmation et copie de la mise à jour
    MsgBox "Confirmer la mise à jour de la base", vbOKCancel
    Worksheets("MàJ").ListObjects("T_MàJ").DataBodyRange.Copy Sheets("Données").Cells(ligne, 1)
     'Compléter la numérotation
    Call Numerotation
    'Remettre à blanc les colonnes variables (B, D et E) de MàJ
    With Worksheets("MàJ").ListObjects("T_MàJ")
      .ListColumns("ANNEE").DataBodyRange.Value = ""
      .ListColumns("VALEUR").DataBodyRange.Value = ""
    End With
End Sub
Sub Numerotation()
    Dim aa, i&
    With Sheets("Données").ListObjects("T_Données").ListColumns("N°")
        aa = .DataBodyRange
        For i = 1 To UBound(aa)
            If aa(i, 1) = "" Then aa(i, 1) = CDbl(aa(i - 1, 1) + 1)
        Next i
        .DataBodyRange.FormulaLocal = aa
    End With
End Sub

J'ai pris les noms des feuilles plutôt que leur code.name (choix arbitraire) mais surtout les noms des tableaux : l'index étant peu fiable et peu lisible surtout si on envisage plusieurs tableaux par onglet...

A noter que cela renumérote depuis le début : si ce n'est pas souhaitable (numéros supprimés depuis les MAJ précédentes) dis-le

78Chris,

Merci pour le code. Je vais le tester et je confirmerai. Je vais aussi essayer de m'approprier le code pour les objets!

Par contre, le but de la colonne N° est d'identifier d'une manière fixe et définitive les lignes lors de leur création dans le Tableau T_Données. Donc, la macro Numéroter ne devrait intervenir que sur les nouvelles lignes copiées (à partir de T_MàJ) dans T_Données en continuant la numérotation à partir du numéro de la première ligne vide de T_Données ou du N° le plus élevé.

En effet, il est possible que la base de données soit triée sur une autre colonne (contrôle éventuel de calcul) lors de la mise à jour et donc si la numérotation repart depuis le début, le numéro d'identification des lignes n'est plus fixe.

Par ailleurs, Il n'est pas prévu de supprimer des lignes mais si s'était le cas, alors en utilisant le numéro de la première ligne vide de T_Données (après suppression de lignes), on pourrait créer des N° en double.

Donc, la numérotation lors de la mise à jour ne doit pas renuméroter les lignes déjà présentes mais uniquement celles ajoutées. La question est à partir de quel numéro?

a) Celui de la 1° ligne vide (mais pas il ne faut supprimer de ligne dans T_Données - Si c'était nécessaire de supprimer, on peut décider de garder la ligne et de mettre les autres données à blanc, dans ce cas pas de problème!

b) ou alors de prendre la suite du dernier numéro de la colonne N°?

Le plus simple me semble être a) le numéro de 1° ligne vide

Très cordialement,

GMeunier

Bonjour Gmeunier, 78chris le forum

c'est exactement ce que j'avais fait !!!!

en continuant la numérotation à partir du numéro de la première ligne vide de T_Données ou du N° le plus élevé.

par définition le numéro le plus élevé sera bien le dernier présent dans le tableau !!!!

a+

Papou

Et pour ton information puisque tu affirmes des choses fausses

J’ai compris que la déclaration des variables utilisait un système ancien aa et i As Long (&)

non aa et i ne sont pas déclarés en Long, mais, aa en Variant et I en long

Et pour le système ancien là ??? je ne vois pas ou tu as vu que l’utilisation de & pour un long ou # pour un double était un vieux système!!!!! C'est simplement dix fois plus rapide à taper, et cela ne donne pas des déclarations de variables à rallonge.

Bonjour

En incrémentant à partir du numéro le plus élevé (j'ai ajouté le cas où l’utilisateur clique sur Annuler)

Sub MàJTableauOK()
    'Syntaxe tableau
    Dim ligne As Long, ligne2 As Long, Num1 As Long, Plage As Range, Suite
    Dim aa, i&

    'Sélection de la feuille Mise à Jour (Feuil1) dans le cahier
    'Sélection du tableau Mise à Jour - Syntaxe Tableau
    'Sélection de la feuille Base de données
    'Numéro de la première ligne vide

    With Sheets("Données").ListObjects("T_Données")
        'Confirmation et copie de la mise à jour
        Suite = MsgBox("Confirmer la mise à jour de la base", vbOKCancel)
        ligne = .Range.Rows.Count + .Range.Row
        If Suite = vbCancel Then Exit Sub
        Worksheets("MàJ").ListObjects("T_MàJ").DataBodyRange.Copy Sheets("Données").Cells(ligne, 1)
        'Compléter la numérotation
        Num1 = WorksheetFunction.Max(Sheets("Données").ListObjects("T_Données").ListColumns("N°").DataBodyRange) + 1
        ligne = ligne - .Range.Row
        ligne2 = Worksheets("MàJ").ListObjects("T_MàJ").DataBodyRange.Rows.Count
        Set Plage = .ListColumns("N°").Range.Offset(ligne, 0).Resize(ligne2, 1)
        aa = Plage
        For i = 1 To UBound(aa)
            aa(i, 1) = Num1 + i - 1
        Next i
        Plage = aa
    End With

    'Remettre à blanc les colonnes variables (B, D et E) de MàJ
    With Worksheets("MàJ").ListObjects("T_MàJ")
      .ListColumns("ANNEE").DataBodyRange.Value = ""
      .ListColumns("VALEUR").DataBodyRange.Value = ""
    End With
End Sub

Merci infiniment à 78Chris et Papou!

La dernière macro fonctionne parfaitement y compris si les numéros d'identification ne sont pas dans l'ordre.

A mon niveau de débutant VBA, je n'affirme rien, j'essaie simplement de comprendre peut-être maladroitement. Mais ça progresse grâce aux échanges

Encore merci,

Très cordialement

GMeunier

Rechercher des sujets similaires à "numeroter automatiquement lignes format tableau"