OVH Cloud OVH Cloud

emploie de variable dans .SendKeys

6 réponses
Avatar
jeclephi
Bonjour,
j'ai fait un script (VBS)qui me permet d'ouvrir un fichier Excel dans lequel
est d'abord sélectionné un menu et ensuite est sélectionné
un élément de ce menu, le niveau de cet élément pouvant varier à chaque
utilisation.
Pour sélectionner le niveau choisi dans mon menu j'emploie la méthode
.sendkeys"{Down a}" de l'objet Shell où "a" est la valeur numérique
du nombre de décalages que je dois faire vers le bas pour sélectionner le
niveau chosi. L'emploie de la valeur numérique me permet de bien faire
fonctionner le script sans problèmes, cependant dans un souci de
simplification, je voudrais remplacer cette valeur par une variable . Et
c'est là que le sable s'est collé dans l'engrenage.
oShell.SendKey"{DOWN 3}" fonctionne trés
bien et je décale bien de trois niveaux vers le bas.
si j'emploie une variable, "b " par exemple, à laquelle j'ai affecté la
valeur voulue. L'expresssion oShell.SendKeys"{DOWN b}" ne
fonctionne pas et je câle lamentablement.
Merci d'avance à qui me dépannera.

jcp

6 réponses

Avatar
Jean-Claude BELLAMY
Dans le message :,
jeclephi a pris la peine d'écrire ce qui
suit :
Bonjour,
j'ai fait un script (VBS)qui me permet d'ouvrir un fichier Excel dans
lequel est d'abord sélectionné un menu et ensuite est sélectionné
un élément de ce menu, le niveau de cet élément pouvant varier à
chaque utilisation.
Pour sélectionner le niveau choisi dans mon menu j'emploie la
méthode .sendkeys"{Down a}" de l'objet Shell où "a" est la valeur
numérique du nombre de décalages que je dois faire vers le bas pour
sélectionner le niveau chosi. L'emploie de la valeur numérique me
permet de bien faire fonctionner le script sans problèmes, cependant
dans un souci de simplification, je voudrais remplacer cette valeur
par une variable . Et c'est là que le sable s'est collé dans
l'engrenage. oShell.SendKey"{DOWN 3}"
fonctionne
trés bien et je décale bien de trois niveaux vers le bas.
si j'emploie une variable, "b " par exemple, à laquelle j'ai affecté
la valeur voulue. L'expresssion oShell.SendKeys"{DOWN b}" ne
fonctionne pas et je câle lamentablement.
Merci d'avance à qui me dépannera.


Normal que ton truc ne fonctionne pas !
Quand tu écris "{DOWN b}" , à savoir une chaine unique de caractères dans
laquelle il y a la lettre "b" , pourquoi voudrais-tu que ce "b" soit
interprété comme une variable ?

Il FAUT et il SUFFIT d'écrire , tout simplement :

oShell.SendKeys "{DOWN " & b & "}"

Grâce aux propriétés des variables et des chaines en VBS, toute
concaténation de chaine convertit automatiquement et implicitement en chaine
les variables qui n'en sont pas
Ainsi, bien que b soit une valeur numérique (en réalité, en VBS, tout est de
type VARIANT),
dans "{DOWN " & b & "}" le contenu de b (nombre) est converti
automatiquement en chaine

(dans d'autres langages, il faudrait faire appel explicitement à des
fonctions de conversion, p.ex. "inttostr" en Delphi)



--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] -
http://www.bellamyjc.org ou http://jc.bellamy.free.fr

Avatar
~Jean-Marc~ [MVP]
Salutations jeclephi, tu nous disais :
Bonjour,
j'ai fait un script (VBS)qui me permet d'ouvrir un fichier Excel dans
lequel est d'abord sélectionné un menu et ensuite est sélectionné
un élément de ce menu, le niveau de cet élément pouvant varier à
chaque utilisation.
Pour sélectionner le niveau choisi dans mon menu j'emploie la
méthode .sendkeys"{Down a}" de l'objet Shell où "a" est la valeur
numérique du nombre de décalages que je dois faire vers le bas pour
sélectionner le niveau chosi. L'emploie de la valeur numérique me
permet de bien faire fonctionner le script sans problèmes, cependant
dans un souci de simplification, je voudrais remplacer cette valeur
par une variable . Et c'est là que le sable s'est collé dans
l'engrenage. oShell.SendKey"{DOWN 3}" fonctionne
trés bien et je décale bien de trois niveaux vers le bas.
si j'emploie une variable, "b " par exemple, à laquelle j'ai affecté
la valeur voulue. L'expresssion oShell.SendKeys"{DOWN b}" ne
fonctionne pas et je câle lamentablement.
Merci d'avance à qui me dépannera.


Au feeling, je dirais :
oShell.SendKeys"{DOWN " & b & "}"

Mais pourquoi ne pas commander Excel directement au lieu de lui
envoyer des séquences de touches ?

Extrait d'un script de commandes Word (mais c'est pareil pour Excel,
on prends du VBA et on adapte en VBS) :

Dim oWord, oWordActiveDoc
Set oWord = CreateObject("Word.Application") 'créer l'objet Word
Set oWordActiveDoc = oWord.Documents.Open("Exemple.doc")
oWord.Selection.Find.ClearFormatting
With oWord.Selection.Find
.Text = "<200[0-9]>"
.Replacement.Text = ""
.Forward = True
.Wrap = 1
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
SearchOK = oWord.Selection.Find.Execute
'autres traitements...
oWordActiveDoc.Close 0
Set oWordActiveDoc = Nothing
oWord.Quit
Set oWord = Nothing

(vite fait, juste pour monter les possibilités)

@+

--
~Jean-Marc~ MVP Shell/User Fr
M'écrire : http://msmvps.com/blogs/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/blogs/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/

Avatar
jeclephi
Merci à Jean Claude et Jean Marc pour leur réponse rapide et efficace.

Je n'avais pas réalisé que "{DOWN a}" est une chaine (pourtant les
guillements sont bien là)... faudra que je réapprenne à lire
merci pour l'exemple de word
Jeclephi
Avatar
Jean-Claude BELLAMY
Dans le message :,
~Jean-Marc~ [MVP] a pris la peine d'écrire ce
qui suit :
Salutations jeclephi, tu nous disais :
Bonjour,
j'ai fait un script (VBS)qui me permet d'ouvrir un fichier Excel dans
lequel est d'abord sélectionné un menu et ensuite est sélectionné
un élément de ce menu, le niveau de cet élément pouvant varier à
chaque utilisation.
[...]

Mais pourquoi ne pas commander Excel directement au lieu de lui
envoyer des séquences de touches ?
[...]


Et je complèterai cette excellente suggestion de Jean-Marc par quelques
compléments pratiques :

Vu que l'on ne connait pas forcément toute la syntaxe de VBA d'Excel, le
plus simple est d'enregistrer les commandes voulues dans une macro, puis
ouvrir cette Macro par Visual Basic Editor (à lancer depuis Excel).
Ensuite effectuer un copier-coller du VBA dans le script VBS, en adaptant un
quart de poil les différneces de syntaxe.


J'utilise cela en permanence dans tout mes scripts VBS qui font appel à
Excel :
http://www.bellamyjc.org/fr/vbsdownload.html#accountlist
http://www.bellamyjc.org/fr/vbsdownload.html#listserv
http://www.bellamyjc.org/fr/vbsdownload.html#processus
http://www.bellamyjc.org/fr/vbsdownload.html#showadm

(tu peux t'en inspirer)

Un exemple très basique :

Depuis le VBS, tu veux exécuter la séquence suivante dans Excel :
- sélectionner toutes les cellules
- choisir la police Verdana en 10 points

Sous Excel, tu choisis Macro/Nouvelle macro (p.ex. nommée "Macro1")
L'enregistrement démarre...
Tu cliques sur la 1ère case en haut à gauche pour tout sélectionner
Tu sélectionnes la police Verdana
Tu sélectionnes la taille 10
Tu appuies sur le bouton d'arrêt d'enregistrement

Puis tu choisis Macro/Macros/"Macros1"
Bouton "Modifier"
VBE s'ouvre et on lit ceci :

___________________________________
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 09/01/2006 par Jean-Claude BELLAMY
'

'
Cells.Select
With Selection.Font
.Name = "Verdana"
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
With Selection.Font
.Name = "Verdana"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
End Sub
___________________________________

On va copier juste ce qui est utile (il a des redondances, et des paramètres
dont on a rien à faire)

Cells.Select
With Selection.Font
.Name = "Verdana"
.Size = 10
End With

Collé tel quel dans le VBS , cela générerait des erreurs.

Le VBS contient ceci, pour appeler Excel et créer une nouvelle feuille :

Set oXL = WScript.CreateObject("EXCEL.application")
oXL.Visible = True
oXL.Workbooks.Add

et ici on colle, en l'adaptant, la macro précédemment créée :
oXL.Cells.Select
With oXL.Selection.Font
.Name = "Verdana"
.Size = 10
End With

En règle générale, l'adaptation VBA->VBS consiste, dans 99% des cas,
SEULEMENT à faire précéder de "oXL." tous les objets nommés dans le VBA,
"oXL" étant ici le nom (totalement arbitraire) attribué à l'instance de
l'objet Excel dans le script VBS.

NB: C'est beaucoup plus long à expliquer qu'à réaliser ! ;-)

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] -
http://www.bellamyjc.org ou http://jc.bellamy.free.fr


Avatar
jeclephi
Bonsoir,
J'ai pleinement apprécié les conseils et ils ne sont pas tombés dans les
yeux d'un aveugle.
Cependant je ne vois pas comment remplacer mon petit script par cette
méthode.
J'ai essayé d'enregistrer automatiquement une macro avec vba d'excel, les
opérations d'ouverture de menu n'ont pas été enregistrées.
Je joins le résultats de mes cogitations.
Trois fichiers sont concernés, représentant chacun une ligne du menu
"comptabilité", chaque fichier a un mot de passe

Dim oArg
oArg = InputBox ("Donner le code à saisir pour ouvrir fichier", "CODE
FICHIER")
TraiteArg oArg

Sub TraiteArg(c)
If c= "" then
wscript.Echo "Pas d'argument"
Wscript.Quit(0)
End if
If c = "r" then
OuvertureExcel 0, "xxxxx" '1° paramêtre : niveau à
atteindre dans le menu
ElseIf c = "m" Then
OuvertureExcel 1, "yyyyy" '2° paramêtre : mot de passe
du fichier concerné
ElseIf c = "j" Then
OuvertureExcel 2, "zzzzz"
Else
Wscript.Echo "Les arguments fournis sont érronés"
Wscript.Quit(0)
End If

End Sub

Sub OuvertureExcel(a, b)
Dim oShell
'les tempo peuvent éviter des chevauchements possible
Set oShell = CreateObject("Wscript.Shell")
oShell.Run "Excel.exe" 'ouverture excel
Wscript.Sleep 200
oShell.AppActivate "Microsoft Excel"
'Wscript.Sleep 100
With oShell
.SendKeys "%m" 'activation du menu comptabilité
.SendKeys"{DOWN "&a&"}"
.SendKeys "{ENTER}" 'ouverture fichier concerné
.SendKeys b 'écriture du mot de passe dans la boite de dialogue
.Sendkeys "{Enter}" 'pour ouvrir fichier
end With
End Sub

Merci

Jcp


"Jean-Claude BELLAMY" a écrit dans le
message de news: %
Dans le message :,
~Jean-Marc~ [MVP] a pris la peine d'écrire
ce qui suit :
Salutations jeclephi, tu nous disais :
Bonjour,
...........
Mais pourquoi ne pas commander Excel directement au lieu de lui

envoyer des séquences de touches ?
[...]


Et je complèterai cette excellente suggestion de Jean-Marc par quelques
compléments pratiques :

Vu que l'on ne connait pas forcément toute la syntaxe de VBA d'Excel, le
plus simple est d'enregistrer les commandes voulues dans une macro, puis
ouvrir cette Macro par Visual Basic Editor (à lancer depuis Excel).
Ensuite effectuer un copier-coller du VBA dans le script VBS, en adaptant
un quart de poil les différneces de syntaxe.


J'utilise cela en permanence dans tout mes scripts VBS qui font appel à
Excel :
http://www.bellamyjc.org/fr/vbsdownload.html#accountlist
http://www.bellamyjc.org/fr/vbsdownload.html#listserv
http://www.bellamyjc.org/fr/vbsdownload.html#processus
http://www.bellamyjc.org/fr/vbsdownload.html#showadm

(tu peux t'en inspirer)

Un exemple très basique :

Depuis le VBS, tu veux exécuter la séquence suivante dans Excel :
- sélectionner toutes les cellules
- choisir la police Verdana en 10 points
[...] May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] -
http://www.bellamyjc.org ou http://jc.bellamy.free.fr






Avatar
Jean-Claude BELLAMY
Dans le message :,
jeclephi a pris la peine d'écrire ce qui
suit :
Bonsoir,
J'ai pleinement apprécié les conseils et ils ne sont pas tombés dans
les yeux d'un aveugle.
Cependant je ne vois pas comment remplacer mon petit script par cette
méthode.
J'ai essayé d'enregistrer automatiquement une macro avec vba d'excel,
les opérations d'ouverture de menu n'ont pas été enregistrées.


???
Je viens de le refaire à l'instant , c'est immédiat et sans bavure !

Outils/Macros/Nouvelle macro/"macro1"
Puis action sur le menu "Fichier/Ouvrir/ .."
...
Arrêt enregistrement
On a alors tout le code nécessaire !


Je joins le résultats de mes cogitations.
[...]
Set oShell = CreateObject("Wscript.Shell")
oShell.Run "Excel.exe" 'ouverture excel
Wscript.Sleep 200
oShell.AppActivate "Microsoft Excel"
'Wscript.Sleep 100
With oShell
.SendKeys "%m" 'activation du menu comptabilité
.SendKeys"{DOWN "&a&"}"
.SendKeys "{ENTER}" 'ouverture fichier concerné
.SendKeys b 'écriture du mot de passe dans la boite de dialogue
.Sendkeys "{Enter}" 'pour ouvrir fichier
end With
End Sub
[...]



Ouh la la !!!
Quel esprit compliqué !!!!!!!
Tu as du être SHADOK dans une vie antérieure ! ;-)

Tu n'a rien écouté de ce que Jean-Marc et moi-même t'avons dit !
Pourquoi ne veux tu pas passer directement par un objet Excel.Application ?
C'est pourtant fait pour cela !

Set oXL = WScript.CreateObject("EXCEL.application")
oXL.Visible = True
oXL.screenupdating=true
oXL.Workbooks.Open Nom-de-fichier-Excel-a-ouvrir,,,Mot-de-passe
....

Pour plus de détails sur la méthode "Open" , cf. l'aide en ligne de VBE
concernat OPEn (associée à l'objet Workbooks)




--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] -
http://www.bellamyjc.org ou http://jc.bellamy.free.fr