XL 2013 Couper-coller ligne d'un tableau structuré dans un autre tableau

Tubule

XLDnaute Nouveau
Bonjour,

Je me suis largement inspirée des réponses trouvées dans ce forum, et ça m'a bien aidé pour résoudre mon problème. Néanmoins, celui-ci persiste.

J'ai 2 tableaux structurés, dans 2 pages différentes. Pour effectuer un "archivage" de dossier, l’utilisateur choisit via un formulaire un nom de dossier qu'il veut archiver. Pendant ce temps, la ligne du tableau contenant ce nom de dossier est sensée être coupée et collée dans l'autre tableau.
La date de l'archivage est également sensée apparaître dans la colonne de date (première colonne du tableau).

Pour cela, j'ai rédigé le code suivant (inspiré de ce forum):

VB:
With LO1 'Coupage-collage de la ligne du dossier
        X = Application.Match(ComboBox1, .ListColumns("Dossier").DataBodyRange, 0)
        .Range(X, 0).Offset(0, -1).Value = Now() 'Date de l'archivage dans la colonne "date dernière modification"
        .Range(X, 0).Cut LO2.ListRows.Add.Range(1, 0)
        .Range(X, 0).EntireRow.Delete
    End With

Néanmoins, ça ne fonctionne pas du tout. J'obtiens le message d'erreur suivant : "Erreur définie par l'application ou par l'objet" avec la ligne du changement de date surlignée. Je ne comprends pas ce qui ne va pas.

Vous trouverez en pièce jointe un fichier test.

Merci d'avance pour le coup de main.
 

Pièces jointes

  • test.xlsm
    32.7 KB · Affichages: 21

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Tubule,
VB:
X = Application.Match(ComboBox1, .ListColumns("Dossier").DataBodyRange, 0)
Renvoie l'index où a été trouvé la valeur validée de BomboBox1, c'est à dire un nombre.
Donc .Range(X,0) est une erreur de syntaxe. Il attend du type Range ("A1")
Utilisez plutôt .Cells(X,Y) où X représente le N° de ligne, et le N° de colonne, donc 1 pour le date.
Ensuite je ne vois pas quelle ligne vous voulez supprimer. Cela ne peut pas être la ligne que vous venez de modifier sinon quel intérêt de la remplir, donc il vous faut gérer correctement les N° de colonnes.
 

chris

XLDnaute Barbatruc
Bonjour à tous
VB:
    Dim Z As Long
    With LO1 'Coupage-collage de la ligne du dossier
        X = Application.Match(ComboBox1, .ListColumns("Dossier").DataBodyRange, 0)
        .DataBodyRange.Rows(X).Cells(1, 1).Value = Now() 'Date de l'archivage dans la colonne "date dernière modification"
        Z = LO2.ListRows.Add.Index
        LO2.ListRows(Z).Range.Value = .DataBodyRange.Rows(X).Value
        .ListRows(X).Delete
    End With
 

Dranreb

XLDnaute Barbatruc
J'écrirais peut être le tout comme ça :
VB:
Option Explicit
Private LOtPlan As ListObject, LOtArch As ListObject
Private Sub UserForm_Initialize() 'Formulaire d'archivage d'un dossier
   Set LOtPlan = Worksheets("Planning").ListObjects("Tab_Planning")
   Set LOtArch = Worksheets("Archives").ListObjects("Tab_Archivage")
   ComboBox1.List = LOtPlan.ListColumns("Dossier").DataBodyRange.Value
   End Sub
Private Sub CommandButton1_Click() 'Pour le bouton Valider
   Dim LRwPlan As ListRow, RngArch As Range
   If Not ComboBox1.MatchFound Then Exit Sub
   Set LRwPlan = LOtPlan.ListRows(ComboBox1.ListIndex + 1)
   Set RngArch = LOtArch.ListRows.Add.Range
   RngArch.Value = LRwPlan.Range.Value
   RngArch(1, 1).Value = Now
   LRwPlan.Delete
   MsgBox Prompt:="Dossier archivé avec succès !", Buttons:=vbOKOnly, Title:="Archivage d'un dossier réussi"
   Unload Me
   End Sub
Private Sub CommandButton2_Click() 'Pour le bouton Annuler
   Unload Me
   End Sub
Remarque: il devrait être assez simple de pouvoir tout faire avec un seul UserForm, ajout, modification et archivage. Mais il faudrait des TextBox pour les autres colonnes.
 
Dernière édition:

Tubule

XLDnaute Nouveau
Bonjour Tubule,
VB:
X = Application.Match(ComboBox1, .ListColumns("Dossier").DataBodyRange, 0)
Renvoie l'index où a été trouvé la valeur validée de BomboBox1, c'est à dire un nombre.
Donc .Range(X,0) est une erreur de syntaxe. Il attend du type Range ("A1")
Utilisez plutôt .Cells(X,Y) où X représente le N° de ligne, et le N° de colonne, donc 1 pour le date.
Ensuite je ne vois pas quelle ligne vous voulez supprimer. Cela ne peut pas être la ligne que vous venez de modifier sinon quel intérêt de la remplir, donc il vous faut gérer correctement les N° de colonnes.

Merci Sylvanu pour voter aide. Je cherche à couper la ligne que je viens d'ajouter pour l'insérer ensuite dans un second tableau. Ensuite, l'action est de supprimer la ligne vide qui va rester.

J'ai ainsi modifié le code avec cells comme vous me l'avez indiqué :

VB:
With LO1 'Coupage-collage de la ligne du dossier
        X = Application.Match(ComboBox1, .ListColumns("Dossier").DataBodyRange, 0) 'Renvoie l'index de ligne où a été trouvée la valeur validée de Combobox1 (donc un nombre)
        .Cells(X, 1).Value = Format(Date, "dd-mm-yy") 'Date de l'archivage dans la 1è colonne nommée : "date dernière modification"
        .Range(X, 0).Cut LO2.ListRows.Add.Range(1, 0) 'On coupe la ligne qui vient d'être remplie pour l'archiver dans le second tableau
        .Range(X, 0).EntireRow.Delete 'On supprime la ligne vide qui vient d'être coupée
    End With

Cette fois-ci le message d'erreur change ! "Propriété ou méthode non gérée par cet objet". Je pense que cela vient de cells, puisque l'on a changé d'objet effectivement.
Je suis désolée je suis encore bloquée, je maîtrise mal ces éléments-là..

Auriez-vous une idée ?
Merci
 

Pièces jointes

  • test.xlsm
    33.4 KB · Affichages: 6

Tubule

XLDnaute Nouveau
J'écrirais peut être le tout comme ça :
VB:
Option Explicit
Private LOtPlan As ListObject, LOtArch As ListObject
Private Sub UserForm_Initialize() 'Formulaire d'archivage d'un dossier
   Set LOtPlan = Worksheets("Planning").ListObjects("Tab_Planning")
   Set LOtArch = Worksheets("Archives").ListObjects("Tab_Archivage")
   ComboBox1.List = LOtPlan.ListColumns("Dossier").DataBodyRange.Value
   End Sub
Private Sub CommandButton1_Click() 'Pour le bouton Valider
   Dim LRwPlan As ListRow, RngArch As Range
   If Not ComboBox1.MatchFound Then Exit Sub
   Set LRwPlan = LOtPlan.ListRows(ComboBox1.ListIndex + 1)
   Set RngArch = LOtArch.ListRows.Add.Range
   RngArch.Value = LRwPlan.Range.Value
   RngArch(1, 1).Value = Now
   LRwPlan.Delete
   MsgBox Prompt:="Dossier archivé avec succès !", Buttons:=vbOKOnly, Title:="Archivage d'un dossier réussi"
   Unload Me
   End Sub
Private Sub CommandButton2_Click() 'Pour le bouton Annuler
   Unload Me
   End Sub
Remarque: il devrait être assez simple de pouvoir tout faire avec un seul UserForm, ajout, modification et archivage. Mais il faudrait des TextBox pour les autres colonnes.


Merci pour votre aide Dranreb
Je viens de tester et je trouve que votre idée est efficace : on dit que les 2 lignes dans les 2 tableaux sont identiques et on supprime la ligne du premier tableau planning (si j'ai bien compris).
Néanmoins, l'erreur: "variable object ou de bloc with non définie" apparaît, et je ne comprends aps ce qui ne va pas. Je pense qu'il y a un problème avec le type de l'objet LRwPlan mais je ne maîtrise pas assez VBA pour affirmer cela.
Vous trouverez en pièce jointe votre code testé.
 

Pièces jointes

  • test.xlsm
    29.9 KB · Affichages: 5

Tubule

XLDnaute Nouveau
RE

Le code que j'ai donné fonctionne parfaitement et est adapté aux tableaux structués...

Il remplace tes lignes pour la partie concernée

Merci beaucoup ! Ca fonctionne parfaitement, c'est tout à fait ce que je cherchais :)
Merci également à tous pour votre aide et votre disponibilité.
Je vais avancer sur mon fichier, il est probable que je fasse de nouveau appel à vous sur ce fichier.. Je vous remercie tous vivement!!
 

Tubule

XLDnaute Nouveau
J'écrirais peut être le tout comme ça :
VB:
Option Explicit
Private LOtPlan As ListObject, LOtArch As ListObject
Private Sub UserForm_Initialize() 'Formulaire d'archivage d'un dossier
   Set LOtPlan = Worksheets("Planning").ListObjects("Tab_Planning")
   Set LOtArch = Worksheets("Archives").ListObjects("Tab_Archivage")
   ComboBox1.List = LOtPlan.ListColumns("Dossier").DataBodyRange.Value
   End Sub
Private Sub CommandButton1_Click() 'Pour le bouton Valider
   Dim LRwPlan As ListRow, RngArch As Range
   If Not ComboBox1.MatchFound Then Exit Sub
   Set LRwPlan = LOtPlan.ListRows(ComboBox1.ListIndex + 1)
   Set RngArch = LOtArch.ListRows.Add.Range
   RngArch.Value = LRwPlan.Range.Value
   RngArch(1, 1).Value = Now
   LRwPlan.Delete
   MsgBox Prompt:="Dossier archivé avec succès !", Buttons:=vbOKOnly, Title:="Archivage d'un dossier réussi"
   Unload Me
   End Sub
Private Sub CommandButton2_Click() 'Pour le bouton Annuler
   Unload Me
   End Sub
Remarque: il devrait être assez simple de pouvoir tout faire avec un seul UserForm, ajout, modification et archivage. Mais il faudrait des TextBox pour les autres colonnes.

Merci Dranreb, votre code fonctionne également, je n'avais pas tout copié effectivement. Je suis désoéle pour cette méprise.
Je vous souhaite une très bonne journée et bravo
 

Discussions similaires

Statistiques des forums

Discussions
315 094
Messages
2 116 150
Membres
112 670
dernier inscrit
Flow87