stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011
-
3 avril 2009 à 12:55
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 2010
-
7 avril 2009 à 18:17
Bonjour,
J'effectue un satge sous Excel et j'ai un petit soucis : j'aimerai que lorsque l'utilisateur double clic dans une cellule, un formulaire s'ouvre. Ensuite, il sélectionne une valeur dans une liste déroulante puis clic sur un bouton OK. Une fenetre s'ouvre lui demandant de confirmer son choix. S'il confirme, j'aimerai que la valeur sélectionnée dans la liste soit copiée/collée dans la cellule où l'utilisateur a double cliqué.
Voici le code VB que j'ai créé :
Private Sub BoutonOK_Click()
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbNo Then
End
Else: Dim motif As String
motif = ListBox1.Value
motif.Select
motif.Copy
Range("G5").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Unload UserForm1
End If
End Sub
Private Sub UserForm_Initialize()
'remplissage de la zone de liste
With ListBox1
.AddItem "ALM"
.AddItem "ASA"
.AddItem "ASAI"
.AddItem "ATA"
.AddItem "ATM"
.AddItem "CA"
.AddItem "CFS"
.AddItem "CGM"
.AddItem "FORM"
.AddItem "GREV"
.AddItem "JAS"
.AddItem "MAT"
.AddItem "QS"
End With
'sélectionner le premier élément de la liste
ListBox1.ListIndex = 0
End Sub
Le problème se trouve dans la partie Else de
Private Sub BoutonOK_Click(). Comment faire pour que la valeur sélectionnée dans la liste soit copiée/collée dans la cellule où l'utilisateur à double cliqué ?
Genildf
Messages postés270Date d'inscriptionlundi 12 janvier 2009StatutMembreDernière intervention30 décembre 20151 3 avril 2009 à 13:58
Plusieurs solution pour cela
si ta pas vraiment envi de t'embêter tu le met sans l'activecell parce que de toite façon la cellule active c celle ou tu as double clické
Ou alors tu retrouve le range de ta cellule et tu l'écrit dans une cellule ou tu voit rien et que tu n'utilise pas ensuite tu la relie avec ton formulaire
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 3 avril 2009 à 18:12
salut,
une variable n'est pas une cellule, donc on ne la sélectionne pas ni la copie pas.
Il faut juste affecter celle-ci à une cellule
Private Sub BoutonOK_Click()
Dim motif As String
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbNo Then
End
Else
motif = ListBox1.Value
Range("G5").Value = motif
Unload UserForm1
End If
End Sub
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 3 avril 2009 à 23:23
Merci pour vos réponses, donc si je comprends bien, dans le else, je dois écrire que la valeur de la cellule où l'utilisateur a double cliqué correspond à la valeur de la ListBox1 sélectionnée. J'ai donc complété le code pour obtenir ceci :
Private Sub Worksheet_BeforeDoubleClick(ByVal cible As Range, cancel As Boolean)
UserForm1.Show
cancel = True
End Sub
Private Sub BoutonOK_Click()
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbNo Then
End
Else: cible = ListBox1.Value
End If
Load UserForm1
End Sub
Mais en cliquant sur "oui", la valeur ne s'affiche pas
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 4 avril 2009 à 00:53
bonsoir
ayant mieux compris la finalité de ton projet, je te propose cette solution
***************************************
' ici c'est un module visible dans tout le projet, pour la déclaration de la variable qui sera l'adresse de la cellule qui a été double cliquée
Public cible As String
**************************************
'ici c'est le module "UserForm1"
Private Sub BoutonOK_Click()
Dim motif As String
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbNo Then
Unload UserForm1
Else
motif = ListBox1.Value
Unload UserForm1
Sheets(1).Range(cible).Value = motif
End If
'envoies touche "Enter" et touche "Up", sinon la cellule du double click n'est pas validée
SendKeys "{ENTER}"
SendKeys "{UP}"
End Sub
Private Sub UserForm_Initialize()
'remplissage de la zone de liste
With ListBox1
.AddItem "ALM"
.AddItem "ASA"
.AddItem "ASAI"
.AddItem "ATA"
.AddItem "ATM"
.AddItem "CA"
.AddItem "CFS"
.AddItem "CGM"
.AddItem "FORM"
.AddItem "GREV"
.AddItem "JAS"
.AddItem "MAT"
.AddItem "QS"
End With
'sélectionner le premier élément de la liste
ListBox1.ListIndex = 0
End Sub
**************************************
' ici c'est le module de codes de la feuille active
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
cible = Target.Address
UserForm1.Show
End Sub
voila une solution dans un cas que je n'avais jamais traité
CNTJC
Vous n’avez pas trouvé la réponse que vous recherchez ?
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 4 avril 2009 à 13:54
Bonjour, merci de ton aide cependant il y a certains points que je ne comprends pas :
quand tu dis que "Public cible As String" est le code pour un module visible dans tout le projet, je ne comprends pas comment faire pour qu'un module soit visible dans tout le projet.
de plus, je ne comprends pas non plus cette partie de code :
'envoies touche "Enter" et touche "Up", sinon la cellule du double click n'est pas validée
SendKeys "{ENTER}"
SendKeys "{UP}"
Désolé de poser toutes ces questions :s mais c'est la première fois que je programme sous Excel
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 4 avril 2009 à 15:04
Bonjour stid59
Une variable est visible dans tout le projet, que si elle est déclarée comme Public (c.a.d. : vue dans tous les autres objets, comme "UserForm", "Feuille(s)" du classeur, ou autres "Modules"(ajoutés à partir du menu "Insertion" de Visual Basic Editor)), c'est donc dans un module de ce dernier type que sera déclarée la variable "CIBLE" étant l'adresse de TARGET(cellule qui a été sélectionnée par double-click ).
Pour les "SENDKEYS", il s'agit d'une instruction dite d'intéraction de VBA,
Envoie une ou plusieurs touches à la fenêtre active comme s'il s'agissait d'une
saisie directe au clavier.
Tu peux avoir l'aide, qu'elle soit en ligne ou localement sur ton PC, en sélectionnant un mot clé et en appuyant sur la touche de fonction F1.
Voila, j'espère m'être expliqué clairement, et te souhaites bonne continuation.
PS :
faire ==> ActiveSheet.Range(cible).Value = motif
au lieu de ==> Sheets(1).Range(cible).Value = motif
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 4 avril 2009 à 20:03
Re,
J'ai modifier le code comme tu m'as conseillé mais ça ne fonctionne toujours pas, aucune valeur ne s'affiche dans la cellule où j'ai double cliqué. Voici le code complet :
Public cible As String
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)
Dim motif As String
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbNo Then
End
Else
motif = ListBox1.Value
Unload UserForm1
ActiveSheet.Range(cible).Value = motif
End If
SendKeys "{ENTER}"
SendKeys "{UP}"
End Sub
Private Sub UserForm_Initialize()
'remplissage de la zone de liste
With ListBox1
.AddItem "ALM"
.Interior.ColorIndex = 3
.AddItem "ASA"
.AddItem "ASAI"
.AddItem "ATA"
.AddItem "ATM"
.AddItem "CA"
.AddItem "CFS"
.AddItem "CGM"
.AddItem "FORM"
.AddItem "GREV"
.AddItem "JAS"
.AddItem "MAT"
.AddItem "QS"
End With
'sélectionner le premier élément de la liste
ListBox1.ListIndex = 0
End Sub
Est ce que quand tu as réussis à avoir un résultat si tu as essayé ?
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 5 avril 2009 à 00:46
Salut
Oui çà marche à tous les coup chez moi que ce soit avec Excel 2000 ou Excel 2007.
Je ne comprends pas que tu n'aies pas de résultat.
Est-ce que tu déclenches au moins l'affichage de l'UserForm ?
Si oui tu devrais suivre en pas à pas en posant un point d'arret dans la procédure "Worksheet_BeforeDoubleClick", pour voir si tu récupère bien la valeur de la variable "cible", puis tu continues jusqu'à la la procédure "BoutonOK_Click" et voir chaque instructon si tout est correct ou pas.
J'attends la suite.
Tchao
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 5 avril 2009 à 12:44
Salut,
Quand tu me demandes si je déclanche l'affichage de l'UserForm c'est si quand je double clic est ce que l'UserForm s'ouvre ? Si c'est le cas, oui quand je double clic dans une cellule, l'UserForm s'ouvre.
J'ai donc repris le même code, en mettant msgbox(cible) dans la procédure "Worksheet_BeforeDoubleClick" il me retourne bien les coordonnées de la cellule dans laquelle j'ai double cliquée.
Cependant en mettant msgbox(motif) dans la procédure BoutonOK, il ne m'affiche rien donc je pense que l'erreur vient de cette procédure.
Pourrais-tu mettre le code de ta procédure BoutonOK pour que je puisse voir si ça fonctionne stp ?
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 5 avril 2009 à 13:10
quand tu dis "en mettant msgbox(motif) dans la procédure BoutonOK", s'agit t-il du même msgbox du ==> If MsgBox("Voulez-vous...... , ou bien d'un autre?
le code de la procédure BoutonOK est la même que j'ai déja postée
chez moi çà marche bien
CNTJC
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 5 avril 2009 à 14:43
re, je crois savoir ce qui cloche chez toi, cela tient à ce que dans la ligne
=> motif = ListBox1.Value, l'affectation n'est pas encore faite, et intervient de suite après, le déchargement de l'UserForm qui évidement contient la ListBox.
Une solution serai de masquer UserForm ==> " .Hide " ce qui évitera de le recharger à chaque DoubleClick.
Ci-dessous une autre version qui fonctionne
Private Sub BoutonOK_Click()
Dim motif As String
' le test change ==> vbYes
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbYes Then
motif = ListBox1.Value
ActiveSheet.Range(cible).Value = motif
End If
SendKeys "{ENTER}"
SendKeys "{UP}"
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 5 avril 2009 à 21:58
Ma prof m'a proposé ce code :
Private Sub BoutonOK_Click()
Dim motif As String
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbYes Then ActiveSheet.Range(cible).Value motif ListBox1.Value
Unload UserForm1
End If
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 5 avril 2009 à 23:56
La proposition de ta prof affiche "FAUX" dans la cellule "double-cliquée", ce qui est normal, il s'agit plutôt d'un test (peut-être n'est ce pas le bon terme) ou comparaison?
Private Sub BoutonOK_Click()
' Dim motif As String
' <== plus nécessaire ici
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbYes Then
ActiveSheet.Range(cible).Value = ListBox1.Value
UserForm1.Hide
' <== essaies cela
End If
SendKeys "{ESC}"
End Sub
Tu finiras bien par trouver ce qui cloche, ce doit être quelque chose dont tu as pas parlé alors garde espoir, la persévérance te mènera au but.
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 6 avril 2009 à 07:27
Je vais essayer ça au boulot, je te dirait quoi ce soir parce que la ou je suis il n'y a pas Internet ... En tout cas merci beaucoup de m'aider c'est sympa
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 6 avril 2009 à 12:38
Re,
J'ai essayé toute la matinée a modifié le code pour tenter d'obtenir quelque chose mais rien a faire ça ne fonctionne toujours pas. Quand exécute le code tu obtiens une valeur dans la cellule ?
Est ce que tu pourrais mettre le code si cela fonctionne pour que je puisse vérifier par rapport à mon code ?
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 6 avril 2009 à 18:46
Voila le code qui fonctionne parfaitement avec Excel 2000 et Excel 2007
' ici c'est un module simple dont le code peut être vu
' dans tout le projet s'il est déclaré comme "PUBLIC
Public cible As String
' ------------------------------------------
' ici c'est le module de codes de la feuille active:
' Feuille de "Microsoft Excel Objects"
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
cible = Target.Address
UserForm1.Show
End Sub
' ------------------------------------------
'ici c'est le module de codes de "UserForm1"
Private Sub BoutonOK_Click()
If MsgBox("Voulez-vous appliquer le motif " & ListBox1.Value & "?", vbYesNo) = vbYes Then
ActiveSheet.Range(cible).Value = ListBox1.Value
' ********* où çà, au choix *********
' ActiveSheet.Range(cible).Value = ListBox1.List(ListBox1.ListIndex)
End If
SendKeys "{ESC}"
UserForm1.Hide
End Sub
' ------------------------------------------
plus évidement==> Private Sub UserForm_Initialize()
stid59
Messages postés22Date d'inscriptionjeudi 2 avril 2009StatutMembreDernière intervention25 août 2011 6 avril 2009 à 20:48
Juste une question peut être bête ... mais que je me pose ... tout le code doit être dans la même page ? ou bien il y a un code à mettre dans le worksheet, un dans un module, etc. ?
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 7 avril 2009 à 00:02
Salut
Bien évidement, dans mon dernier poste j'écris où se situe chaque portion de codes et j'ai bien délimité par des lignes de traits tout ces différentes instructions.
Donc dans ce projet il y a 3 modules de codage, un de la feuille du double-clique donc la WorkSheet, puis la Forme Utilisateur ou UserForm qui contient la ListBox et le CommandButton nommé "BoutonOK" et enfin le module simple ajouté depuis le menu "Insertion" et sélection de la ligne de menu "Module".
Est-ce que tu as toi aussi la même configuration???
As-tu essayé ton projet sur un autre ordinateur au boulot???
J'attends tes réponses.
Bye