Executer macro excel via VBS

Résolu
cs_zoubli Messages postés 8 Date d'inscription vendredi 3 novembre 2006 Statut Membre Dernière intervention 8 octobre 2007 - 15 déc. 2006 à 19:28
chatelain70 Messages postés 2 Date d'inscription mardi 29 mars 2005 Statut Membre Dernière intervention 19 janvier 2007 - 19 janv. 2007 à 12:32
Bonsoir,
Je programme un peu mais pas du tout en VB et dérivés. Je souhaite exécuter via un script VBS une macro qui se trouve dans un module d'un classeur Excel. Cette macro "main_fichier_DSI" prends 3 paramètres.
J'ai réussi a trouver ce code mais j'ai une erreur WSH a l'exécution : "ligne 9, caract 9, erreur fin d'instruction attendue".
J'aimerai avoir l'avis de connaisseur car je patine grave :-(
Et merci a celles & ceux  qui me fileront un tuyau.

Voici mon code :

main


Function main()
 appel_macro_NP()
End Function




Function appel_macro_NP()
 Dim Xl As Excel.Application
 Dim Wb As Excel.Workbook
 Dim NomMacro As String
 Dim FeuilleMEF As String
 Dim Arg1 As Integer
 Dim Arg2 As Integer


 Set Xl = CreateObject("Excel.application")
 Xl.Visible = True
 Set Wb = Xl.Workbooks.Open("Modèle de travail.xls")
 
 FeuilleMEF = "MEF Requètes DSI"
 Arg1 = 5
 Arg2 = 5
 Xl.run WB.Name &"!Module3.main_fichier_DSI" , &"FeuilleMEF", &Arg1, &Arg2
End Function

8 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
15 déc. 2006 à 20:07
 Bonsoir,

J'ai bien compris, l'erreur doit être bénine, mais à quoi correspond la ligne 9  ?
Je n'ai pas vb6, donc je ne puis testé.

Par contre, j'ai plus qu'un gros doute sur la synthaxe.

Xl.run WB.Name &"!Module3.main_fichier_DSI" , &"FeuilleMEF", &Arg1, &Arg2

jean-marc
3
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
15 déc. 2006 à 19:52
 Bonsoir,

Une autre solution, si vous voulez utiliser du vbs, c'est que celui-ci construise votre macro,
comme dans l'exemple ci-dessous:

Set sh = WScript.CreateObject("WScript.Shell")
on error resume next
sh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\accessVBOM",1,"REG_DWORD"
on error goto 0



Set exl = WScript.CreateObject("excel.Application")
exl.Visible = false
set fichxl=exl.workbooks.add



Set mdle = fichxl.VBProject.VBComponents.Add(1)



num=0
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function GetDC Lib ""user32"" (ByVal hwnd As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function TextOut Lib ""gdi32"" Alias ""TextOutA"" ( _ "
num=num+1:mdle.CodeModule.InsertLines num, "     ByVal hdc As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal x As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal y As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal lpString As String, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal nCount As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function SetTextColor Lib ""gdi32"" ( _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal hdc As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal crColor As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function SetBkMode Lib ""gdi32"" ( _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal hdc As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal nBkMode As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function SetRect Lib ""user32"" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function DrawText Lib ""user32"" Alias ""DrawTextA"" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Private Type RECT"
num=num+1:mdle.CodeModule.InsertLines num, "    Left As Long"
num=num+1:mdle.CodeModule.InsertLines num, "    Top As Long"
num=num+1:mdle.CodeModule.InsertLines num, "    Right As Long"
num=num+1:mdle.CodeModule.InsertLines num, "    Bottom As Long"
num=num+1:mdle.CodeModule.InsertLines num, "End Type"



num=num+1:mdle.CodeModule.InsertLines num, "Sub ecriture_en_rouge_sur_fond_transparent()"
num=num+1:mdle.CodeModule.InsertLines num, "Dim rct As RECT"
num=num+1:mdle.CodeModule.InsertLines num, "fen = GetDC(0)"
num=num+1:mdle.CodeModule.InsertLines num, "SetRect rct, 250, 250, 500, 500"
num=num+1:mdle.CodeModule.InsertLines num, "Call SetBkMode(fen, 1) "
num=num+1:mdle.CodeModule.InsertLines num, "Call SetTextColor(fen, vbRed)"
num=num+1:mdle.CodeModule.InsertLines num, "txt = ""Avec les fonctions API, on peut écrire n'importe où sur l'écran. On peut utiliser les API en VBScript en les lançant sous VBA Excel"""
num=num+1:mdle.CodeModule.InsertLines num, "Call DrawText(fen, txt, Len(txt), rct, &H10)"
num=num+1:mdle.CodeModule.InsertLines num, "End Sub"



exl.Run "ecriture_en_rouge_sur_fond_transparent"
fichxl.close(false)
exl.quit



Set fichxl=nothing
set mdle=nothing
set exl=nothing
set sh=Nothing



jean-marc
0
cs_zoubli Messages postés 8 Date d'inscription vendredi 3 novembre 2006 Statut Membre Dernière intervention 8 octobre 2007
15 déc. 2006 à 20:01
Merci mais je ne peux envisager cette solution. Le code de la macro a été écrit par une autre personne, elle comprends 3 modules et ça fait pas mal de ligne de code.


Pour moi le + simple est de pourvoir lancer de l'extérieur cette macro.
0
cs_zoubli Messages postés 8 Date d'inscription vendredi 3 novembre 2006 Statut Membre Dernière intervention 8 octobre 2007
18 déc. 2006 à 16:44
Bonjour,


merci pour ta remarque JMO. En effet ce n'est pas la bonne syntaxe.


J'ai réussi a ouvrir le classeur Excel mais j'ai maintenant une erreur WSH a la ligne du run qui me dit "Impossible de trouver la macro :
'Modèle de travail.xls!Module3.main_fichier_DSI'

Pourtant le classeur s'appelle bien 'Modèle de travail.xls' et la macro 'main_fichier_DSI' est bien dans le module3.

J'ai progressé mais je ne suis pas au bout.
Merci de votre coup de main.

Voici le code modifié :

main


Function main()
 appel_macro_NP()
End Function




Function appel_macro_NP()
 Dim Xl
 Dim Wb
 Dim NomMacro
 Dim FeuilleMEF
 Dim Arg1
 Dim Arg2


 Set Xl = CreateObject("Excel.application")
 Xl.Visible = True
 Set Wb = Xl.Workbooks.Open("[file://\\SRV_BOOOSTER\Dev\Commun\Clotures\RH_Paie\Modèle \\SRV_BOOOSTER\Dev\Commun\Clotures\RH_Paie\Modèle] de travail.xls")
 Worksheet = "MEF Requètes DSI"
 Arg1 = 5
 Arg2 = 5
 Xl.run WB.Name & "!Module3.main_fichier_DSI", Worksheet, Arg1, Arg2
 Set Wb = Nothing
 Set Xl = Nothing


End Function
0

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

Posez votre question
cs_zoubli Messages postés 8 Date d'inscription vendredi 3 novembre 2006 Statut Membre Dernière intervention 8 octobre 2007
19 déc. 2006 à 16:11
Bonjour,
je n'ai toujours pas trouvé la bonne réponse, je patine.
Si quelque'un peut me mettre sur la piste je suis preneur.

Pourquoi don,c la ligne du Run lance bien le document Excel mais bute sur le lancement de cette satané macro (qui elle marche parfaitement).

Merci pour vos contributions.

Alain
0
chatelain70 Messages postés 2 Date d'inscription mardi 29 mars 2005 Statut Membre Dernière intervention 19 janvier 2007
18 janv. 2007 à 10:25
Bonjour,

J'avais le même besoin et voiçi mon code qui fonctionne :

Dans un fichier .bat (planifié dans le schéduleur) :
cscript "c:\DIS\wix_0stat.vbs"

Dans un fichier .vbs :
main



Function main()
 appel_macro_NP()
End Function
 
 
Function appel_macro_NP()



 Dim Xl
 Dim Wb
 Dim NomMacro
 Dim monOnglet
 
 Set Xl = CreateObject("Excel.application")
 Xl.Visible = False
 Set Wb = Xl.Workbooks.Open("c:\DIS\Statistiques\duree_batch.xls")
 
 monOnglet = "données"



 Xl.run WB.Name & "!Module1.read_stats"



xl.quit
set wb = Nothing
set Xl = Nothing



End Function



Par contre, j'ai un gros souci avec ma macro appelée.


Dès que je quitte ma session (sous Windows 2000), le traitement .bat se lance bien mais le script .vbs ne fait plus rien, comme s'il ne pouvait pas ouvrir le fichier Excel. Pourtant, le PC est démarré.


Mais dès que j'ouvre ma session, le traitement se déroule bien quand on le relance.


Est-ce donc impossible de lancer une macro Excel automatiquement lorsqu'aucune session n'est ouverte? Si non, y a t'il un moyen de contourner le problème?

Merci d'avance
0
cs_zoubli Messages postés 8 Date d'inscription vendredi 3 novembre 2006 Statut Membre Dernière intervention 8 octobre 2007
18 janv. 2007 à 12:12
Ben je lance la macro via un ordonnanceur, qui appelle un .bat qui lui appelle mon VBS avec passage de paramètres et le VBS exécute les macro du .XLS.

Sachant que tout se passe entre 2 serveurs sur le réseau, il n'y a pas forcément de session ouverte sur le serveur ou la macro s'exécute, tout se passe en tache de fond et sans aucun souci.

Voici mon code source :

'call_modèledetravail.vbs
Option Explicit
Stop


main


Function appel_macro_3param (Feuille, dimtab, numcol)
 Dim Xl
 Dim Wb
 Dim NomMacro
 Set Xl = CreateObject("Excel.application")
 Xl.Visible = True
 Set Wb = Xl.Workbooks.Open("[file://\\SRV_BO2\Dev\Commun\Clotures\RH_Paie\Modèle \\SRV_BO2\Dev\Commun\Clotures\RH_Paie\Modèle] de travail.xls")
 Xl.run "'" & Wb.Name & "'!main_fichier_DSI", Feuille, dimtab, numcol
 Set Wb = Nothing
 Set Xl = Nothing
End Function


Function appel_macro_4param (Feuille, dimtab, numcol, argum)
 Dim Xl
 Dim Wb
 Dim NomMacro
 Set Xl = CreateObject("Excel.application")
 Xl.Visible = True
 Set Wb = Xl.Workbooks.Open("[file://\\SRV_BOOOSTER2\Dev\Commun\Clotures\RH_Paie\Modèle \\SRV_BO2\Dev\Commun\Clotures\RH_Paie\Modèle] de travail.xls")
 Xl.run "'" & Wb.Name & "'!main_fichier_DSI", Feuille, dimtab, numcol, argum
 Set Wb = Nothing
 Set Xl = Nothing
End Function


Function main()
 Dim args
 Dim FeuilleMEF
 Dim Arg2
 Dim Arg3
 Dim Arg4
 Set args = WScript.Arguments
 FeuilleMEF = args.Item(0)
 Arg2 = args.Item(1)
 Arg3 = args.Item(2)
 If WScript.Arguments.Count = 4 Then
  MsgBox "Nombre :" & WScript.Arguments.Count
  Arg4 = args.Item(3)
  Call appel_macro_4param (FeuilleMEF, Arg2, Arg3, Arg4)
 Else
  MsgBox "Nombre :" & WScript.Arguments.Count
  Call appel_macro_3param (FeuilleMEF, Arg2, Arg3)
 End If
End Function
0
chatelain70 Messages postés 2 Date d'inscription mardi 29 mars 2005 Statut Membre Dernière intervention 19 janvier 2007
19 janv. 2007 à 12:32
Mon problème venait que mon compte ne faisait pas partie du groupe d'admin du PC. C'était donc un problème de droit.
C'est corrigé et fonctionnel depuis.
0
Rejoignez-nous