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.
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
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
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