Microsoft 365 Attente entre 2 sendkeys

Laurent78

XLDnaute Occasionnel
Bonjour à Tous,
Quelqu'un ici saura-t-il m'expliquer le fonctionnement bizarre que j'obtiens avec le code ci-dessous.

VB:
Sub aaa()
'    Application.Wait (Now + TimeValue("0:00:02"))
    Call CTRL_P
'    DoEvents
'    Application.Wait (Now + TimeValue("0:00:05"))
    For i = 1 To 100000000
    Next i
    Call ESC
End Sub

Sub CTRL_P()
Dim Wsh As Object
    Set Wsh = CreateObject("WScript.Shell")
    Wsh.SendKeys "^p", True
    Set Wsh = Nothing
End Sub

Sub ESC()
Dim Wsh As Object
    Set Wsh = CreateObject("WScript.Shell")
    Wsh.SendKeys "{ESC}", True
    Set Wsh = Nothing
End Sub

Lorsque j'appelle la macro aaa depuis une feuille Excel (ALT + F8), je n'obtiens pas l'effet souhaité : je voudrais ouvrir la fenêtre d'Impression, attendre un peu, puis la fermer en envoyer la touche ESC. L'attente se fait directement au début et non pas entre les deux SendKeys.
Par ailleurs, si je fais un DoEvents juste après le "Call CTRL_P", alors, j'ai la très vieille fenêtre d'impression qui s'affiche.
J'ai essayé avec le SendKey de l'application, même résultat. Idem sur différentes versions d'Excel et 32 ou 64 bits.
Bref, c'est très bizarre.

Si quelqu'un a une idée ...
Merci

PS : je suis tombé sur ce problème en essayant de cocher "Accès approuvé au modèle d'objet du projet VBA" dans les options d'Excel.

Bonne semaine,
Laurent
 

Laurent78

XLDnaute Occasionnel
Je ne vois pas le rapport entre la case "Accès approuvé au modèle d'objet du projet VBA" et l'impression.

De toute façon avant de cocher cette case il faudrait savoir si elle est bien décochée...
Je cherche à aller cocher la fameuse case "Accès approuvé au modèle d'objet du projet VBA". Je peux savoir si elle est cochée ou pas en interrogeant le base de registre. Si elle ne l'est pas, après de longues recherche, la seule solution semblerait de simuler les séquences de touches pour aller jusqu'à la fenêtre, cocher la case puis refermer les fenêtre d'options. Comme, cela ne fonctionnait pas correctement, j'avais des fonctionnements plutôt aléeatoires, ça fonctionnait, puis ça ne fonctionnait plus, bref, du coup, j'ai réduit le problème. Enfin, autre précision, comme le raccourcis pour ouvrir le menu fichier ne fonctionne pas via un SenKeys, je contournais en passant par l'affichage de l'apperçu Excel 2013 et suivant pour ensuite envoyer les séquences de touches pour activer l'option.
VB:
Option Explicit

Sub test()
'    Application.SendKeys "%(F,10)", True 'ne fonctionne pas
    Application.SendKeys "^p", True
    Application.SendKeys "%v", True
    Application.SendKeys "{END}", True
    Application.SendKeys "%a", True
    Application.SendKeys "{END}", True
    Application.SendKeys "{UP}", True
    Application.SendKeys "{UP}", True
    Application.SendKeys "{UP}", True
    Application.SendKeys "{UP}", True
    Application.SendKeys "{UP}", True
'    Application.SendKeys "%v", True
'    Application.SendKeys "~", True
'    Application.SendKeys "{TAB}", True
'    Application.SendKeys "~", True
End Sub



Sub test2()
'    Appication.SendKeys "%(F,10)", True  'ne fonctionne pas
    Application.SendKeys "^p", True
    Application.SendKeys "%v", True
    Application.SendKeys "c", True
    Application.SendKeys "c", True
    Application.SendKeys "%a", True
    Application.SendKeys "%e", True
    Application.SendKeys "%p", True
    Application.SendKeys "%p", True
'    Application.Wait (Now + TimeValue("0:00:01"))
'    Application.SendKeys "%v", True
'    Application.SendKeys "~", True
'    Application.SendKeys "{TAB}", True
'    Application.SendKeys "~", True
    
'    DoEvents
End Sub

Sub RegReadVBA()
Dim Val As Long
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
Val = wsh.RegRead("HKCU\Software\Microsoft\Office\16.0\Excel\Security\AccessVBOM")
' MsgBox Val
If Val = 0 Then Call test
End Sub


Sub atest()
 Call RegReadVBA
End Sub
 

Laurent78

XLDnaute Occasionnel
re
mille excuse tu a raison @job75
alors aux grands maux les grand remèdes
en addressof
affiche ta fenetre et la ferme apres 3 secondes
VB:
Option Explicit
#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare PtrSafe Function KillTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
#Else
    Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
Dim TimerID&
Sub prévisual()
    TimerID = SetTimer(0, 0, 3000, AddressOf fermeApercu)
    CreateObject("WScript.Shell").SendKeys "^p"
End Sub

Sub fermeApercu()
    On Error Resume Next    'gestion d'erreur supprimée
    If TimerID <> 0 Then KillTimer 0, TimerID: TimerID = 0:
    Err.Clear
    CreateObject("WScript.Shell").SendKeys "{ESC}"
End Sub
;)
Merci pour l'idée, mais je crains que cela soit très lourd pour envoyer une séquence de touches, cf mon autre message. Merci.
 

Laurent78

XLDnaute Occasionnel
très lourd??????
j'ai vu ton message (c'est une caméra caché???) 🤪 😁 😂
quelque chose me dis que tu devrais encore attendre d'en apprendre un peu plus avant de jouer les gros bras avec les vbcomponents
je dis ça amicalement
là, je ne t'ai pas compris. Le soucis, c'est que j'ai l'impression que les SendKeys ne sont pas toujours traités. Voila tout. Je ne vois pas en quoi je joue les gros bras (?). Je viens ici, gentiment demander un coup de main. Bref ...
Et le code que j'ai copié, ce sont des bouts de code, tout décortiqués, pas propres en effet, pour essayer de faire fonctionne mon truc. D'ailleurs, si j'envoie en un seul SendKeys la séquence complète, ça ne fonctionne pas du tout.
Concernant ce paramètre de sécurité, bien que je partage ton avis, je n'ai pas vraiment d'autre solution, puisque l'objectif final est de modifier du VBA dans un autre projet protégé par mot de passe. C'est bien pour cette raison de "sécurité", que j'aurai souhaité modifier l'option si besoin, et la remettre dans son état ensuite. D'ailleurs, cette option peut très bien être modifiée par un .reg, une GPO ... mais je n'ai pas la main sur tout. De toute manière cette option est plutôt limite en terme de sécurité puisque n'importe quel utilisateur peut la modifier lui-même.
 
Dernière édition:

Laurent78

XLDnaute Occasionnel
relis bien mon message 22 tu comprendra
aucun utilisateur moyennement averti acceptera d'utiliser ton fichier
Si il ne l'utilise pas, il n'utilisera plus également ses outils de reporting (l'infra ayant changé, les serveurs et user SQL ne sont plus les mêmes). Et pour info, cela est fait en accord avec le RSI.
Encore une fois, je partage en partie ton point de vue. Mais la sécurité à parfois des limites que nous sommes obligés de franchir. Imagine un bâtiment avec une porte de sortie, fermée à clef. Si on casse la serrure, la porte peut laisser entrer n'importe qui, mais si on ne la casse pas, personne ne peut sortir. Et bien, je peux t'assurer que dans certains cas, la serrure sera cassée ... Bref, nous nous éloignons de mon problème de départ. ;)
 

Laurent78

XLDnaute Occasionnel
non ca n'a rien a voir
avec cette case cochée si je te donne un fichier de mon cru je peux détruire tout tes fichier excel, foutre le boxon dans tes fichierS windows et au passage foutre le bordel dans quelque clé de registre windows
conclusion une réinitialisation windows sera nécessaire mais j'aurais détruit tout tes fichiers
LOL 😁
TU VEUX vraiment que je te montre ,tu a 3/4 heureS de libre pour réinstallation et paramétrage de ton system + LOGICIEL TIERS +mise a jour window majeure (pour W10 très longues)???
tu dois aimer quand ça fait mal toi ???
RE LOL 😁
il y a bien plus simple pour foutre le boxon, sans cocher cette case ....
 

Laurent78

XLDnaute Occasionnel
c'est pas une question de haine c'est une question de bon sens
c'est pour toi que je te le dis
c'est quoi le mieux pour toi ,un pc ou fichier plombé ou une utilisation limité
A méditer ;)
bonne soirée
Le problème, c'est que tu ne sais pas de quoi il s'agit précisément, et que je ne peux pas e dire plus ici. Et que il ne s'agit pas d'une potentiel utilisation limité, mais de pas d'utilisation du tout. Je vais te donner un autre exemple : puisque tu parle de sécurité, je suppose que tu sais qu'un user quotidien ne doit pas être admin de son PC. Comment fais tu lorsque un gros éditeur de logiciel de gestion (genre SAGE, CEGID, EBP, etc ) t'oblige à être admin pour faire fonctionner son logiciel. Soit tu dis, non l'utilisateur ne doit être admin et du coup, il ne peut pas faire les payes, soit, tu cèdes ... et c'est une histoire vécue. Donc, cesse de me prendre de haut. Je pensais trouver ici des gens plus modérés. Il n'en reste pas moins, je te le redis encore une fois, que je partage ces problèmes de sécurité, sans jouer les gros bras, pour reprendre ta première expression, irrespectueuse.
Bonne soirée également.
 

job75

XLDnaute Barbatruc
Bonjour Laurent78, le forum,

Si le but est de cocher ou décocher l'option "Accès approuvé..." testez cette macro :
VB:
Sub Option_Projet_VBA()
On Error Resume Next
With ThisWorkbook.VBProject: End With
If MsgBox("Voulez-vous " & IIf(Err, "cocher", "décocher") & " cette option ?", 4, "Accès approuvé au modèle d'objet du projet VBA") = 6 _
    Then CreateObject("WScript.Shell").SendKeys "^o{DOWN 12}{ENTER}{DOWN 11}%a%v{ENTER}%{F4}"
End Sub
Pour l'instant elle fonctionne bien chez moi sur Excel 2019.

A+
 

job75

XLDnaute Barbatruc
Le raccourci %a (Alt+A) ne conduit pas toujours à l'option "Paramètres..." alors testez :
VB:
Sub Option_Projet_VBA()
On Error Resume Next
With ThisWorkbook.VBProject: End With
If MsgBox("Voulez-vous " & IIf(Err, "cocher", "décocher") & " cette option ?", 4, "Accès approuvé au modèle d'objet du projet VBA") = 6 _
    Then CreateObject("WScript.Shell").SendKeys "^o{DOWN 12}{ENTER}{DOWN 11}{TAB 2}{ENTER}%v{ENTER}%{F4}"
End Sub
ou si le pavé numérique existe bien :
Code:
Sub Option_Projet_VBA2()
On Error Resume Next
With ThisWorkbook.VBProject: End With
If MsgBox("Voulez-vous " & IIf(Err, "cocher", "décocher") & " cette option ?", 4, "Accès approuvé au modèle d'objet du projet VBA") = 6 _
    Then CreateObject("WScript.Shell").SendKeys "^o{DOWN 12}~{DOWN 11}{TAB 2}~%v~%{F4}"
End Sub
 

Laurent78

XLDnaute Occasionnel
Bonjour Laurent78, le forum,

Si le but est de cocher ou décocher l'option "Accès approuvé..." testez cette macro :
VB:
Sub Option_Projet_VBA()
On Error Resume Next
With ThisWorkbook.VBProject: End With
If MsgBox("Voulez-vous " & IIf(Err, "cocher", "décocher") & " cette option ?", 4, "Accès approuvé au modèle d'objet du projet VBA") = 6 _
    Then CreateObject("WScript.Shell").SendKeys "^o{DOWN 12}{ENTER}{DOWN 11}%a%v{ENTER}%{F4}"
End Sub
Pour l'instant elle fonctionne bien chez moi sur Excel 2019.

A+
Bonjour Job75,
Tout d'abord merci pour le coup de main.
C'est ce que j'avais fait au début (de mettre la chaine complète dans l'appel de SendKeys), mais comme j'avais des résultats aléatoires, j'avais décomposé.

Première toute petite question : je n'ai pas trouvé comment ouvrir le "menu" fichier, ALT + f fonctionne en live, mais pas en SendKeys, j'étais donc passé par le CTRL + P et vous, par le CTRL + O, ce qui revient au même. Une idée pour le ALT + F ?
VB:
CreateObject("WScript.Shell").SendKeys "%f"

J'ai modifié le code pour qu'il fonctionne sur mon Excel 2013. Il fonctionne si je ne fait que ça. Par contre, le truc qui m'embête, c'est que le code que je peux mettre après le SendKeys est executé sans attendre que le SendKeys soit terminé (par exemple un MsgBox pour indiquer que la coche est mise/enlevée), même en ajoutant le paramètre True au SendKeys. ....
En même temps que j'écris ici, je viens de faire un test en ajoutant un DoEvents après le SendKeys. ça a l'air de fonctionner.
Je continue mes tests, sur mes PC avec différentes version d'Excel, et dans un environnement TSE ....

Merci encore
Laurent
 

Statistiques des forums

Discussions
311 709
Messages
2 081 779
Membres
101 816
dernier inscrit
Jfrcs