XL 2013 listbox1 vers listbox2 plus de 10 colonnes

CGU2022.

XLDnaute Junior
Bonjour
J'ai ce code pour copier une ligne d'une listebox1 vers listebox2
mais ce code est limité a 10

quelqu'un à un autre code ?

Private Sub Cmd_ajoutarticlechantier_Click()
Dim ligne As Variant
Dim k As Integer
Dim i As Integer

i = ListBox1.ListIndex
ListBox2.AddItem ListBox1.List(i, 0)
For k = 1 To 9
ListBox2.List(ListBox2.ListCount - 1, k) = ListBox1.List(i, k)
Next

End Sub



Merci
 
Solution
Bonjour @job75
et oui comme je l'explique dans la ressource le clear vide tout mais ne supprime pas le dimensionnement meme au delà de 10 colonnes
parti de là tant que le userform est affiché tu peux faire ce que tu veux

a la place de
VB:
with listbox2
.columncount=20
'...etc..etc..
.ColumnWidths = Replace(Trim(Application.Rept("40 ", .ColumnCount + 1)), " ", ";")
 with
tu peux faire comme ça
'maintenant on pré dimensionne la listbox2 à 20 colonnes
Code:
'pour 20 colonnes 'on met une ligne avec un array de 1  a 20'
' dans cette exemple j'utilise l'astuce d'evaluate pour créer l'array
'ensuite on clear simplement la listbox '
'la dimension colonne restera tant que le userform est en show '
With ListBox2:
   .ColumnCount = 20...

job75

XLDnaute Barbatruc
Bonsoir,

Effectivement avec la méthode AddItem on ne peut pas dépasser 10 colonnes.

Il faut utiliser la méthode .List :
VB:
Private Sub Cmd_ajoutarticlechantier_Click()
Dim a(), nlig&, ncol%, b(), i&, j%
a = ListBox2.List
nlig = UBound(a)
ncol = UBound(a, 2)
ReDim b(nlig + 1, ncol)
'---transfert des données de a dans b---
For i = 0 To nlig
    For j = 0 To ncol
        b(i, j) = a(i, j)
Next j, i
'---ajout de la ligne sélectionnée--
i = ListBox1.ListIndex
For j = 0 To ncol
    b(nlig + 1, j) = ListBox1.List(i, j)
Next
'---transfert dans ListBox2---
ListBox2.List = b
End Sub
A+
 

patricktoulon

XLDnaute Barbatruc

job75

XLDnaute Barbatruc
Re, bonsoir patricktoulon,

Pour que la macro du post #2 fonctionne il faut qu'au départ ListBox2 ne soit pas vide.

Et qu'une ligne soit sélectionnée dans ListBox1.

Cette macro fonctionne dans tous les cas :
VB:
Private Sub Cmd_ajoutarticlechantier_Click()
Dim a(), nlig&, ncol%, b(), i&, j%
If ListBox2.ListCount Then
    a = ListBox2.List
    nlig = UBound(a)
Else
    nlig = -1
End If
ncol = ListBox2.ColumnCount - 1
ReDim b(nlig + 1, ncol)
'---transfert des données de a dans b---
For i = 0 To nlig
    For j = 0 To ncol
        b(i, j) = a(i, j)
Next j, i
'---ajout de la ligne sélectionnée--
i = ListBox1.ListIndex
If i = -1 Then Exit Sub 'si aucune sélection
For j = 0 To ncol
    b(nlig + 1, j) = ListBox1.List(i, j)
Next
'---transfert dans ListBox2---
ListBox2.List = b
End Sub
A+
 

patricktoulon

XLDnaute Barbatruc
re
oui avec un tableau de toute façon on fait ce que l'on veut en terme de colonne
ce que j'ai voulu te montrer c'est que l'on peut avoir plus de 10 colonne avec additem
tout simplement par ce que le clear ne supprime pas le dimensionnement qui a été fait avant avec un range ou une variable tableau
 

patricktoulon

XLDnaute Barbatruc
re
@job75 ci joint un fichier
un userform avec 2 listboxs et deux boutons
1 copier
2 transférer
les deux procèdent sans variable tableau avec additem
dans l'ordre pour copier et a reculons pour le transfert car on remove l'item transféré de la lisrbox1 après l'avoir transféré
pour info j'ai 20 colonnes
aucun problème de colonne au delà de 10 avec Additem
 

Pièces jointes

  • list to list by Additem 15 colonnes.xlsm
    17.7 KB · Affichages: 22

patricktoulon

XLDnaute Barbatruc
Bonjour @job75
et oui comme je l'explique dans la ressource le clear vide tout mais ne supprime pas le dimensionnement meme au delà de 10 colonnes
parti de là tant que le userform est affiché tu peux faire ce que tu veux

a la place de
VB:
with listbox2
.columncount=20
'...etc..etc..
.ColumnWidths = Replace(Trim(Application.Rept("40 ", .ColumnCount + 1)), " ", ";")
 with
tu peux faire comme ça
'maintenant on pré dimensionne la listbox2 à 20 colonnes
Code:
'pour 20 colonnes 'on met une ligne avec un array de 1  a 20'
' dans cette exemple j'utilise l'astuce d'evaluate pour créer l'array
'ensuite on clear simplement la listbox '
'la dimension colonne restera tant que le userform est en show '
With ListBox2:
   .ColumnCount = 20
   .Column = Evaluate("COLUMN(" & Cells(1).Resize(, 20).EntireColumn.Address(0, 0) & ")"): .Clear
   .ColumnWidths = Replace(Trim(Application.Rept("40 ", .ColumnCount + 1)), " ", ";")
 End With
 

CGU2022.

XLDnaute Junior
Re, bonsoir patricktoulon,

Pour que la macro du post #2 fonctionne il faut qu'au départ ListBox2 ne soit pas vide.

Et qu'une ligne soit sélectionnée dans ListBox1.

Cette macro fonctionne dans tous les cas :
VB:
Private Sub Cmd_ajoutarticlechantier_Click()
Dim a(), nlig&, ncol%, b(), i&, j%
If ListBox2.ListCount Then
    a = ListBox2.List
    nlig = UBound(a)
Else
    nlig = -1
End If
ncol = ListBox2.ColumnCount - 1
ReDim b(nlig + 1, ncol)
'---transfert des données de a dans b---
For i = 0 To nlig
    For j = 0 To ncol
        b(i, j) = a(i, j)
Next j, i
'---ajout de la ligne sélectionnée--
i = ListBox1.ListIndex
If i = -1 Then Exit Sub 'si aucune sélection
For j = 0 To ncol
    b(nlig + 1, j) = ListBox1.List(i, j)
Next
'---transfert dans ListBox2---
ListBox2.List = b
End Sub
A+
oui merci mais j'essaye d'avoir les autres colonnes ....
re
@job75 ci joint un fichier
un userform avec 2 listboxs et deux boutons
1 copier
2 transférer
les deux procèdent sans variable tableau avec additem
dans l'ordre pour copier et a reculons pour le transfert car on remove l'item transféré de la lisrbox1 après l'avoir transféré
pour info j'ai 20 colonnes
aucun problème de colonne au delà de 10 avec Additem
Merci je vais exploiter ton fichier , bonne journée ;)
 

patricktoulon

XLDnaute Barbatruc
re
encore un qui s'attribue le mérite de la solution !!!!!:mad:
no comment!!
1641629315251.png

ça tu le met a celui qui t'a apporté la solution pas à toi
 

Discussions similaires

Réponses
4
Affichages
165
Réponses
17
Affichages
760

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 838
dernier inscrit
Christelle.B86