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
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" <michel.gaboly@wanadoo.fr> a écrit dans le message de news:
uS8nrWZAGHA.3268@TK2MSFTNGP10.phx.gbl...
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" <michel.gaboly@wanadoo.fr> a écrit dans le message de
news: ePtliRZAGHA.1028@TK2MSFTNGP11.phx.gbl...
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" <michel.gaboly@wanadoo.fr> a écrit dans le message d e
news: u$RjY6YAGHA.2704@TK2MSFTNGP15.phx.gbl...
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" <toto@bla.com> a écrit dans le message de news:
uUwFltYAGHA.356@TK2MSFTNGP12.phx.gbl...
ç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" <michel.gaboly@wanadoo.fr> a écrit dans le message de
news: O3LxbbYAGHA.1028@TK2MSFTNGP11.phx.gbl...
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
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
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
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" <michel.gaboly@wanadoo.fr> a écrit dans le message de
news: uS8nrWZAGHA.3268@TK2MSFTNGP10.phx.gbl...
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" <michel.gaboly@wanadoo.fr> a écrit dans le message de
news: ePtliRZAGHA.1028@TK2MSFTNGP11.phx.gbl...
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" <michel.gaboly@wanadoo.fr> a écrit dans le message de
news: u$RjY6YAGHA.2704@TK2MSFTNGP15.phx.gbl...
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" <toto@bla.com> a écrit dans le message de news:
uUwFltYAGHA.356@TK2MSFTNGP12.phx.gbl...
ç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" <michel.gaboly@wanadoo.fr> a écrit dans le message de
news: O3LxbbYAGHA.1028@TK2MSFTNGP11.phx.gbl...
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
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