Copier vers dernière ligne vide dans tableau structuré

Bonjour à tous,

Mes meilleur vœux pour cette nouvelle année,

J'ai un souci que je ne comprend pas, à l'ouverture d'un userform je copie certaine données dans un tableau structuré qui sert de suivi,

Private Sub UserForm_initialize()

derlign1 = Sheets("Suivi").Range("B" & Rows.Count).End(xlUp).Row + 1

With Sheets("Suivi")
    .Cells(derlign1, 1) = "***"
    .Cells(derlign1, 2) = "***"
    .Cells(derlign1, 3) = "***"
    .Cells(derlign1, 4) = "***"
    .Cells(derlign1, 5) = "***"
    .Cells(derlign1, 6) = "***"
End With
Me.Left = Application.Left + Application.Width / 2 - Me.Width / 2
Me.Top = Application.Top + Application.Height / 2 - Me.Height / 2
'Sheets("Suivi").Visible = -1
End Sub

Quand mon tableau contient déjà des données, tout fonctionne très bien, par contre ce tableau est vider régulièrement, et quand le tableau ne contient aucune donnée, le collage ce fait sur la première ligne vide mais hors tableau et sans étendre le tableau au nouvelle lignes

image image

Du coup je ne comprend pas le pourquoi du comment

Bonjour

Si je vois bien votre tableau est en format structuré. Si oui, votre code n'est pas adapté.

Je peux vous aider si vous me donner le nom attribué à votre tableau dans le gestionnaire de nom

Cordialement

Edit : Je ne comprends pas le code Initialize. Pourquoi complétez-vous des cellules dans le tableau avec ce code qui est utilisé pour ouvir l'userform

Bonjour DAN,

Tout d'abord désoler de ne pas mettre le fichier, impossible à sortir du réseau entreprise,

Mon tableau est bien un structuré, et il a pour nom Tableau7,

Pour la fonction copie dans initialize, au fait l'userform sert à contrôler de l'étiquetage, chaque ouverture me copie c'est simple ligne pour juste faire une séparation

entre les différentes vérification qui peuvent être plus ou mois longue suivant la grandeur de nos production.

1. par contre ce tableau est vider régulièrement,

Pour vider votre tableau structuré, utilisez cette instruction (nom de la feuille à changer en fonction de votre projet)

Worksheets("Suivi").ListObjects("Tableau7").databodyrange.delete

(TRES important !!) Si vous supprimez manuellement les données dans un tableau structuré vous devez uniquement sélectionner les lignes dans le tableau, puis click droite et choisir l'option "Supprimer" --> "Ligne" de tableau" (donc ne sélectionnez jamais les lignes complètes dans la feuille)
Si vous ne voyez pas Lignes de tableau c'est que vous avez soit mal sélectionné soit que vous avez un souci avec votre tableau structuré

2. Pour la fonction copie dans initialize, au fait l'userform sert à contrôler de l'étiquetage, chaque ouverture me copie c'est simple ligne pour juste faire une séparation

essayez ceci :

Private Sub UserForm_initialize()
Dim Lig As Integer

With Worksheets("Suivi").ListObjects("Tableau7")
    If .ListRows.Count = 0 Then
        .ListRows.Add: Lig = 1
    Else: .ListRows.Add: Lig = .ListRows.Count
    End If
    With .DataBodyRange
        .Item(Lig, 1) = "***"
        .Item(Lig, 2) = "***"
        .Item(Lig, 3) = "***"
        '.....
        '....
End With
Me.Left = Application.Left + Application.Width / 2 - Me.Width / 2
Me.Top = Application.Top + Application.Height / 2 - Me.Height / 2
End Sub

Cordialement

Bonjour DAN,

Un grand merci, votre code me donne le résultat souhaité.

Par contre vu que je ne connaissais pas encore cette procédure, est ce que je peux vous demandez quelque explication vite fait sur ce que vous avez écrit.

En vous remerciant.

Bonne journée.

Par contre vu que je ne connaissais pas encore cette procédure, est ce que je peux vous demandez quelque explication vite fait sur ce que vous avez écrit.

C'est une autre manière d'écrire les codes avec le tableau structuré.

Ci-dessous l'explication :

'Tableau7 defini par vous et contenant les entêtes
With Worksheets("Suivi").ListObjects("Tableau7")
    'on compte les lignes comprises dans le tableau7
    If .ListRows.Count = 0 Then '**
        'si pas de lignes on definit la variable lig égale à 1
        .ListRows.Add: Lig = 1
        'si des lignes sont présentes dass le tableau on définit Lig sur base du nombre de lignes présentes dans la tableau7
    Else: .ListRows.Add: Lig = .ListRows.Count
    End If
    'databodyrange pour écrire dans le tableau7 - databodyrange = votre tableau7 ligne 2 et suivantes
    With .DataBodyRange
        .Item(Lig, 1) = "***"
        .Item(Lig, 2) = "***"
        .Item(Lig, 3) = "***"
        '.....
        '....

Là où je vous ai mis **, ma remarque dans mon post précédent au sujet de la procédure à suivre pour la suppression de lignes est très importante. Si vous supprimez les données via la touche DEL ou SUPP à l'aide votre clavier, cela ne remet pas le nombre de lignes à zéro dans votre tableau. Du coup les nouvelles données ne seront pas positionnées en ligne 2 (1iere ligne de votre tableau) mais bien à la suite des autres lignes vides.

Si vous voulez être sûr de toujours partir en ligne 2, en début de code mettez la ligne de suppression que je vous ai donnée précédemment. Ainsi votre tableau sera toujours vidé avant l'introduction des nouvelles données. A éviter si votre tableau se complète à chaque ouverture

Si besoin n'hésitez pas

Dan,

Merci beaucoup pour vos explications qui sont bien claires et détaillées.

Passez une bonne journée.

Bonjour…

Il est bien entendu que l’on sait que l’on va traiter un Tableau structuré !

La plupart du temps, on peut se dispenser du vocabulaire spécial (lourd) dévolu (classe ListObjects) en utilisant le vocabulaire simple de base (classe Range).

Le tableau étant appelé TB*, on lui rajoute après sa dernière ligne une nouvelle ligne* avec

Dim L As Long 'ici pour récupérer la valeur dans d'autres macros à venir
Private Sub UserForm_initialize() 
  L = IIf(Application.CountA([TB]) > 0, [TB].Rows.Count + 1, 2)
  [TB].Rows(L) = "***" ‘pour remplir la ligne ajoutée (automatiquement)
End Sub

Pour la ligne ajoutée au Tableau, si celui-ci n’est pas vide (nombre de contenus > 0) elle sera 1 ligne en dessous de la dernière (+1) sinon 1 ligne en dessous de la première (celle-ci étant toujours 1, on sait que 1+1 = 2).

*On facilite les saisies avec des noms courts

vocabulaire spécial (lourd) dévolu (classe ListObjects)

Plus lourd à écrire mais dévolu ? ---> https://docs.microsoft.com/fr-fr/office/vba/api/excel.listobjects

vocabulaire simple de base (classe Range).

Le tout est de voir ce que le demandeur comprend le mieux des Range, Listobjects ou des signes [ ].

C'est la même chose pour les variables déclarée &, $... (utilisés depuis le Basic 1963) . Mettre String, Long... me parait plus parlant.

A+

Bonjour le fil,

Pour moi le développement avec les range entre crochets, c'est lorsque qu'on est fainéant et ce n'est pas conseillé
Il faut savoir que les crochets (équivalent de méthode Evaluate) donnent un temps de calcul plus long.

Concernant les tableaux structurés, il y a un bel article à ce sujet : https://www.excel-pratique.com/fr/astuces/tableau-structure

Et notamment sur le détail des structures :

Il y a 2 possibilités pour faire référence à un tableau structuré et ses sous-ensembles dans VBA : faire référence à l'objet "ListObject" ou aux références structurés sous forme de plage nommée Range("TableauMachin[Truc]").

Concernant la syntaxe ListObject, il est possible (comme pour une feuille par exemple) de faire référence au tableau par le biais de son index (1, 2, etc) ou de son nom ("TableVenteFruits", etc).

Voili, voilà, si ça peut apporter de l'eau au moulin

A+

Re…

Sans vouloir relancer des débats stériles de Théoriciens pas à l'écoute des autres*, voilà quelques remarques personnelles tirées d’un de mes messages envoyé par MP.

l faut savoir ( ?) que les crochets (équivalent de méthode Evaluate) donnent un temps de calcul plus long.

Argument classique mais sans beaucoup de valeur quand on compare des outils dans des situations différentes.

Ton lien est destiné à la découverte*… mais une fois celle-ci passée, il me semble qu’il est primordial de passer de la Théorie à la Pratique, non ?

Cela ne fait penser à ceux qui utilisent l’Editeur VBA (lui aussi trop bavard certaines fois et pas dans ma langue natale) mais qui se font sans cesse reprendre pour élaguer les discours produits notamment, le plus courant : « .Select… » à profusion.

En complément du hasard de la comparaison : rejettes-tu les « Cells(x,y) » pour n’utiliser que les Range() car c’est moins parlant ?

range vs cells

Au siècle dernier, (et oui, je suis un vieux de la vieille), certains ont montré, exemples à l’appui, que malgré ce défaut, le second choix pouvait réduire la durée d’exécution dans d’énormes classeurs !

Il m'est arrivé, dans un débat sur la vitesse d'exécution, de donner un exemple dans lequel le choix du type de variable (Long vs Currency) pouvait à la surprise de certains participants, agir grandement.

Je ne me hasarde pas à comparer des outils dans les situations sont différentes , à comparer des vieux et nouveaux modèles (plus performants).

Pour ma part, la Théorie (généraliste) seule n’apporte pas grand- chose, sinon rien, quand elle n’est pas adaptée aux situations à traiter.

Tu ne peux quand même dire à un demandeur qui veut progresser d’ignorer la base : la classe Range ! Une cellule d’un Tableau (classe ListObjects) est avant tout une cellule de la Table disponible d’un onglet (classe Range).

Voili, voilà, si ça peut apporter de l'eau au moulin.

On ne doit pas souvent trinquer avec la même eau (souvent trafiquée après sa sortie et pour certaines, plein de bulles) .

* je ne donne pas de cours théoriques, de conseils … laissant chacun suivre le chemin à emprunter selon ses goûts, ses aptitudes, son savoir, son savoir-faire ….

Bonsoir Ordonc,

Je vais clôturer ce sujet, car il est résolu et personnellement tu ne m'apportes rien de plus dans tes palabres
de plus, je vois que tes mauvais travers ont la vie dure

Si je ne fais pas erreur... tu t'es fait viré d'un autre forum ou tu avais un autre pseudo... et tu faisais déjà ton prof !

Rechercher des sujets similaires à "copier derniere ligne vide tableau structure"