Fonction BeforeDoubleClick

stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 août 2011 - 3 avril 2009 à 12:55
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 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é ?

23 réponses

Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
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
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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

CNTJC
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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)

cible = Target.Address
UserForm1.Show
cancel = True

End Sub
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
        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é ?
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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 ?
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 août 2011
5 avril 2009 à 13:48
non non je mets un autre msgbox juste avant le End If
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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}"
   
    Unload UserForm1 ' ==> ou UserForm1.Hide
End Sub

CNTJC
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 août 2011
5 avril 2009 à 21:46
J'ai fait un copié/collé de ce que tu m'as mis et ça ne fonctionne toujours pas ... j'en ai marre
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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

End Sub

mais pareil aucune valeurn'apparait ...
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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.
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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 ?
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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()

je ne vois plus rien à ajouter
allé salut
0
stid59 Messages postés 22 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 25 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. ?
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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

CNTJC
0
Rejoignez-nous