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

10 réponses

1 2
Avatar
michdenis
Bonjour Emcy,

Tout est dans le clic...double-clic...-> 2 fois clic ...-> 2 fois même procédure...-> Valeur retenue ...-> Celle du deuxième clic

Essaie ceci :

'---------------------------
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim MaValeur As String, Tblo As Variant, A As Integer

MaValeur = Me.ListBox1.Value
If Me.ListBox1.List(0) = "0" Then
Me.ListBox1.Clear
Me.ListBox1.List = Montableau2
Else
Me.ListBox1.Clear
Me.ListBox1.List = Montableau
End If
Tblo = Me.ListBox1.List
Me.ListBox1.Selected(0) = True
A = Application.Match(MaValeur, Tblo, 0) - 1
Me.ListBox1.Selected(A) = True
Application.Wait (Now + TimeValue("0:00:01"))

End Sub
'---------------------------



Salutations!



"Emcy" a écrit dans le message de news: %
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
Avatar
Michel Gaboly
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 vau t 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 li ste
contenant pleins d'autres elements (dont l'element selectionné fait p arti)
puis je re-selectionne l'element => pourquoi je n'arrive pas à rese lectonner
mon element ? que faire ?

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





--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
Emcy
ç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

Avatar
Emcy
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




Avatar
Michel Gaboly
Pas testé, mais si cela marche, très bien. ;-((

En cas de problème, une autre option consiste à mettre un CommandButt on 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 correct ement
=> 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 mod if de
ListIndex :

Si on exécute ton code en pas à pas, tu obtiens le résultat atten du, et
ensuite
ListIndex est modifié à nouveau comme tu avais fait suivre de Doubl e 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 v aut 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



Avatar
Emcy
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



Avatar
Michel Gaboly
Cela dépend de ta source de donées : n'y a-t-il une plage sur une feu ille 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 T oto
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 CommandBu tton 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 correc tement
=> 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 d e
news:
Re,

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

Si on exécute ton code en pas à pas, tu obtiens le résultat atte ndu, et
ensuite
ListIndex est modifié à nouveau comme tu avais fait suivre de Doub le 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




Avatar
Emcy
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




Avatar
Michel Gaboly
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 T oto
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 CommandBu tton
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 corre ctement
=> 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 m odif de
ListIndex :

Si on exécute ton code en pas à pas, tu obtiens le résultat att endu, et
ensuite
ListIndex est modifié à nouveau comme tu avais fait suivre de Dou ble
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 constater a
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'arri ve 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
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