Comportement étrange de Sendkeys (Office 365 - Windows 11)

Bonjour,

Je voudrais exposer un problème que je rencontre depuis "peu". Je n'ai pas la date exacte car c'est apparu "comme ça" il y a plusieurs semaines sans noter quand.

Je ne sais pas si c'est lié a une MAJ d'Office 365 et / ou EDGE et / ou Windows 11 mais le doute est la (PC d'entreprise, tout est bloqué de toute façon)

Voila, j'utilise des Sendkeys de manière à coller des données sur une web app d'entreprise qui ne peut être lancé que sur EDGE (et bien sur, interdit d'installer quoi que ce soit sur les postes). Ma macro est des plus basique (j'ai laissé des choses que j'ai testé - mais pas tout ) et j'ai testé différentes choses sans grand succès.

Mon problème c'est que j'ai aléatoirement (sic) des caractères qui passent de majuscule à minuscule (et pire, des "2" qui se transforme en "é" par ex / mais pas toutes les lettres) sans changer quoi que ce soit : un simple SendKeys "111111111", true va me renvoyer 111111111 ou 1111&1111 ou 1&11111&1 purement aléatoirementdans mes champs (j'ai testé sur le bloc note, idem)

Voici mon code (tout le code avant "SUB MAMCRO()" n'est pas de moi, ça fait parti des choses que j'ai testé... et que je laisse au cas ou si ça peut être utile)

Option Explicit

''''********************************************************************************''''
'   Procédure utilisée pour simuler l'appuie des touches CapsLock, Numlock et ScrollLock
''''********************************************************************************''''

Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As _
    Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare PtrSafe Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) _
    As Long
Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As _
    Integer
Private Declare PtrSafe Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" _
    (ByVal wCode As Long, ByVal wMapType As Long) As Long

Public Const VK_NUMLOCK = &H90
Public Const VK_SCROLL = &H91
Public Const VK_CAPITAL = &H14
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2

Public Sub SetKeyState(ByVal Key As Long, ByVal State As Boolean)

  keybd_event Key, MapVirtualKey(Key, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0
  keybd_event Key, MapVirtualKey(Key, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
  If Key = 20 And State = False Then
      keybd_event 16, 0, 0, 0
    keybd_event 16, 0, 2, 0
  End If

End Sub

Public Property Get CapsLock() As Boolean
  CapsLock = GetKeyState(VK_CAPITAL) = 1
End Property

Public Property Let CapsLock(ByVal Value As Boolean)
  SetKeyState VK_CAPITAL, Value
End Property

Public Property Get NumLock() As Boolean
  NumLock = GetKeyState(VK_NUMLOCK) = 1
End Property

Public Property Let NumLock(ByVal Value As Boolean)
  SetKeyState VK_NUMLOCK, Value
End Property

Public Property Get ScrollLock() As Boolean
  ScrollLock = GetKeyState(VK_SCROLL) = 1
End Property

Public Property Let ScrollLock(ByVal Value As Boolean)
  SetKeyState VK_SCROLL, Value
End Property

Sub MAMACRO()
Dim txtosr, txtnomclient, txtcommune, txtADRESSE, txtDATECONVENU, txtDATERDV, txtcommentaire As String
Dim Wsh As Object
'SetCapital (False)                         'ne change rien au pb
'SetNumLock (False)                         'ne change rien au pb

    txtosr = Sheets("BDD").Range("Z1").Value
    txtnomclient = "VPS"
    txtcommune = Sheets("BDD").Range("Z3").Value
    txtADRESSE = Sheets("BDD").Range("Z2").Value
    txtDATECONVENU = Sheets("BDD").Range("Z6").Value
    txtDATERDV = Sheets("BDD").Range("z5").Value
    txtcommentaire = "VPS programmé" & " - dates saisir en manuel (Date du RDV a renseignée : " & txtDATERDV & ")"

    AppActivate "EDGE"
    Application.Wait (Now + TimeValue("0:00:01"))
'Set Wsh = CreateObject("WScript.Shell")    'ne change rien au pb
'Wsh.SendKeys "%{DOWN}", True               'ne change rien au pb

'CreateObject("WScript.Shell").SendKeys "{NUMLOCK}"     'j'ai tenté ça aussi
'CreateObject("WScript.Shell").SendKeys "{CAPSLOCK}"    'j'ai tenté ça aussi

'If CapsLock = False Then CapsLock = True               'j'ai tenté ça aussi
'If NumLock = False Then NumLock = True                 'j'ai tenté ça aussi
'If ScrollLock = False Then ScrollLock = True

With CreateObject("WScript.Shell")
    '.SendKeys "{CAPSLOCK}"
    '.SendKeys "{NUMLOCK}"
    .SendKeys txtosr, True
    .SendKeys "{TAB}{TAB}", True
    .SendKeys txtnomclient, True
    .SendKeys "{TAB}{TAB}", True
    .SendKeys txtcommune, True
    .SendKeys "{TAB}", True
    .SendKeys txtADRESSE, True
    .SendKeys "{TAB}{TAB}{TAB}{TAB}", True
    '''.SendKeys "{TAB}"
    '''txtDATECONVENU
    .SendKeys "{TAB}{TAB}{TAB}{TAB}", True
    '''.SendKeys "{TAB}"
    '''txtDATERDV
    .SendKeys "{TAB}{TAB}{TAB}{TAB}{TAB}", True
    .SendKeys txtcommentaire, True
    .SendKeys "1111111111111111111111111111111111111111111111" 'avec du texte idem
End With

'Set Wsh = Nothing 'j'ai tenté ça aussi

End Sub

Je ne vous demande pas nécessairement de perdre votre temps a trouver une solution mais si quelqu'un a eu le même problème, d'une je me sentirais moins seul et de deux, si jamais vous avez solutionné ça, ce serait top.

Pour vous expliquer brièvement l'utilité de ma macro, je récupère des données (texte / nombre) pour remplir des champs (d'où les TAB) dans EDGE et je n'ai jamais eu ce problème (le problème du caps lock / numlock j'avais déjà rencontré mais ce n'était pas vraiment gênant mais que des chiffres soit remplacé par les caractère spéciaux du clavier c'est bloquant).

Merci de m'avoir lu et merci de votre intérêt

ps : je m'absente à partir de 17h jusqu'à la fin de semaine donc je ne pourrais repassé que lundi (pc du travail...) donc franchement rien d'urgent !

Bonjour,

Utiliser les SendKey c'est… déconseillé (vétuste, peu fiable, potentiellement dangereux…) il y a des outils de pilotage de navigateur pour VBA maintenant.

Si @JurassikPork passe par là il pourra peut-être vous aider.

Bonne journée

Merci de votre retour, j'avais vu avec l'utilisation de "Selenium" et j'avais abandonné vu que je ne peux rien installer : je vais lire et tenter de comprendre et outil !

C'est une nouvelle piste

Je savais que les SendKeys "c'est le mal" et faute d'avoir trouver une alternative (simple) je m'en étais accommodé (le pb du Numlock and co, j'arrivais a le contourner) mais avec ce problème de changement de chiffre en caractères spéciaux (vu que c'est de l'émulation de touche j'ai vite compris le rapport entre "2" et "é").

Merci !

--------

Si vous avez déjà utilisé cet outil : faut-il l'installer sur tout les postes ou ça s'inclut dans un fichier xslm/xltm ? Oui en copiant dans le fichier Excel (désolé j'avais peur de faire une bétise)

Pour le moment j'arrive même pas a faire fonctionner l'exemple (il ferme mon Edge, ce qui semble normal puis le ré-ouvre mais sur une page blanche - eput être une "protection" géré par l'admin system des PC de l'entreprise..?).

Y'a un petit bout de code que j'ai "isolé" et qui m'intéresse beaucoup (mais reste a faire fonctioner pour remplir un champ):

objBrowser.getElementByXPath("//input[@aria-controls='sbsg50']").value = "xxx"

En regardant la page de gmaps, le "//input[@aria-controls='sbsg50']" correspondrait à l'entrée "choisissez un point de départ ou..." du site de gmaps (en mode itinéraire, j'ai regardé dans le code de la page). Le "mais" c'est que je n'arrive pas à écrire du texte (les "xxx" au dessus), ça me renvoi une erreur (j'ai retirer TOUT le reste après "dim result" pour n'avoir que cette ligne et tenter d'écrire dans ce contrôle mais erreur systématiquement. Après j'y comprend pas grand chose donc c'est vraiment de l'amateurisme !

Si quelqu'un qui a déjà utilisé cet outil peut du coup me dire comment je peux écrire dans ce champs google (je part du principe que ma page est ouverte dans l'onglet actif), je pourrais ensuite adapter la bonne syntaxe avec mes champs sur la web app, je suppose

Pour être honnête je ne l'ai jamais utilisé, je n'ai pas encore eu besoin pour le moment. J'ai notifié JP, s'il a le temps je suis sûr qu'il pourra vous aider.

Essayez de voir s'il y a de la documentation dans le code des fonctions des modules que vous avez importé.

Bon courage & bon weekend !

Hello,

Mon exemple avec GoogleMaps de ma contribution apparemment ne fonctionne plus il faut faire cette modification :

  '  objBrowser.getElementByXPath("//button/img[@data-tooltip='Voiture']").click
     objBrowser.getElementByXPath("//button[@data-tooltip='Voiture']").click

Leb95, si l'exemple ne fonctionne pas sur ton ordinateur, c'est peut-être effectivement qu'il y a des restrictions dans ton entreprise. Dans ce cas ne pas insister.

Et puis pour tes essais qui ne fonctionnent pas, il faudrait mettre le code complet (en remplaçant les données confidentielles par des données fictives.

Ami calmant, J.P

Merci de votre retour, je vais tester ça (désolé, grand week-end donc j'ai pas allumé le PC de l'entreprise ).

Je vais tester ça cette semaine !

Au passage, nous avons reçu des MAJ d'office 365 ce matin et... plus de problème rencontré sur plusieurs machine à jour (surement un MAJ du coup).

Clairement je vais tenter un moyen plus propre que le SendKey et je vais essayer votre piste, merci !

------------------------------------------------------------------

Il doit y avoir des restrictions, il n'y a pas d'interaction, merci de m'avoir aidé ! Peut être qu'un jour Microsoft rendra EDGE nativement pilotable avec OFFICE comme ca fonctionnait bien avant avec IE (ça j'y arrivais a peu près)

Rechercher des sujets similaires à "comportement etrange sendkeys office 365 windows"