Résolu Simuler un double clic

jhlamoustache

XLDnaute Occasionnel
Bonjour,

Je crée un classeur (A) avec des procédures pour automatiser la saisie sur d'autres classeurs (B).
Dans les classeurs B, le seul mode de saisie dans certaines cellules est le double-clic, (qui renvoie "Now" si la cellule est initialement vide; et "" si la cellule contient une date). Bien entendu, ces procédures des classeurs B sont assorties de multiples contrôles et actions. Et le code des classeurs B est protégé.
Je peux donc pas y accéder, encore moins le modifier.


Lorsque, avec les macros du classeur A, je change de cellule sur le classeur B,
Private Sub Worksheet_SelectionChange(ByVal Target As Range) du classeur B s'exécute
Lorsque je change la valeur de cette cellule,
Private Sub Worksheet_Change(ByVal Target As Range) du classeur B s'exécute.
Mais cela donne des résultats non conformes.
Il faudrait que Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) de classeur B s'exécute.

J'ai tenté de mettre Application.doubleclick, mais rien ne se passe.

De ce que j'ai lu sur les forums, les demandes portant le même titre n'étaient pas similaires à ce que je demande. (Elles ne consistaient pas vraiment à simuler un doubleclic sur une feuille qui exécute du code).
Ou je n'ai pas tout compris.



J'ai préparé deux classeurs. Afficher le B et faire des doubles clics dans la colonne D. En D2 ou D3, les dates s'affichent ou se suppriment. Puis lancer les procédures Ajout_Date ou Supp_Date. On voit que les conditions d'ajout de dates ne sont pas respectées car l'ajout de dates se produit en D4 à
D10. C'est pourquoi j'ai besoin de simuler ce doubleclick.

Pouvez-vous m'aider ?
 

Pièces jointes

  • Fichier A.xlsm
    14.9 KB · Affichages: 39
  • Fichier B.xlsm
    17.6 KB · Affichages: 40

jhlamoustache

XLDnaute Occasionnel
Re,

Oui, comme je l'ai dit ci-dessus, j'ai essayé voir ci-dessous, mais rien ne se passe.
Si on met un point d'arrêt sur le classeur B, la procédure

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

n'est pas appelée.
Est-ce à cause des arguments "Target" et "Cancel" qui ne sont pas passés par la macro du classeur A ?
Je ne comprends pas comment l'utiliser

Sub Ajout_date2()
For I = 2 To 10
ActiveSheet.Cells(I, [Vali].Column).Select
Application.DoubleClick
Next I
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je n'ai pu que constater, par un petit essai que Application.DoubleClick est sans effet chez moi.
Et désolé, je ne vois pas de solution pour déclencher depuis une macro d'un projet VBA l'exécution d'une éventuelle Private Sub Worksheet_BeforeDoubleClick inconnue dans un autre projet VBA.
 

VIARD

XLDnaute Impliqué

jhlamoustache

XLDnaute Occasionnel
Bonjour,

Comme je l'ai dit dans le #1 et le #3, ; et comme l'a dit Dranreb dans le #7 ci dessus, rien ne se passe.

J'ai également tenté Application.Run("Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean"). Là aussi échec.

Perplexe
 

VIARD

XLDnaute Impliqué
Bonjour,

Comme je l'ai dit dans le #1 et le #3, ; et comme l'a dit Dranreb dans le #7 ci dessus, rien ne se passe.

J'ai également tenté Application.Run("Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean"). Là aussi échec.

Perplexe

Bonjour jhlamoustache et tous

Voilà ce que j'utilise pour le doubleClick, peut-être cela pourra aider dans le module joint.
Pour le reste l'échange entre classeur je ne sais pas.

A+ Jean-Paul
 

Pièces jointes

  • Essai_DoubleClick.xlsm
    17 KB · Affichages: 58

PMO2

XLDnaute Accro
Bonjour,

Une piste qui utilise Application.Run
Il faut d'abord ouvrir le classeur A (qui contient le programme) puis le classeur B qui est à traiter.

Code dans un module standard du classeur A
VB:
Sub aa()
Dim WB As Workbook
Dim S As Worksheet
Dim R As Range
Dim Chemin$
Dim i&
'--- On vérifie qu'il y a 2 classeurs et que celui contenant le programme est ouvert en premier ---
If Workbooks.Count <> 2 Then
  MsgBox "Il faut 2 classeurs ouverts"
  Exit Sub
End If
If Workbooks(1).Name <> ThisWorkbook.Name Then
  MsgBox "Le classeur contenant le programme doit être ouvert en premier"
  Exit Sub
End If
'--- Active le classeur B ---
Set WB = Workbooks(2)
WB.Activate
Set S = WB.ActiveSheet
'--- Fabrique le chemin pour le Run ---
Chemin$ = "'" & WB.FullName & "'"
Chemin$ = Chemin$ & "!" & S.CodeName
Chemin$ = Chemin$ & ".Worksheet_BeforeDoubleClick"

'### Votre traitement (à parfaire par vos soins) ###
For i& = 2 To S.[a1].CurrentRegion.Rows.Count
  Set R = S.Range("D" & i& & "")
  R.Select
  '--- Appelle la procédure privée double clic avec les paramètres (ByVal Target As Range, Cancel As Boolean) qui vont bien ---
  Application.Run Chemin$, R, False
Next i&
'###################################################
End Sub

J'ai testé avec le code du classeur B non protégé ET protégé, cela fonctionne chez moi dans les 2 cas.
Espérons qu'il en sera de même chez vous.
 

Pièces jointes

  • Fichier A.xlsm
    20.2 KB · Affichages: 40
  • Fichier B.xlsm
    17.5 KB · Affichages: 40

jhlamoustache

XLDnaute Occasionnel
Bonjour à tous,

Merci beaucoup, beaucoup PMO2. You are the new Dumbledore!

A l'attention des administrateurs de ce forum, je pense que ce bout de code mérite d'être thésaurisé.
Tant les recherches sur le web ont été infructueuses.

Pour ma part, les utilisateurs étant réputés déclencher les procédures depuis le classeur actif avec le bouton Macros du ruban d'Excel, on peut s'affranchir des tests préliminaires.
Et l'affectation des variables peut être simplifiée à :
Set WB = ActiveWorkbook
Set S = WB.ActiveSheet
Set R = ActiveCell

Pour un code propre, j'ai ajouté avant End Sub
Set R = Nothing
Set S = Nothing
Set WB = Nothing

De plus, j'ai remarqué avec plaisir, que la procédure s'exécutait correctement sur le lot de cellules choisies à l'aide d'une boucle, quand bien même on utilise la méthode Select à l'intérieur de cette boucle.

Encore merci
 

Discussions similaires

Statistiques des forums

Discussions
312 180
Messages
2 085 993
Membres
103 081
dernier inscrit
jeromeolivier.raymond@wat