VBA Copier depuis la listebox vers la feuille

Hello,

Je suis bloqué. J'ai un userform avec une listbox. Dans la listbox il y a le contenu de la Feuil1. Je peux copier la ligne selectionnée depuis la listebox vers la Feuil2. Mais je voudrais supprimer la ligne qui vient d'etre copié et je ne sais pas comment faire. Ou placer le Selection.Delete ?

Private Sub CommandButton3_Click()
    Dim lngSelected As Long, lngRows As Long, lngColumn As Long
    Dim myArray(1 To 9)

    For lngSelected = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(lngSelected) Then
            lngRows = lngRows + 1
            For lngColumn = 1 To 9
                myArray(lngColumn) = Me.ListBox1.List(lngSelected, lngColumn - 1)
            Next lngColumn
            Worksheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, 9) = myArray
        End If
    Next lngSelected
    MsgBox lngRows & " Copie OK"
End Sub

Bonsoir Betabong, bonsoir le forum,

Peut-être comme ça :

Private Sub CommandButton3_Click()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim LI As Long 'déclare la variable LI (LIgne)

Set OS = Worksheets("Feuil1") 'définit l'onglet source OS (à adapter à ton cas)
Set OD = Worksheets("Feuil2") 'définit l'onglet destination OD
If OD.Range("A1").Value = "" Then 'condition : si A1 de l'onglet destination est vide
    Set DEST = OD.Range("A1") 'définit la cellule de destination DEST (A1)
Else 'sinon
    'définit la cellule de destination DEST (première cellule vide de la colonne A de l'onglet destination
    Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0)
End If 'fin de la condition
For I = 0 To Me.ListBox1.ListCount - 1 'boucle sur tous les éléments de la ListBox1
    If Me.ListBox1.Selected(I) = True Then 'condition : si l'élément est sélectionné
        LI = I + 1 'définit la ligne LI
        OS.Cells(LI, "A").Resize(9, 1).Copy DEST 'copie les 9 premières cellules de la ligne LI et les colle dans DEST
        Me.ListBox1.RemoveItem (I) 'supprime l'élément I de la ListBox1
        Exit For 'sort de la boucle
    End If 'fin de la condition
Next I 'prochaine ligne I de la boucle
MsgBox "La ligne " & LI & " a été copiée !" 'message
End Sub

Bonsoir Betabong, bonsoir le forum,

Peut-être comme ça :

...
        Me.ListBox1.RemoveItem (I) 'supprime l'élément I de la ListBox1
 ...

Bonjour ThauThème et bonjour le forum. Merci pour la réponse rapide et votre aide

Me.ListBox1.RemoveItem (i) 'supprime l'élément I de la ListBox1

Me donne l'erreur en jaune, malgré l'erreur, copie la source mais ne supprime pas. Enfaite ma listbox reflette toutes les données de la Feuil1, donc je voudrais juste supprimer toute la ligne de la Feuil1 qui vient d'être copié.

J'ai trouvé ce code qui fait son travail :

Private Sub CommandButton3_Click()
Dim i As Integer
For i = 0 To Range("A65356").End(xlUp).Row - 1
    If ListBox1.Selected(i) Then
        Rows(i + 1).Select
        Selection.Delete
End If
Next i

End Sub

Pouvez-vous m'aider à intégrer ce code ? Je ne sais si j'ai bien expliqué mon problème

Merci!

Re,

En fonction de la manière dont est alimentée la ListBox1, je pense que cela vient du fait que tu ne rafraîchis pas ta UserForm. Donc elle affiche toujours la ligne supprimée dans la ListBox1.

Un simple :

Unload Me
Userform1.Show

en fin de code devrait faire l'affaire.

Le code complet :

Private Sub CommandButton3_Click()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim LI As Long 'déclare la variable LI (LIgne)

Set OS = Worksheets("Feuil1") 'définit l'onglet source OS (à adapter à ton cas)
Set OD = Worksheets("Feuil2") 'définit l'onglet destination OD
If OD.Range("A1").Value = "" Then 'condition : si A1 de l'onglet destination est vide
    Set DEST = OD.Range("A1") 'définit la cellule de destination DEST (A1)
Else 'sinon
    'définit la cellule de destination DEST (première cellule vide de la colonne A de l'onglet destination
    Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0)
End If 'fin de la condition
For I = 0 To Me.ListBox1.ListCount - 1 'boucle sur tous les éléments de la ListBox1
    If Me.ListBox1.Selected(I) = True Then 'condition : si l'élément est sélectionné
        LI = I + 1 'définit la ligne LI
        OS.Cells(LI, "A").Resize(9, 1).Copy DEST 'copie les 9 premières cellules de la ligne LI et les colle dans DEST
        Me.ListBox1.RemoveItem (I) 'supprime l'élément I de la ListBox1
        Exit For 'sort de la boucle
    End If 'fin de la condition
Next I 'prochaine ligne I de la boucle
MsgBox "La ligne " & LI & " a été copiée !" 'message
Unload Me
Userform1.Show'nom de l'Userform à adapter à ton cas
End Sub

Re,

En fonction de la manière dont est alimentée la ListBox1, je pense que cela vient du fait que tu ne rafraîchis pas ta UserForm. Donc elle affiche toujours la ligne supprimée dans la ListBox1.

Un simple :

Unload Me
Userform1.Show

Malheuresement ça ne fontion pas. La listbox elle est simplement alimenté par (J'ai mis les parametrès tout simplement dans l'interface de VBA :

ColumCount = 3 (j'ai 3 collones)

Rowsource = A1:DA65356

Peut-être que c'est en lien avec la façon que j'ai voulu faire ?

Re,

Perso je n'utilise pas la propriété RowSource mais j'ai l'impression que tu n'as pas le choix. Pourquoi toutes les lignes ?

Il y a surement une solution mais sans le fichier on va perdre un temps fou...

Re,

Perso je n'utilise pas la propriété RowSource mais j'ai l'impression que tu n'as pas le choix. Pourquoi toutes les lignes ?

Il y a surement une solution mais sans le fichier on va perdre un temps fou...

Re,

Alors je ne sais pas comment autrement faire Oui c'est plus simple, je te mets en pièce jointe un exemple que j'ai fait.

Enfaite mon idée c'est de choisir via la Listbox1 une personne qui se trouve dans l'onglet DB.

Le moment quand j'aurais cliqué sur le bouton Archiver (en rouge), je voudrais que toute la ligne de la personne se transfert à l'onglet Archives.

Le but c'est une sorte de couper/coller de DB ---> Archives et non copier/coller.

Merci pour ton aide.

21userform.xlsx (6.17 Ko)

Re,

Ton fichier est vide et avec une extension .xlsx. Il faudrait un fichier avec des données et .xlsm !...

Re,

Ton fichier est vide et avec une extension .xlsx. Il faudrait un fichier avec des données et .xlsm !...

Pardon erreur d'upload :

15userform.xlsm (22.40 Ko)

Re,

En pièce jointe ton fichier modifié avec le code ci-dessous :

Private OS As Worksheet 'déclare la variable OS (Onglet Source)
Private OD As Worksheet 'déclare la variable OD (Onglet Destination)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim PL As Range 'déclare la variable PL (PLage)

Set OS = Worksheets("DB") 'définit l'onglet source OS
Set OD = Worksheets("Archives") 'définit l'onglet destination OD
Set PL = OS.Range("A1").CurrentRegion 'définit la plage PL
Set PL = PL.Offset(1, 0).Resize(PL.Rows.Count - 1, PL.Columns.Count) 'redéfinit la plage PL sans la première ligne
TV = PL 'définit le tableau des valeurs TV
NC = PL.Columns.Count 'définit le nombre NC de colonnes de la plage PL
With Me.ListBox1 'prend en compte la ListBox1
    .ColumnCount = NC 'définit le nombre de colonne NC de la LitBox1
    .List = TV 'alimente la ListBox1 (la propriété RowSource doit être vide)
End With 'fin de la prise en compte de la ListBox1
End Sub

Private Sub cmdAjouter_Click() 'bouton "Ajouter"
Dim I As Integer 'déclare la variable I (Incrément)
Dim LI As Integer 'déclare la variable LI

LI = OS.Cells(Application.Rows.Count, "A").End(xlUp).Row + 1 'définit la ligne LI
With Me.ListBox1 'prend en compte la ListBox1
    .AddItem 'ajoute un élément
    For I = 0 To NC - 1 'boucle sur toutes les colonnes I de la ListBox1
        'ajoute la valeur de la TextBox de la boucle à la colonne I de la ListBox1
        .Column(I, .ListCount - 1) = Me.Controls("TextBox" & I + 1).Value
        'ajoute la valeur de la TextBox de la boucle dans la cellule ligne LI, colonne I+1 de l'onglet OS
        OS.Cells(LI, I + 1).Value = Me.Controls("TextBox" & I + 1).Value
    Next I 'fin de la prise en compte de la ListBox1
End With 'fin de la prise en compte de la ListBox1
End Sub

Private Sub Archiver_Click() 'bouton "Archiver"
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim LI As Long 'déclare la variable LI (LIgne)

Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
For I = 0 To Me.ListBox1.ListCount - 1 'boucle sur tous les éléments de la ListBox1
    If Me.ListBox1.Selected(I) = True Then 'condition : si l'élément est sélectionné
        LI = I + 2 'définit la ligne LI
        OS.Cells(LI, "A").Resize(1, NC).Copy DEST 'copie les NC premières cellules de la ligne LI et les colle dans DEST
        Me.ListBox1.RemoveItem (I) 'supprime l'élément I de la ListBox1
        OS.Cells(LI, "A").Resize(1, NC).Delete Shift:=xlShiftUp 'supprime les cellules de la ligne LI
        Exit For 'sort de la boucle
    End If 'fin de la condition
Next I 'prochaine ligne I de la boucle
MsgBox "La ligne " & LI & " a été copiée !" 'message
End Sub
33betabong-v01.xlsm (22.20 Ko)

Tu es incroyable merci beaucoup ! Tu m'a sauvé, je ne comprenais absolument rien étant novice, pourtant j'en ai passé du temps dessus.

Dis je ne voudrais surtout pas abuser de ton temps, mais si tu veux bien me guider pour la suite de mon projet, je te serais très reconnaissant.

- Quelle est la meilleure façon de faire une recherche multiple via le userform selon les critères de la ligne A1 (N°Client, N°Série, Nom, Prénom etc.. de ma base de donné ? (Par exemple dans mon userform, un textbox en haut à droite, à côté un bouton "Recherche" et les résultats qui s'affichent dans la ListBox) mais je voudrais afficher les doublons de résultats, surtout un numéro de série qui peut être attribué pour 5 personnes ou plus.

Je peux créer un autre sujet pour faire profiter les autres personnes ou juste avoir un peu d infos ici et revenir pour la suite .

Merci !

Rechercher des sujets similaires à "vba copier listebox feuille"