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
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.
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 :
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
Tu es incroyable merci beaucoup !
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 !