Probleme avec clic droit

raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018 - 21 août 2018 à 18:58
 Raymond_o - 1 sept. 2018 à 14:57
Bonsoir tout le monde, Bonsoir forum,

Je lance une macro à l'aide d'un BeforeRightClick, elle fonctionne bien, cependant j'aimerai savoir si il était possible d'empêcher le menu contextuel de s'afficher ?

le code ci-dessous empèche bien le menu contextuel de s'afficher mais il se ré affiche immédiatement


Cancel=True ' Désactive le menu
Cancel=False 'Réactive le menu sinon le menu ne s'affiche plus du tout


Merci d'avance

Cordialement

19 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
21 août 2018 à 23:18
Si VBA, pas de menu contextuel avec :
Option Explicit
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim MaPlage
  Set MaPlage = Me.Range("B2:C8")
  If Intersect(Target, MaPlage) Is Nothing Then Exit Sub 'donc avec menu contextuel
  Cancel = True
  Call MaMacro
End Sub
Sub MaMacro()
  MsgBox "Pas de menu contextuel"
End Sub
1
raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018
22 août 2018 à 08:01
Merci pour ton aide, c'est gentil a toi.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
22 août 2018 à 09:30
Bonjour,

Il ne faut jamais nommer 2 procédures d'un même module avec le même nom : tu as 2 fois Worksheet_BeforeRightClick.

La programmation exige beaucoup de rigueur, voici quelques conseils qui t'éviterons bien des déboires :

commences tous les modules par Option Explicit, cela oblige à déclarer toutes les variables
n'utilises jamais .Select, évites les objets actifs : Selection, Activecell, Activesheet, ... ;
• déclares les variables avec le type ad hoc (i.e. pas toutes en Variant)
• limites leur portée au strict nécessaire (i.e. locale, privée, publique ou globale) ;
• évites les références implicites(i.e. partielles), privilégies les références explicites (i.e. suffisament complètes),
--- par exemple, au lieu de
= Cells(1,2)
écrire
= Worksheets(1).Cells(1,2).Value
;
• donc, précises toujours la feuille pour un objet Range (Cells, Rows, ...) et la propriété cible (Value, Text, ...)
• n'hésites pas à utiliser des variables pour représenter les objets, ça facilite l'écriture et la lecture du code,
--- par exemple :
Set MaPlage = Me.Range("B2:C8")
;
• pour les mêmes raisons, n'hésites pas à utiliser aussi
With
et
End With
;
• envisages toutes les valeurs potentielles des variables pour éviter les erreurs ;
• évites d'utiliser des propriétés ou méthodes d'objet héritées qui pourraient ne pas exister,
--- par exemple, au lieu de :
Sheets(1).Range("A1")
écrire
Workheets(1).Range("A1")
,
en effet l'objet Range n'appartient pas à Sheet mais à Worksheet ;
• éviter si possible d'utiliser le Presse-Papier, préfères la copie directe avec une destination ou pour copier les valeurs :
.Value = .Value


Essaies ce code (il accepte la multi-sélection dans la colonne H) :

Option Explicit
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
' Clic DROIT
Dim Lg As Long
Dim r As Range
  Lg = Me.Range("B" & Rows.Count).End(xlUp).Row
  Set r = Intersect(Target, Me.Range("H2:H" & Lg))
  If r Is Nothing Or Target.Columns.Count > 1 Then Exit Sub
  Cancel = True
  r.Value = Me.Range("I1").Value
End Sub
1
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 août 2018 à 17:02
On pourrait aussi utiliser le double-click plutôt que right-click (?)
Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Toujours en utilisant Cancel = True pour sortir du mode Edition de cellule
1
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
25 août 2018 à 17:28
1

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

Posez votre question
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
26 août 2018 à 03:06
Bonjour

1) ok
2) si je passe directement à H la liste ne fonctionne pas, donc je passe en G, lorsque tu passes en H, la liste s'ouvre directement au dessus de la cellule
https://mon-partage.fr/f/K8hkqBrw/
1
Salut Patrice,

J'ai regarder ton code et fais fonctionner le programme, pas de soucis particulier a signaler.

Malgré tes très bons commentaires je n'ai pas tout compris et pour moi c'est difficile de faire des modifications par moi même.

Je souhaiterai svp savoir a quel moment s'insère automatiquement une ligne.

1)- A un numéro de ligne précis Ex 44 ou bien lorsque la dernière ligne disponible est renseignée. ???

J'ai essayer modifier la MFD qui concerne la colonne (F) qui passe en orange, j'ai voulu faire de même pour la colonne (C) mais je ni suis pas parvenu.

Et je voulais svp savoir si les modifications que j'ai écrites (Affichage en colonne (J6-J7-J8)) lors de mon dernier post serait possible ou pas

Je te souhaite un très bon w-end et merci pour ton aide.

Bien cordialement Raymond
1
raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018
Modifié le 22 août 2018 à 07:26
Bonjour Patrice33740,

Merci pour ta réponse, c'est sympa a toi.

Voila déjà un bon nombre de fois que j'essai d'adapter ton code au mien et ça ne fonctionne pas, je dois mal faire sans doute.

Quand tu aura du temps, rien ne presse, si tu peux svp modifier pour moi car là, je patauge dur dur.

Je te souhaite une bonne journée et merci a toi.

Bien cordialement Raymondo


'*** Clic DROIT
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim Lg
If Target.Count > 1 Then Exit Sub

Lg = Range("B" & Rows.Count).End(xlUp).Row - 1
If Not Intersect(Target, Range("H2:H" & Lg)) Is Nothing Then
Target.Value = Range("I1")
End If
End Sub

'''Macro empèche d'afficher le menu contextuel
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim MaPlage
Set MaPlage = Me.Range("B2:C8")

If Intersect(Target, MaPlage) Is Nothing Then Exit Sub 'donc avec menu contextuel
Cancel = True
Call MaMacro
End Sub

Sub MaMacro()
MsgBox "Pas de menu contextuel"
End Sub

0
raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018
Modifié le 22 août 2018 à 10:55
Salut Patrice33740,

Merci beaucoup pour le dépannage du code, en plus ça fonctionne nickel merci merci.

Encore merci pour toutes ces infos que d'ailleurs j'ai imprimer, mis au chaud dans mon classeur.

Q-1) Dans ton code tu mets "Cancel=True" pour ne pas déclencher le menu contextuel, mais je ne vois pas un "Cancel=False" pour rétablir le déclenchement du menu, malgré tout sur un clic DROIT je peux tout de même ouvrir le menu avec toutes ces options. ???

Q-2) Pas trop compris (• déclares les variables avec le type ad hoc (i.e. pas toutes en Variant) . ???

Q-3) Pourrai tu svp si possible me faire une macro avec un bouton (Insérer une ligne):
Je souhaiterai quand je clic sur le bouton insérer une ligne qui tienne compte de ne pas effacer les formules présentent en colonne (E et F) et si possible de garder le format cellule qui est juste le quadrillage de la cellule.

Sinon je me permets encore de te remercier pour ton aide et ton savoir partager.

Cordialement Raymondo
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
23 août 2018 à 01:33
1) A chaque évènement, la valeur par défaut de Cancel est False, donc pas besoin de l'initialiser

2) Le type de variables sont : Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object, String, Variant et défini par l'utilisateur (avec Type)

3) Pour insérer une ligne en copiant les formats et les formules de la ligne au dessus :

Sub InsererUneLigne()
  ActiveCell.EntireRow.Insert Shift:=xlDown
  On Error Resume Next
  ActiveCell.Offset(-1, 0).EntireRow.Copy Cells(ActiveCell.Row, 1)
  ActiveCell.EntireRow.SpecialCells(xlCellTypeConstants, xlNumbers + _
                                                         xlTextValues + _
                                                         xlLogical + _
                                                         xlErrors).ClearContents
  On Error GoTo 0
End Sub
0
raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018
23 août 2018 à 08:35
Salut Patrice33740,

Merci beaucoup pour tes réponses et pour la macro, qui fonctionne nickel, comme souhaiter.

Encore deux petits soucis, quand tu a le temps et si tu veux bien regarder svp.

Je te joint le fichier par l'intermédiaire du lien ci-dessous, ca sera beaucoup plus simple pour toi
j'ai mis les commentaires sur la Feuil1 via une bulle carrée, hum hum. LOL.

https://www.cjoint.com/c/HHxgAen7zjz

Encore merci a toi, passe une bonne journée.

Cordialement Ray
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
Modifié le 23 août 2018 à 14:08
Bonjour,

Pourquoi ne mets-tu pas les Totaux au dessus de ligne de titre, afin qu'ils soient toujours visible malgré le scroll ?

J'ai du mal à comprendre le mode d'emploi de ton fichier, mais une chose est certaine : employer SelectionChange pour mettre la date sur une ligne est une très mauvaise idée !!!
Pourquoi n'utilises tu pas plutôt le clic droit comme pour la colonne H ?

Je pense que tu dois te poser, écrire tout ce que tu voudrais automatiser, analyser les avantages et les inconvénients, réfléchir à la méthode la plus adaptée et reprendre ton développement au début.

Par exemple, pour la colonne H, j'aurais prévu d'écrire / effacer la valeur sur clic droit, comme ça :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
' Sur clic droit en colonne H, insère/supprime la valeur choisie en I1 (avec la liste déroulante).
'
Dim Lg As Long
Dim R As Range
Dim C As Range
  If Target.Columns.Count > 1 Then Exit Sub
  Lg = Me.Range("B" & Rows.Count).End(xlUp).Row
  Set R = Intersect(Target, Me.Range("H2:H" & Lg))
  If Not R Is Nothing Then
    Cancel = True
    For Each C In R.Cells
      If C.Value = "" Then
        'Copier le mot choisi vers la ou les cellules vides sélectionnées.
        R.Value = Me.Range("I1").Value
      Else
        'Effacer la ou les cellules remplies sélectionnées.
        R.Value = ""
      End If
    Next C
  End If
  Set R = Intersect(Target, Me.Range("A2:A" & Lg))
  If Not R Is Nothing Then
    Cancel = True
    ' Ecrire la date
    ' ....
  End If
End Sub
0
raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018
23 août 2018 à 18:46
Re Patrice,

Merci pour tes infos et le code,



j'ai bien compris tes remarques et je suis ok avec toi, mais voila c'est si simple pour moi.

Alors j'ai fait divers essais mais je ni arrive pas comme tu verra sur la photo, du coup, je suis un peu paumer, je nage dans le code ou plutôt devrai je dire je coule dans le code. LOL

Je ne sais pas si on peux arranger ça ???

Merci pour ton aide et tes infos dont j'ai pris bonne note.

Cdlt Ray

lien pour le fichier
https://www.cjoint.com/c/HHxqJ6pCX4z

lien pour la photo
https://www.cjoint.com/c/HHxqLyn6Uoz
0
raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018
25 août 2018 à 18:58
Salut Patrice,

Merci merci et merci, ça fonctionne bien d'après mes essais, de plus j'apprécie les commentaires.
Je vais étudier tout le code comme il faut.

Serai t'il possible svp sans vouloir abuser de ta gentillesse.

1-) Aussitôt après avoir insérer la date par le clic droit, "positionner le curseur en colonne (B)" donc près a renseigner la cellule cela m'évitera une erreur d'écrire dans la colonne (A) de la date et de provoquer une erreur dans le fichier.

2-) Après avoir renseigner la colonne (D) peut t'on "positionner le curseur en colonne (H)" ET déclencher l'ouverture de la liste déroulante et donc qui devient prête pour sélectionner mon mode de payement et copier par clic droit dans une cellule de la colonne (H).

Je penses que cela fait ça sera bon pour le fichier.

Je serai absent dimanche 26 je pars pour Nantes une semaine chez mon frère.

Mais je suivrai dès que possible si j'ai une bonne connexion internet sur mon portable de chez mon frère.

PS: Je ne touche pas au fichier que tu viens de m'envoyer afin d'éviter de faire chacun de son coté, mais je vais approfondir le code.

Tu a super bien bosser, je t'en remercie beaucoup toi et ton savoir partager.

Je souhaite un bon W-end et une bonne soirée, merci Patrice.

Cordialement Raymond
0
raymondo.free.fr Messages postés 39 Date d'inscription dimanche 12 août 2018 Statut Membre Dernière intervention 26 août 2018
26 août 2018 à 07:26
Salut Patrice,

Merci pour les modifications, c'est bon exactement et même encore mieux pour la liste du nickel.

Donc ca fonctionne bien pour un premier essai, pas le temps pour faire plus.

C'est l'heure de partir, je te souhaite un excellent dimanche et surtout un grand merci.

je te tient au courant dès que j'aurai fait plus d'essais.

Bye bye patrice

Bien cordialement Raymond
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
Modifié le 26 août 2018 à 12:15
Re,

J'ai trouvé une solution pour le passage de D à H :
https://mon-partage.fr/f/SbRDh6gG/

0
Salut Patrice,

Bien reçu tes modifications, ca fonctionne bien, je n'avais pas vu pour le clic droit.

je vais regarder ton code avec beaucoup d'attention, dès mon retour, j'ai connexion un peu juste
et ca rame.

Sinon j'ai encore svp une modification qui serait interessante pour l'utilisation du programme.

Peut t'on faire en sorte pour automatiser l'insertion de ligne automatiquement dès que l'on arrive

en fin de bas de page.

Si possible bien, et avec tout mes remerciements.

Une bonne soirée a toi et encore merci.

Bien cordialement Raymond
0
Salut Patrice,

Après quelques essais du programme, je rencontre des soucis quand je veux effacer une ligne ça ne fonctionne pas correctement ni efface une ligne en entier, soit par clic droit ou gauche ou sur double clic.

J'ai regarder le code mais je vois quelques instructions que je connais pas. ???
Pour la liste déroulante c'est nickel juste encore mieux que souhaiter, merci.

J'ai regarder aussi voir comment faire pour insérer automatiquement une ligne ou deux arriver en fin de page, si possible du coup on pourrai supprimer le bouton "insérer une ou deux lignes" présent sur la page écran.

Si tu a le temps de me commenter un peu le code car j'aimerai comprendre comment tu a procéder pour arriver a ce très bon travail.

Merci a toi pour l'aide apporter, bonne soirée a toi.

Cdlt Raymond
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
28 août 2018 à 14:58
Bonjour,

« ça ne fonctionne pas correctement » c'est pas très explicite !
surtout quand tu parles de clic gauche ou double clic !

Pue, peux-tu détailler la façon dont tu effaces une ligne, car chez moi ça fonctionne bien :
- sélection d'une ligne et Suppr ou Clic droit, effacer le contenu
Par contre, ça supprime aussi les formules : il est préférable de supprimer la ligne (clic droit, supprimer) et d'en insérer une nouvelle.

En attendant des éclaircissements sur ce que tu voudrais, je commente et modifie le code pour ajouter une ou deux lignes automatiquement en fin de tableau ...
0
Salut Patrice,

Merci pour ta réponse,

Pour l'effacement, je n'arrive pas par quelque moyen qui soit a effacer d'une ligne complète ou partielle, j'ai essayer de voir le soucis mais je ne trouve pas et effectivement parfois les formules sont effacées.

Merci de regarder pour l'ajout de ligne automatique.

Je refais des essais demain matin.

Bonne soirée a toi et surtout merci bien.

Cdlt Raymond
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
28 août 2018 à 22:34
Re,

Voici la dernière version, avec l'ajout automatique en fin de tableau. Le code est commenté.
https://mon-partage.fr/f/Ieb6flQv/

J'ai laissé le bouton insérer une ligne pour pouvoir insérer un ligne dans le tableau en cas d'oubli ou d'ajout avec les formules. En effet, il faut éviter d’insérer une ou des lignes au milieu du tableau avec clic droit sur le numéro de ligne / insérer ... car ça n'ajoute pas les formules et tant que la ou les lignes sont vides : le résultat des calculs est provisoirement erroné, i.e. tant qu'il existe une rupture dans le tableau.

Chez moi tout fonctionne correctement, notamment les commandes :
- Clic droit sur le numéro de ligne / Effacer le contenu
- Clic droit sur le numéro de ligne / Supprimer
0
Salut Patrice,

Merci pour le retour du fichier commenter et modifier, c'est bien gentil a toi.

J'ai regarder et lu tes commentaires, ça éclaire un peu plus ma lanterne, me reste a comprendre.

Le programme qui fonctionne bien touche a sa fin et j'aurai svp une petite modification si possible bien sur.

Je m'explique:

Début de l'utilisation clic pour afficher la date puis je renseigne les colonnes et le curseur saute en colonne (H) et ouvre la liste déroulante, j'effectue mon choix puis valide par "Enter"

Mais la liste déroulante reste ouverte donc peut t'on faire en sorte qu'une fois valider mon choix, plutôt que de laisser la liste ouverte, la faire se fermer automatiquement.???

Sinon le programme fonctionne bien, j'ai du merdouiller lors des précédents essais mais mon portable rame et je ferais d'autres essais a mon retour chez moi.

Merci beaucoup pour ton aide, reçoit en retour mes salutations.

Bien cordialement Raymond
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
29 août 2018 à 09:18
Bonjour,

« valide par "Enter" [...] Mais la liste déroulante reste ouverte ... » Chez moi ça fonctionne normalement.
A vu de tous tes post, je trouve que, ton Excel se comporte de façon bizarre ! Quelle version utilises-tu ? Sur quel appareil ?

Ceci mis à part, avec Excel, pour saisir des données dans un tableau il est préférable de les valider avec Tab plutôt qu'avec Entrée : il passe à la cellule suivante du tableau (à droite).

Cdlt
Patrice
0
Salut Patrice,

Merci pour les infos,

Sur mon PC chez moi, je suis sous Windows 10 avec Excel 2007 version officiel
idem sur mon vieux portable qui rame sous Windows10.

J'ai mal utiliser sans doute, je vais revoir ça, merçi de m'avoir aiguiller.

Je viens de faire l'essai avec "TAB" ha la ça effectivement ca fonctionne nickel.

je vais approfondir avec ta façon de faire pour me faire la main car il rare que j'utilise la toutche "TAB"

Merci pour les infos, je te souhaite une agréable journée a plus tard.

Bye bye Bien cordialement Raymond
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 21
29 août 2018 à 20:55
J'ai essayé avec W10 et Xl2007 : tout fonctionne chez moi.
0
Salut Patrice,

J'ai essayer le programme pour moi ca fonctionne bien maintenant, je regarde encore un peu en fin d'après midi et je te tient au courant.

J'avais prévu un supplément d'infos, reste a voir si on peu faire ou pas.

1- Afficher en colonne (J6) un compteur/décompteur de lignes insérer.

2- Afficher en colonne (J7) un compteur/décompteur de lignes supprimés.

3- Afficher en colonne (J8) un compteur de lignes réellement utilisés.
Bonne journée a toi et merci pour ton aide.

Bien cordialement Raymond
0
Rejoignez-nous