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
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"
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.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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?
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
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.