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

pb ListBox

12 réponses
Avatar
Emcy
bonjour,

j'ai une lisbox avec plein d'elements à l'interieur;
lorque je double clic dessus, je re-rempli ma listBox avec une autre liste
contenant pleins d'autres elements (dont l'element selectionné fait parti)
puis je re-selectionne l'element => pourquoi je n'arrive pas à reselectonner
mon element ? que faire ?

voici mon classeur d'essai :
http://cjoint.com/?mpoGJvRXBy

2 réponses

1 2
Avatar
Michel Gaboly
Match, c'est simplement la fonction de feuille de calcul EQUIV()

En principe, on appelle les fonctions de feuille de calcul avec Applicati on.WorksheetFunction, mais
Application.WorksheetFunction.Match a la réputation d'être buggée. C'est pourquoi on utilise Application.Match, qui
correspond à l'ancienne syntaxe.

Regarde l'aide d'EQUIV() si tu ne connais pas la fonction. Sinon, tu disp oses déjà de tous les éléments ;-))

D'autre part, qu'est-ce qui t'empêche d'utiliser 3 colonnes d'une feuil le quelconque pour stocker le contenu des 3
colonnes du Combo, aimenté ensuite à partir de cette plage ?

Tu pourrais alors repérer avec EQUIV() le nom de fichier dans la colone 3, et en déduire aisément le chemin d'accès
complet (col. 1) ou trnqué (Col.3)


je peux pas trop te copier le code il risque d'etre trop long

en gros j'ai :
- une ComboBox
- un tableau avec une liste de chemin de fichier

mon tableau composte trois colonnes :
- la 0 : chemin complet des fichiers
- la 1 : chemin des fichier coupés pour qu'il rentre dans ma ComboBox
- la 2 : juste le nom du fichier

je veux faire une fonction que j'alimente par le nom du fichier (2) et qui
doit me resortir le chemin du fichier coupé (1) pour pouvoir le mettr e dans
la COmboBox => actuellement j'utlise des boucles for mais je pensais pouvoir
accelerer le processus avec la fonction Match (mais je ne sais pas trop
comment elle fonctionne)

"Michel Gaboly" a écrit dans le message de news:

Oui mais alimentée comment ?

Donne un extrait de code ce sera + simple.


non, c'est une varaible de type tableau => Dim Tableau(10,2) as strin g

"Michel Gaboly" a écrit dans le message de
news:
Cela dépend de ta source de donées : n'y a-t-il une plage sur une f euille
quelconque correspondant à cette 2ème colonne ?



par contre, j'ai pas bien compris l'utilisation de la porcedure match
si j'ai un dim Tableau(10,2) comment fair epour recherché l'element Toto
dans la deuxieme Colonne ?

"Michel Gaboly" a écrit dans le message d e
news: u$
Pas testé, mais si cela marche, très bien. ;-((

En cas de problème, une autre option consiste à mettre un CommandB utton
sur le UserForm pour déclencher la MAJ de la liste.




je crois que j'ai trouvé, qu'en penses tu
Private DoubleClick As Boolean

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As
Integer, ByVal X As Single, ByVal Y As Single)
If DoubleClick Then
With ListBox1
MaValeur = .Value
.List = IIf(.List(0) = "0", Montableau2, Montableau)
.ListIndex = Application.Match(MaValeur, .List, 0) - 1
End With
DoubleClick = False
End If
End Sub


Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
DoubleClick = True
End Sub


"Emcy" a écrit dans le message de news:





ça marche mieux mais de temps en temps ça ne fonctionne pas corr ectement
=> le systeme de mettre un temps de latence ne doit pas être trè s fiable
... tu n'aurais pas une autre solution ?

"Michel Gaboly" a écrit dans le message de
news:
Re,

Parce qu'il y a conflit avec l'événement Click qui provoque une modif de
ListIndex :

Si on exécute ton code en pas à pas, tu obtiens le résultat at tendu, et
ensuite
ListIndex est modifié à nouveau comme tu avais fait suivre de Do uble
cliic d'un clic simple au même endroit.

Voici ton code :

Dim Montableau(100) As String
Dim Montableau2(100) As String

Private Sub UserForm_Initialize()
For i = 0 To 100
Montableau(i) = i
Next i

For i = 0 To 100
Montableau2(i) = 100 - i
Next i

Me.ListBox1.List = Montableau
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MaValeur As String

MaValeur = Me.ListBox1.Value

If Me.ListBox1.List(0) = "0" Then
Me.ListBox1.List = Montableau2
Else
Me.ListBox1.List = Montableau
End If

For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.List(i) = MaValeur Then
Me.ListBox1.ListIndex = i
Exit Sub
End If
Next i

End Sub


Si tu ajoutes :

Private Sub ListBox1_Click()
Debug.Print "C" & ListBox1.ListIndex
End Sub

et

Debug.Print "D" & ListBox1.ListIndex avant ton Esit Sub, tu constate ra
qu'un événement click intervient après le double
clic.

La modif la + simple est d'ajouer un délai :

Au début du code de l'évenement _DblClick, ajoutes :

Application.Wait (Now + TimeValue("0:00:1"))

et cela marchera (plus de conflit).


Par ailleurs on peut faire beaucoup + simple et + efficace (un EQUIV () à
la place de la boucle) :

Private Sub UserForm_Initialize()
For i = 0 To 100
Montableau(i) = i
Montableau2(i) = 100 - i
Next i
ListBox1.List = Montableau
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MaValeur As String
With ListBox1
MaValeur = .Value
.List = IIf(.List(0) = "0", Montableau2, Montableau)
Application.Wait (Now + TimeValue("0:00:1"))
.ListIndex = Application.Match(MaValeur, .List, 0) - 1
End With
End Sub


Dans le Initialize, aucune raison de faire 2 boucles, 1 suffit.


Dernière chose pour appeler le UserForm,

tu écris

Sub main()
Load UserForm1
UserForm1.Show
End Sub


Tu peux supprimer Load UserForm1

Load sert uniquement à charger en mémoire un UserForm que l'on n e vaut
pas rendre initialement visible, et que l'on
affiche ensuite avec Show.

Show suffit dans lle cas contraire : si le UserForm n'est pas déjà en
mémoire, il le charge.






bonjour,

j'ai une lisbox avec plein d'elements à l'interieur;
lorque je double clic dessus, je re-rempli ma listBox avec une autr e
liste contenant pleins d'autres elements (dont l'element selectionn é
fait parti) puis je re-selectionne l'element => pourquoi je n'arr ive
pas à reselectonner mon element ? que faire ?

voici mon classeur d'essai :
http://cjoint.com/?mpoGJvRXBy




--
Cordialement,

Michel Gaboly
www.gaboly.com














--
Cordialement,

Michel Gaboly
www.gaboly.com






Avatar
Emcy
d'accord, je vais voir...

"Michel Gaboly" a écrit dans le message de news:
e$
Match, c'est simplement la fonction de feuille de calcul EQUIV()

En principe, on appelle les fonctions de feuille de calcul avec
Application.WorksheetFunction, mais
Application.WorksheetFunction.Match a la réputation d'être buggée. C'est
pourquoi on utilise Application.Match, qui
correspond à l'ancienne syntaxe.

Regarde l'aide d'EQUIV() si tu ne connais pas la fonction. Sinon, tu
disposes déjà de tous les éléments ;-))

D'autre part, qu'est-ce qui t'empêche d'utiliser 3 colonnes d'une feuille
quelconque pour stocker le contenu des 3
colonnes du Combo, aimenté ensuite à partir de cette plage ?

Tu pourrais alors repérer avec EQUIV() le nom de fichier dans la colone 3,
et en déduire aisément le chemin d'accès
complet (col. 1) ou trnqué (Col.3)


je peux pas trop te copier le code il risque d'etre trop long

en gros j'ai :
- une ComboBox
- un tableau avec une liste de chemin de fichier

mon tableau composte trois colonnes :
- la 0 : chemin complet des fichiers
- la 1 : chemin des fichier coupés pour qu'il rentre dans ma ComboBox
- la 2 : juste le nom du fichier

je veux faire une fonction que j'alimente par le nom du fichier (2) et qui
doit me resortir le chemin du fichier coupé (1) pour pouvoir le mettre
dans la COmboBox => actuellement j'utlise des boucles for mais je pensais
pouvoir accelerer le processus avec la fonction Match (mais je ne sais pas
trop comment elle fonctionne)

"Michel Gaboly" a écrit dans le message de
news:
Oui mais alimentée comment ?

Donne un extrait de code ce sera + simple.


non, c'est une varaible de type tableau => Dim Tableau(10,2) as string

"Michel Gaboly" a écrit dans le message de
news:
Cela dépend de ta source de donées : n'y a-t-il une plage sur une feuille
quelconque correspondant à cette 2ème colonne ?



par contre, j'ai pas bien compris l'utilisation de la porcedure match
si j'ai un dim Tableau(10,2) comment fair epour recherché l'element Toto
dans la deuxieme Colonne ?

"Michel Gaboly" a écrit dans le message de
news: u$
Pas testé, mais si cela marche, très bien. ;-((

En cas de problème, une autre option consiste à mettre un CommandButton
sur le UserForm pour déclencher la MAJ de la liste.




je crois que j'ai trouvé, qu'en penses tu
Private DoubleClick As Boolean

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As
Integer, ByVal X As Single, ByVal Y As Single)
If DoubleClick Then
With ListBox1
MaValeur = .Value
.List = IIf(.List(0) = "0", Montableau2, Montableau)
.ListIndex = Application.Match(MaValeur, .List, 0) - 1
End With
DoubleClick = False
End If
End Sub


Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
DoubleClick = True
End Sub


"Emcy" a écrit dans le message de news:





ça marche mieux mais de temps en temps ça ne fonctionne pas
correctement
=> le systeme de mettre un temps de latence ne doit pas être très
fiable ... tu n'aurais pas une autre solution ?

"Michel Gaboly" a écrit dans le message de
news:
Re,

Parce qu'il y a conflit avec l'événement Click qui provoque une modif
de ListIndex :

Si on exécute ton code en pas à pas, tu obtiens le résultat attendu, et
ensuite
ListIndex est modifié à nouveau comme tu avais fait suivre de Double
cliic d'un clic simple au même endroit.

Voici ton code :

Dim Montableau(100) As String
Dim Montableau2(100) As String

Private Sub UserForm_Initialize()
For i = 0 To 100
Montableau(i) = i
Next i

For i = 0 To 100
Montableau2(i) = 100 - i
Next i

Me.ListBox1.List = Montableau
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MaValeur As String

MaValeur = Me.ListBox1.Value

If Me.ListBox1.List(0) = "0" Then
Me.ListBox1.List = Montableau2
Else
Me.ListBox1.List = Montableau
End If

For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.List(i) = MaValeur Then
Me.ListBox1.ListIndex = i
Exit Sub
End If
Next i

End Sub


Si tu ajoutes :

Private Sub ListBox1_Click()
Debug.Print "C" & ListBox1.ListIndex
End Sub

et

Debug.Print "D" & ListBox1.ListIndex avant ton Esit Sub, tu constatera
qu'un événement click intervient après le double
clic.

La modif la + simple est d'ajouer un délai :

Au début du code de l'évenement _DblClick, ajoutes :

Application.Wait (Now + TimeValue("0:00:1"))

et cela marchera (plus de conflit).


Par ailleurs on peut faire beaucoup + simple et + efficace (un EQUIV()
à la place de la boucle) :

Private Sub UserForm_Initialize()
For i = 0 To 100
Montableau(i) = i
Montableau2(i) = 100 - i
Next i
ListBox1.List = Montableau
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MaValeur As String
With ListBox1
MaValeur = .Value
.List = IIf(.List(0) = "0", Montableau2, Montableau)
Application.Wait (Now + TimeValue("0:00:1"))
.ListIndex = Application.Match(MaValeur, .List, 0) - 1
End With
End Sub


Dans le Initialize, aucune raison de faire 2 boucles, 1 suffit.


Dernière chose pour appeler le UserForm,

tu écris

Sub main()
Load UserForm1
UserForm1.Show
End Sub


Tu peux supprimer Load UserForm1

Load sert uniquement à charger en mémoire un UserForm que l'on ne vaut
pas rendre initialement visible, et que l'on
affiche ensuite avec Show.

Show suffit dans lle cas contraire : si le UserForm n'est pas déjà en
mémoire, il le charge.






bonjour,

j'ai une lisbox avec plein d'elements à l'interieur;
lorque je double clic dessus, je re-rempli ma listBox avec une autre
liste contenant pleins d'autres elements (dont l'element selectionné
fait parti) puis je re-selectionne l'element => pourquoi je n'arrive
pas à reselectonner mon element ? que faire ?

voici mon classeur d'essai :
http://cjoint.com/?mpoGJvRXBy




--
Cordialement,

Michel Gaboly
www.gaboly.com














--
Cordialement,

Michel Gaboly
www.gaboly.com






1 2