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.
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.
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
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.
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à..
J'ai édité mon message et proposé un code pour tout l'UserForm.
Un ListObject n'a pas de propriété Cells. Il à des propriétés Range, HeaderRowRange et DataBodyRange
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é.
J'ai édité mon message et proposé un code pour tout l'UserForm.
Un ListObject n'a pas de propriété Cells. Il à des propriétés Range, HeaderRowRange et DataBodyRange
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!!
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