Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Userform Listbox sans filtre Selection Multiple

11 réponses
Avatar
Alex
Bonjour =E0 tous,

Je me permets de vous solliciter car je souhaiterais faire un Userform
avec une listbox sans filtre.

1=B0/ Je souhaiterais que dans ma listebox du Userform figure l'ensemble
des lignes de ma BDD (Feuil1) de la colonne A =E0 M, il n'y a pas de
filtre car toutes les lignes doivent appara=EEtre.
J'ai bien trouv=E9 des exemples sur le groupe qui fonctionnent, mais
comme les lignes de VBA sont d'un niveau superieur au mien, apr=E8s je
n'arrive pas =E0 les modifier moi m=EAme si je dois proc=E9der =E0 une
modification.

2=B0/ J'ai mis Multiselect en position 1, afin de pouvoir s=E9lectionner
plusieurs lignes de cette BDD, afin d'attribuer pour chacune des
lignes s=E9lectionn=E9s un Num=E9ro que j'obtiens par un compteur qui se
situe sur ma feuille en Z1. La idem, j'ai trouv=E9 une solution sur le
Groupe, mais quand je dois modifier le code je n'y parviens pas, mon
controle de ligne devant se faire sur un num=E9ro qui figure en colonne
E de mes lignes selectionn=E9es.

Quelqu'un aurait il une solution pour faire cela en language VBA
"Debutant"

Merci par avance de votre aide.
Bien cordialement.
Alex

10 réponses

1 2
Avatar
Alex
Re Bonjour à Tous,

Voila ce que j'ai écrit et que j'ai réussi à réadapter avec ce que
j'avais trouvé dans le groupe.
Ce qui est bizarre tout fonctionne, mais sur mes conditions cela beug
systèmatiquement sur If Range("E13:G15").Value = "" Then. Voyez vous
a quoi cela peut être du ?
Merci par avance de votre aide.
Je mettrai le fichier sur Cjoint.com en rentrant chez moi, l'info du
boulot m'empechant de le déposer
Alex

Dim Rg As Range
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Private Sub BtnRetour_Click()
Unload CARTONJ
CHOIX.Show
End Sub
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -

Private Sub BtnValid_Click()
If Me.ListeBoite.ListIndex = -1 Then
'fin de la procédure
MsgBox "Veuillez selectionner au moins une ligne, SVP",
vbExclamation, "Instruction"
Exit Sub
End If

If Sheets("COMMERCIALISATION").Visible = False Then
Sheets("COMMERCIALISATION").Visible = True
End If
Sheets("COMMERCIALISATION").Select


With Me.ListeBoite
'Pour boucler sur chaque ligne sélectionnée du listbox
For A = 0 To .ListCount - 1
'Si la ligne est sélectionnée
If .Selected(A) = True Then
'Mettre Le numéro du compteur dans la colonne J de la
feuille C Commercialisation
'le 9 représente 9ème colonnes à droite de la colonne A
Rg.Item(A + 1, 1).Offset(, 9) = Me.Compteur.Value
'Remplissage Etiquette carton
Sheets("ETIQCARTON").Visible = True
Sheets("ETIQCARTON").Select
Range("E13:G15").Select
If Range("E13:G15").Value = "" Then
Range("E13:G15").Value = Me.Compteur.Value
End If


If Range("E17:G19").Value = "" Then
Range("E17:G17").Value = Rg.Item(A + 1, 1).Offset(, 4).Value
End If
Range("E19:G19").Value = Rg.Item(A + 1, 1).Offset(, 4).Value

If Range("E21:G23").Value < Rg.Item(A + 1, 1).Offset(, 8).Value Then
Range("E21:G23").Value = Rg.Item(A + 1, 1).Offset(, 8).Value
End If

'enlever (débleuir) la sélection de cette ligne du listbox
.Selected(A) = False
End If
Next
End With

Sheets("COMMERCIALISATION").Select

Range("AC1").Select
ActiveCell.FormulaR1C1 = "=RC[-1]+1"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Copy
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
' impression de l'etiquette

Sheets("ETIQCARTON").Select
MsgBox "Veuillez mettre une planche Etiquette de Format A4 dans
votre Imprimante. SVP", vbExclamation, "Instruction"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Range("E13:G15").Value = ""
Range("E17:G17").Value = ""
Range("E19:G19").Value = ""
Range("E21:G23").Value = ""
Sheets("ETIQCARTON").Visible = False




UserForm_Activate


End Sub
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -

Private Sub UserForm_Activate()
'Me.Compteur = Range("GLC!AB1").Value

Dim DerLig As Long
'Feuil1 n'est pas le nom de l'onglet mais de la propriété NAME
'de la feuille visible seulement dans la fenêtre de l'éditeur de code.
With Feuil15
'si aucune donnée dans la feuille, sortie de la procédure.
If IsEmpty(.UsedRange) Then Exit Sub
'Trouver la dernière ligne où il y a des données
'dans les colonnes A:M (à adapter)
DerLig = .Range("A:M").Find(What:="*", _
LookIn:=xlValues, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
'Comme les données débutent en ligne 2, derlig ne peut pas être plus
petit que 2
If DerLig < 2 Then DerLig = 2
'Affectation de la plage de cellules à une variable objet Range
Set Rg = .Range("A2:M" & DerLig)
End With
With Me.ListeBoite
' Nombre des colonnes du tableau ou plage de données
.ColumnCount = Rg.Columns.Count
'largeur des colonnes dans le listbox
.ColumnWidths = "40;40;372;55;30;45;45;45;45;45;45;45"
'Remplir le listbox avec les données du tableau
.List = Rg.Value
'S'assure qu'aucune ligne de listbox n'est sélectionnée.
.ListIndex = -1
End With

Me.Compteur.Value = Range("COMMERCIALISATION!AC1").Value
End Sub
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Avatar
MichD
Bonjour,

Si tu veux tester qu'une plage de cellule est vide :
tu n'obtiendras pas un bon résultat avec cela
If Range("E13:G15").Value = "" Then

Essaie plutôt ceci :
if application.CountA(Range("E13:G15")) = 0 then
Range("E13:G15").Value = Me.Compteur.Value
end if

attention : même si une feuille n'est pas visible, on peut y écrire ce que tu veux :
With Worksheets("LeNomDeLaFeuille")
if application.CountA(.Range("E13:G15")) = 0 then
.Range("E13:G15").Value = Me.Compteur.Value
end if
End With

NE PAS OUBLIER les points devant les objets "Range" pour signifier
que la plage appartient bien à la feuille.



MichD
--------------------------------------------
"Alex" a écrit dans le message de groupe de discussion :


Re Bonjour à Tous,

Voila ce que j'ai écrit et que j'ai réussi à réadapter avec ce que
j'avais trouvé dans le groupe.
Ce qui est bizarre tout fonctionne, mais sur mes conditions cela beug
systèmatiquement sur If Range("E13:G15").Value = "" Then. Voyez vous
a quoi cela peut être du ?
Merci par avance de votre aide.
Je mettrai le fichier sur Cjoint.com en rentrant chez moi, l'info du
boulot m'empechant de le déposer
Alex

Dim Rg As Range
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Private Sub BtnRetour_Click()
Unload CARTONJ
CHOIX.Show
End Sub
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -

Private Sub BtnValid_Click()
If Me.ListeBoite.ListIndex = -1 Then
'fin de la procédure
MsgBox "Veuillez selectionner au moins une ligne, SVP",
vbExclamation, "Instruction"
Exit Sub
End If

If Sheets("COMMERCIALISATION").Visible = False Then
Sheets("COMMERCIALISATION").Visible = True
End If
Sheets("COMMERCIALISATION").Select


With Me.ListeBoite
'Pour boucler sur chaque ligne sélectionnée du listbox
For A = 0 To .ListCount - 1
'Si la ligne est sélectionnée
If .Selected(A) = True Then
'Mettre Le numéro du compteur dans la colonne J de la
feuille C Commercialisation
'le 9 représente 9ème colonnes à droite de la colonne A
Rg.Item(A + 1, 1).Offset(, 9) = Me.Compteur.Value
'Remplissage Etiquette carton
Sheets("ETIQCARTON").Visible = True
Sheets("ETIQCARTON").Select
Range("E13:G15").Select
If Range("E13:G15").Value = "" Then
Range("E13:G15").Value = Me.Compteur.Value
End If


If Range("E17:G19").Value = "" Then
Range("E17:G17").Value = Rg.Item(A + 1, 1).Offset(, 4).Value
End If
Range("E19:G19").Value = Rg.Item(A + 1, 1).Offset(, 4).Value

If Range("E21:G23").Value < Rg.Item(A + 1, 1).Offset(, 8).Value Then
Range("E21:G23").Value = Rg.Item(A + 1, 1).Offset(, 8).Value
End If

'enlever (débleuir) la sélection de cette ligne du listbox
.Selected(A) = False
End If
Next
End With

Sheets("COMMERCIALISATION").Select

Range("AC1").Select
ActiveCell.FormulaR1C1 = "=RC[-1]+1"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Copy
ActiveCell.Offset(0, -1).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
' impression de l'etiquette

Sheets("ETIQCARTON").Select
MsgBox "Veuillez mettre une planche Etiquette de Format A4 dans
votre Imprimante. SVP", vbExclamation, "Instruction"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Range("E13:G15").Value = ""
Range("E17:G17").Value = ""
Range("E19:G19").Value = ""
Range("E21:G23").Value = ""
Sheets("ETIQCARTON").Visible = False




UserForm_Activate


End Sub
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -

Private Sub UserForm_Activate()
'Me.Compteur = Range("GLC!AB1").Value

Dim DerLig As Long
'Feuil1 n'est pas le nom de l'onglet mais de la propriété NAME
'de la feuille visible seulement dans la fenêtre de l'éditeur de code.
With Feuil15
'si aucune donnée dans la feuille, sortie de la procédure.
If IsEmpty(.UsedRange) Then Exit Sub
'Trouver la dernière ligne où il y a des données
'dans les colonnes A:M (à adapter)
DerLig = .Range("A:M").Find(What:="*", _
LookIn:=xlValues, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
'Comme les données débutent en ligne 2, derlig ne peut pas être plus
petit que 2
If DerLig < 2 Then DerLig = 2
'Affectation de la plage de cellules à une variable objet Range
Set Rg = .Range("A2:M" & DerLig)
End With
With Me.ListeBoite
' Nombre des colonnes du tableau ou plage de données
.ColumnCount = Rg.Columns.Count
'largeur des colonnes dans le listbox
.ColumnWidths = "40;40;372;55;30;45;45;45;45;45;45;45"
'Remplir le listbox avec les données du tableau
.List = Rg.Value
'S'assure qu'aucune ligne de listbox n'est sélectionnée.
.ListIndex = -1
End With

Me.Compteur.Value = Range("COMMERCIALISATION!AC1").Value
End Sub
- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Avatar
Alex
Bonjour,

Le lien sur cijoint.fr :
http://www.cijoint.fr/cjlink.php?file=cj201105/cijJQLVA3v.xls

Merci à Michel pour sa réponse, je vais déjà tester cela.
Bien cordialement.
Alex
Avatar
Alex
Re Bonjour,

Je viens de tester la proposition de Michel, mais cela ne fonctionne
pas.
Si j'ajoute "application.CountA(.ra
Avatar
Alex
Re bonjour, à tous,

Je viens de tester la proposition de Michel, mais cela ne fonctionne
pas.
Si j'ajoute "application.CountA(.Range...)" dans mon If, cela ne se
traduit-il pas par Si ma ligne de ma listbox pour la zone E13 à G15 =
0 ? , alors que moi j'effectue un controle sur une feuille différente
je veux juste m'assurer qu'il n'y a rien dans la cellule, afin d'y
mettre une info.
Par ailleurs, j'ai remplacer mes "" par 0, mais cela ne fonctionne pas
mieux avec ou sans le . devant Range
Voyez vous à quoi cela est du ?
Merci par avance de vos réponses
Bien cordialement.
Alex
Avatar
Alex
Re re Bonjour,

En fait le problème était lié à ma plage E13:G15 dans ma condition,
E13:G15 ne correspondait pas à 6 cellules a controler mais qu'une seul
et meme cellule dont les cellules était fusionnée pour une question de
présentation.
Donc le 0 fonction bien, mais pas le . du range
Cordialement.
Alex
Avatar
MichD
Tu prends le temps de prendre une grande respiration
et tu relis ma réponse, elle doit répondre à ta question.

A ) la suggestion était à l'effet si tu avais une plage de cellules VIDES
ET des cellules NON fusionnées
B ) j'ai pris la peine d'indiquer que les cellules devaient être vide pour la suggestion ait un sens
est-ce que le cas, je n'en sais rien, je n'ai pas ouvert ton fichier
C ) Tu as un petit exemple, il ne te reste plus qu'à modifier le nom de la feuille pour celle de ton application.

D ) Si tu publies un fichier, assure-toi de donner des indications où se retrouve ton code.
Tu enlèves la protection s'il y en a une et tu inhibes l'ouverture sur un formulaire...
Les répondeurs sont des bénévoles et il faut leur faciliter la tâche !!!!!!!!!!!!


MichD
--------------------------------------------
"Alex" a écrit dans le message de groupe de discussion :


Re re Bonjour,

En fait le problème était lié à ma plage E13:G15 dans ma condition,
E13:G15 ne correspondait pas à 6 cellules a controler mais qu'une seul
et meme cellule dont les cellules était fusionnée pour une question de
présentation.
Donc le 0 fonction bien, mais pas le . du range
Cordialement.
Alex
Avatar
Alex
Bonjour Michel,

Excuse moi si je t'ai offensé dans la rédaction de mes différents
messages, cela n'était pas attentionnel. Et je tiens personnellement à
remercier l'ensemble des bénévoles, dont tu fais parti, qui répondent
sur le groupe ; car ils m'ont permis à bien des reprises de résoudre
mes problèmes de VBA.
Il est vrai que pour moi, lors de la rédaction de mon message, je
n'avais pas pensé que ne s'agissant pas d'une plage de cellule mais
une plage liée à une fusion de cellule, et que cela puisse avoir cet
effet.
Sache malgré tout, que je relis souvent les réponses apportées et que
je les tritures afin d'essayer de trouver par moi-même la solution. Je
tacherai de faire plus attention à la rédaction de mes futures
demandes d'aide sur le groupe, et espère que tu ne m'en tiendras pas
rigueur.
Encore un grand merci pour ton aide.
Bien cordialement.
Alex
Avatar
Alex
Re Bonjour à Tous,

Je reviens de nouveau vers vous, car je rencontre un nouveau problème,
et n'arrive pas à le résoudre. Je voulais ajouter un controle des
lignes sélectionnés sur ma listbox, mais quelque soit la ligne
sélectionnée, c'est toujours la première ligne de ma base qui est
sélectionnée, et ne comprends pas pourquoi il ne vérifie pas la 10 ème
colonne de la ligne sélectionnée mais toujours la 10ème colonne de la
première ligne. Voici ce que j'ai écrit :

Private Sub ListeBoite_Change()
With ListeBoite
If .Rg.Item(A + 1, 1).Offset(, 9).Value <> 0 Then
MsgBox Rg.Item(A + 1, 1).Offset(, 9).Value
'MsgBox "Cette boite Archive, a déjà été mise en carton, et ne peut
être resélectionnée. Merci de désélectionner cette ligne.",
vbExclamation, "Instruction"
End If
End With
End Sub

Merci par avance de votre aide.
Cordialement.
Alex
Avatar
MichD
Bonjour,

Ta macro devrait ressembler à ceci :
.Rg.Item(.listindex + 1, 1).Offset(, 9).Value
Ceci signifie, la valeur de la neuvième colonne à droite
sans compter la première colonne...
'------------------------------------
Private Sub ListeBoite_Change()
With ListeBoite
If .Rg.Item(.listindex + 1, 1).Offset(, 9).Value <> 0 Then
MsgBox Rg.Item(.Listindex + 1, 1).Offset(, 9).Value
'MsgBox "Cette boite Archive, a déjà été mise en carton, et ne peut " & _
"être resélectionnée. Merci de désélectionner cette ligne.", _
vbExclamation, "Instruction"
End If
End With
End Sub
'------------------------------------

MichD
--------------------------------------------
"Alex" a écrit dans le message de groupe de discussion :


Re Bonjour à Tous,

Je reviens de nouveau vers vous, car je rencontre un nouveau problème,
et n'arrive pas à le résoudre. Je voulais ajouter un controle des
lignes sélectionnés sur ma listbox, mais quelque soit la ligne
sélectionnée, c'est toujours la première ligne de ma base qui est
sélectionnée, et ne comprends pas pourquoi il ne vérifie pas la 10ème
colonne de la ligne sélectionnée mais toujours la 10ème colonne de la
première ligne. Voici ce que j'ai écrit :

Private Sub ListeBoite_Change()
With ListeBoite
If .Rg.Item(A + 1, 1).Offset(, 9).Value <> 0 Then
MsgBox Rg.Item(A + 1, 1).Offset(, 9).Value
'MsgBox "Cette boite Archive, a déjà été mise en carton, et ne peut
être resélectionnée. Merci de désélectionner cette ligne.",
vbExclamation, "Instruction"
End If
End With
End Sub

Merci par avance de votre aide.
Cordialement.
Alex
1 2