Exécuter une macro via un fichier batch

kalmard

XLDnaute Nouveau
Bonjour,


J'ai un fichier xlsm qui contient dans "Thisworkbook" une macro, cette macro envoie un mail avec en pièce le classeur tout entier.
Je souhaite éxécuter ma macro depuis un fichier .bat pour ensuite planifier cette exécution sur mon planificateur de tâche.

J'ai donc créé un module dans lequel j'ai saisi le code ci-dessous qui permet d'exécuter la ligne de commande du batch

Code:
Private Sub Workbook_Open()
Dim macmdline As Variant
Dim monparam As Variant 'déclare une variable
 
    macmdline = GetCmd 'affecte la valeur de la ligne de commande
    If Not IsNull(macmdline) Then 'si la variable est nulle
        If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée
            If InStr(macmdline, "/cmd") > 0 Then
                macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare)
                monparam = Split(macmdline, "/cmd")
                Application.Run Mid(monparam(1), 2, Len(monparam(1)) - 3)
            End If
        End If
    End If
End Sub



et ma ligne de commande dans .bat est:

Code:
C:\Program Files\Microsoft Office\Office12\EXCEL.exe" /cmd/EnvoiEmail "D:\C_Technique\CT_loi\Code\Report\New4.xlsm"


En éxutant mon batch j'ouvre bien Excel mais la macro ne s'exécute ,c-à-d que le mail n'est pas envoyé.

Pouvez-vous m'aidez s'il vous plaît ? je bloque depuis quelques jours sur ce point.


Merci d'avance.

Bon weekend.

Kalmard
 

Lone-wolf

XLDnaute Barbatruc
Re : Exécuter une macro via un fichier batch

Bonsoir Kalmard,

pour celà il faut que tu mette le code de Private Sub Workbook_Open dans une Sub();
exemple: Sub envoi() ton code End Sub, et dans Private Sub Workbook_Open tu peu écrire la ligne de trois façon.

envoi - Call envoi ou Run "envoi".

Edit: pas besoin d'une nouvelle Sub(), désolé pour le quack.

Amicalement
Lone-wolf :cool:
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Exécuter une macro via un fichier batch

Re kalmard,

j'ai pu retrouver le fichier concernant ton problème.

Code à inserer dans ThisWorkbook:

Code:
Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (lpString As Any) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long

Private Function GetCmd() As String
   Dim lpCmd As Long
   lpCmd = GetCommandLine()
   GetCmd = Space$(lstrlen(ByVal lpCmd))
   lstrcpy ByVal GetCmd, ByVal lpCmd
End Function

Private Sub Workbook_Open()
Dim macmdline As Variant
Dim monparam As Variant 'déclare une variable

    macmdline = GetCmd 'affecte la valeur de la ligne de commande
    If Not IsNull(macmdline) Then 'si la variable est nulle
        If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée
            If InStr(macmdline, "/cmd") > 0 Then
                macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare)
                monparam = Split(macmdline, "/cmd")
                Application.Run Mid(monparam(1), 2, Len(monparam(1)) - 3)
            End If
        End If
    End If
End Sub

Dans le fichier .bat:

Code:
@echo off
C:\Program Files\Microsoft Office\Office12\EXCEL.exe" /cmd/EnvoiEmail "D:\C_Technique\CT_loi\Code\Report\New4.xlsm"
pause

Amicalement
Lone-wolf :cool:
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Exécuter une macro via un fichier batch

Bonsoir kalmard,

Essaie ceci trouvé sur Développez.com.

Code:
Private Sub Workbook_Open()
Dim macmdline As Variant
Dim monparam As Variant 'déclare une variable
Dim ListeParam As Variant
Dim i As Integer

macmdline = GetCmd 'affecte la valeur de la ligne de commande
If Not IsNull(macmdline) Then 'si la variable est nulle
    If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée
        If InStr(macmdline, "/cmd") > 0 Then
            macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare)
            monparam = Split(macmdline, "/cmd")
            ListeParam = Split(Mid(monparam(1), 2, Len(monparam(1)) - 3),"/")
            For i = 0 to UBound(ListeParam)
               Application.Run ListeParam(i)
            Next i
        End If
    End If
End If
End Sub

Nouvelle macro

Sub test()
Application.DisplayAlerts = False
Application.Quit
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Run "test"
End Sub

Et dans le fichier .bat

@echo off
C:\Program Files\Microsoft Office\Office12\EXCEL.exe" /cmd/EnvoiEmail/test "D:\C_Technique\CT_loi\Code\Report\New4.xlsm"
pause


A+ :cool:


Amicalement
Lone-wolf
 

fhoest

XLDnaute Accro
Re : Exécuter une macro via un fichier batch

Bonsoir kalmard,lone wolf
@ Lone wolf , je te remercie pour m'avoir attribuer l'honneur de ce code,mais je ne suis pas l'auteur du code d'origine je l'ai juste adapter pour un poste,je ne voudrais pas voler la vedette du vrai auteur du code,cela ne se fait pas.
encore merci,
Au plaisir.
si je peux aider surtout ne pas hésiter j'essayerai de répondre présent pour moi c'est un grand plaisir.
A+
 

kalmard

XLDnaute Nouveau
Re : Exécuter une macro via un fichier batch

Bonjour Messieurs,
encore une fois désolé de répondre si tardivement,
J'ai éssayé le code pour fermer excel après l'envoi du mail, mais il n' a rien changé, le bathc ouvre Excel et envoie le mail sans pourtant fermer l'application excel.
J'ai mis mes 2 procédures test() et Workbook_BeforeClose dans le même module que la macro d'envoie du mail.
Aurait-ai-je sauter une étape?
Merci d'avance pour vos reponses

Bonne journée Kalmard.
 

kalmard

XLDnaute Nouveau
Re : Exécuter une macro via un fichier batch

Salut fhoest,


ça ne marche toujours pas, j'ai sais ceci:

Code:
"C:\Program Files\Microsoft Office\Office12\EXCEL.exe" /cmd/EnvoiEmail "D:\C_Technique\CT_Telephonie\Code\Report\New4.xlsm"
TASKKILL /F EXCEL.exe

Excel reste ouvert.
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 237
Membres
103 162
dernier inscrit
fcfg