Executer macro excel via VBS [Résolu]

cs_zoubli 8 Messages postés vendredi 3 novembre 2006Date d'inscription 8 octobre 2007 Dernière intervention - 15 déc. 2006 à 19:28 - Dernière réponse : chatelain70 2 Messages postés mardi 29 mars 2005Date d'inscription 19 janvier 2007 Dernière intervention
- 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
Afficher la suite 

8 réponses

Répondre au sujet
cs_JMO 1838 Messages postés jeudi 23 mai 2002Date d'inscription 1 avril 2018 Dernière intervention - 15 déc. 2006 à 20:07
+3
Utile
 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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_JMO
cs_JMO 1838 Messages postés jeudi 23 mai 2002Date d'inscription 1 avril 2018 Dernière intervention - 15 déc. 2006 à 19:52
0
Utile
 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
Commenter la réponse de cs_JMO
cs_zoubli 8 Messages postés vendredi 3 novembre 2006Date d'inscription 8 octobre 2007 Dernière intervention - 15 déc. 2006 à 20:01
0
Utile
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.
Commenter la réponse de cs_zoubli
cs_zoubli 8 Messages postés vendredi 3 novembre 2006Date d'inscription 8 octobre 2007 Dernière intervention - 18 déc. 2006 à 16:44
0
Utile
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
Commenter la réponse de cs_zoubli
cs_zoubli 8 Messages postés vendredi 3 novembre 2006Date d'inscription 8 octobre 2007 Dernière intervention - 19 déc. 2006 à 16:11
0
Utile
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
Commenter la réponse de cs_zoubli
chatelain70 2 Messages postés mardi 29 mars 2005Date d'inscription 19 janvier 2007 Dernière intervention - 18 janv. 2007 à 10:25
0
Utile
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
Commenter la réponse de chatelain70
cs_zoubli 8 Messages postés vendredi 3 novembre 2006Date d'inscription 8 octobre 2007 Dernière intervention - 18 janv. 2007 à 12:12
0
Utile
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
Commenter la réponse de cs_zoubli
chatelain70 2 Messages postés mardi 29 mars 2005Date d'inscription 19 janvier 2007 Dernière intervention - 19 janv. 2007 à 12:32
0
Utile
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.
Commenter la réponse de chatelain70

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.