XL 2013 Couper-coller une ligne d'un tableau pour coller dans un autre tableau

Ananas94

XLDnaute Junior
Bonjour !

Je souhaite à l'aide d'une macro, supprimer un outil d'un tableau; c'est à dire que l'outil passe du tableau de l'onglet "Outils_utilises" à l'onglet "Outils_HA". J'ai codé quelque chose, avec un autre userform cette fois (userForm2).

Je rencontre plusieurs problème : tout d'abord je souhaite que l'utilisateur choisisse son outil dans la liste des outils qui sont actuellement dans le tableau "Outils_utilisés". néanmoins, cette liste doit être dynamique car des outils sont susceptibles d'avoir disparus/ été ajoutés, etc.. En fait, j'aimerais lister la colonne "noms" du tableau, mais mon code ne fonctionne pas :

VB:
'Pour le formulaire
Private Sub UserForm_Initialize()

    Dim LO1 As ListObject
    Dim LO2 As ListObject
   Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    Dim j As Integer
    Dim nbOutils As Integer
    
    Set Ws1 = Sheets("Outils_utilises")
    Set LO1 = Ws1.ListObjects("Tab_outils_utilises")
    Set Ws2 = Sheets("Outils_HA")
    Set LO2 = Ws2.ListObjects("Tab_outils_HA")
        
    'Nom de l'outil'
    ComboBox1.ColumnCount = 1
    ComboBox1.List() = LO1.ListColumns("Nom")[B] 'Affichage de la colonne "Noms" [/B]
    
    'Date de mise hors application  :'
    Me.Controls("TextBox3").Visible = True

J'ai tenté beaucoup de codes, notamment en code java (c'est parti trèèèès loin) ; sans succès !

Ensuite, une fois que la personne a sélectionné le nom de son outil, l'ordinateur doit chercher le nom de cet outil dans le tableau et couper-coller les valeurs du tableau correspondantes. J'ai sectionné cette grosse partie en plusieurs étapes que voici :

Code:
Private Sub CommandButton1_Click() 'Pour la mise hors application d'un outil


    Dim confirmation
    Dim i As Integer
    Dim LO1 As ListObject
    Dim LO2 As ListObject

    Set Ws1 = Sheets("Outils_utilises")
    Set LO1 = Ws1.ListObjects("Tab_outils_utilises")
    Set Ws2 = Sheets("Outils_HA")
    Set LO2 = Ws2.ListObjects("Tab_outils_HA")

 [U]'Etape 1 - L'ordinateur cherche l'outil dans la liste des outils[/U]

'[U]Etape 2 - Insertion d'une ligne à la fin du tableau "Tab_outils_HA :"[/U]
    Insertion = LO2.ListRows.Add(AlwaysInsert:=True)
   [U] 'Etape 3 - Couper-coller des cellules du tableau "tab_outils_utilises" qui se trouvent en colonnes 2 à 7 :'[/U]
    Ajout1 = LO1.ListRows(nom_outil).Cut.Range(i, 2 / 7)
   [U] 'Etape 4 :Collage de ces cellules dans la dernière ligne , dans les cellules 2 à 7 du tableau "Tab_outils_HA":'[/U]
    LO1.ListRows.Paste LO2.ListRows.Range(i, 2 / 7)
   [U] 'Etape 5 - Copie des cellules du tableau "tab_outils_utilises" qui se trouvent en colonnes 8 à 25 :'[/U]
    Ajout2 = LO1.ListRows(nom_outil).Cut.Range(i, 8 / 25)
   [U] 'Etape 6 - Collage de ces cellules dans la dernière ligne , dans les cellules 9 à 26 du tableau "Tab_outils_HA" :'[/U]
    LO1.ListRows.Paste LO2.ListRows.Range(i, 9 / 26)
    
   [I] 'Message de confirmation'[/I]
    confirmation = MsgBox(Prompt:="Outil inséré avec succès !", Buttons:=vbOKOnly, Title:="Ajout d'un outil réussi")
        
    Me.Hide
    Unload Me
    
End Sub

Lorsque je teste mon code, j'obtiens un message d'erreur :

1585562466931.png


Et lorsque je clique sur débogage :

1585562572566.png


Le problème viendrait donc de la toute première étape, lorsque je souhaite afficher la liste (dynamique) des outils listés dans la colonne "Noms" du tableau. Je pense que mon code :

ComboBox1.ColumnCount = 1
ComboBox1.List() = LO1.ListColumns("Nom")

Est faux. Mais je ne vois pas comment l'améliorer.

Auriez-vous une petite idée?

Merci :)
Anna
 

Pièces jointes

  • etat_des_lieux_carto_test.xlsm
    58.4 KB · Affichages: 9
Solution
Re

J'ai allégé encore un peu le code ;)
(en bonus, le petit souci précédemment évoqué n'en est plus un)
VB:
Private Sub CommandButton1_Click() 'Pour la mise hors application d'un outil
Dim confirmation, X&, LO1 As ListObject, LO2 As ListObject
Application.ScreenUpdating = False
Set LO1 = Sheets("Outils_utilises").ListObjects("Tab_outils_utilises")
Set LO2 = Sheets("Outils_HA").ListObjects("Tab_outils_HA")
With LO1
    X = Application.Match(ComboBox1, .ListColumns("Nom").DataBodyRange, 0)
    .Range(X + 1, 0).Resize(, 26).Cut LO2.ListRows.Add.Range(1, 0)
    .ListColumns(2).DataBodyRange.SpecialCells(4).Rows.Delete
End With
'Message de confirmation'
Me.Hide
Unload Me
End Sub

Staple1600

XLDnaute Barbatruc
Re

Quand il y a une erreur, pour la trouver, on peut (puisque confiné) prendre le temps de faire ceci.
Tu mets en commentaires tout le code VBA de tes userforms
(avec le bouton "Commenter bloc" de la barre d'outils Edition de VBE
>voir sur le net pour le How To et détails...

Une fois, cela fait, tu décommentes les procédures une à une en affichant l'Userform entre chaque "décommentement".
Jusqu'à ce que l'erreur survienne

Je te laisse tester la chose ;)

PS: Parce que là, je commence à avoir N etat_des_lieux*.xlsm sur mon disque dur ;)
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Anna

•>Anna
Par acquis de conscience, et parce que je subodorais la chose, j'ai quand même ouvert ton classeur...
Et Bingo !!!
Le problème (qui va devenir) récurrent, si tu n'y prends pas garde, c'est...
Attendez la suite.... (oui je pararaphrase Barney S. ;))

.... c'est l'inattention :rolleyes:

Anna: Rappelles-moi, stp, le nom de l'entête de la colonne B du tableau LO1 ?

Et relis celui qu'y se trouve dans le code de l'userform2 quand tu fais référence à cette colonne ?
 

Ananas94

XLDnaute Junior
Bonjour Staple1600 (ahahah je ne m'en remets pas!)!!
Merci merci MERCI ! Je ne sais pas comment je me débrouille, mais parfois je me demande où je suis ! Je pense que c'est à force d'avoir la tête dans le guidon .. En tout cas merci, vous êtes trop fort :)
Anna
 

Discussions similaires