77 votes

Comment exécuter des macros Excel à partir d'une ligne de commande ou d'un fichier batch ?

J'ai une macro Excel VBA qui doit être exécutée lorsque j'accède au fichier à partir d'un fichier batch, mais pas à chaque fois que je l'ouvre (d'où le fait de ne pas utiliser l'événement d'ouverture de fichier). Existe-t-il un moyen d'exécuter la macro à partir de la ligne de commande ou du fichier batch ? Je ne suis pas familier avec une telle commande.

Supposons un environnement Windows NT.

1 votes

Est-il possible d'utiliser vbscript/jscript avec l'hôte de script de Windows ?

84voto

Robert Mearns Points 5127

Vous pouvez lancer Excel, ouvrir le classeur et exécuter la macro à partir d'un fichier VBScript.

Copiez le code ci-dessous dans le Bloc-notes.

Mettez à jour le ' MonWorkbook.xls et MyMacro paramètres.

Enregistrez-le avec une extension vbs et exécutez-le.

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application") 
  Set xlBook = xlApp.Workbooks.Open("C:\MyWorkbook.xls", 0, True) 
  xlApp.Run "MyMacro"
  xlApp.Quit 

  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub 

La ligne clé qui exécute la macro est :

xlApp.Run "MyMacro" (Ma macro)

10 votes

C'est ce que je cherchais ! Il fonctionne. Je dois ajouter que quelques modifications sont nécessaires pour que cela fonctionne sans problème : 1. C'est "xlApp.Run". 2. Avant de quitter, il faut utiliser xlApp.SaveAs, sinon les modifications apportées par la macro ne seront pas enregistrées. (Avant de quitter, il faut invoquer xlApp.ActiveWorkbook.Close, sinon la feuille de calcul reste ouverte (bien que cachée), ce qui empêche toute modification ultérieure. Dans l'ensemble, c'est ce que je recherchais :)

1 votes

Pensez également à ajouter xlApp.Visible = True sinon vous ne verrez pas Excel ou les boîtes de dialogue qui pourraient apparaître.

1 votes

Le processus EXCEL.exe ne se ferme pas quand j'exécute ce script textuel.

23voto

bvukas Points 61

La façon la plus simple de le faire est de :

1) Lancez Excel à partir de votre fichier batch pour ouvrir le classeur contenant votre macro :

EXCEL.EXE /e "c:\YourWorkbook.xls"

2) Appelez votre macro à partir de l'écran du classeur. Workbook_Open événement, tel que :

Private Sub Workbook_Open()
    Call MyMacro1          ' Call your macro
    ActiveWorkbook.Save    ' Save the current workbook, bypassing the prompt
    Application.Quit       ' Quit Excel
End Sub

Cette opération permet de renvoyer le contrôle à votre fichier batch pour qu'il effectue d'autres traitements.

3 votes

J'y ai pensé, mais il s'exécuterait même si je ne l'ouvre pas par le biais du fichier batch, ce qui rendrait le fichier lui-même impossible à utiliser sans désactiver les macros au préalable.

1 votes

Ce problème peut être résolu simplement en modifiant un paramètre de registre qui indique à Excel quel niveau de sécurité est défini.

0 votes

Bien sûr, la signature numérique du cahier d'exercices est toujours utile, même avec un certificat Test :)

4voto

Fink Points 1821

Vous pourriez écrire un vbscript pour créer une instance d'excel via la méthode createobject(), puis ouvrir le classeur et exécuter la macro. Vous pouvez soit appeler le vbscript directement, soit appeler le vbscript à partir d'un fichier batch.

Voici une ressource sur laquelle je suis tombé par hasard : http://www.codeguru.com/forum/showthread.php?t=376401

3voto

Chris Chambers Points 11

Si vous êtes plus à l'aise pour travailler dans Excel/VBA, utilisez l'événement d'ouverture et testez l'environnement : ayez un fichier de signal, une entrée de registre ou une variable d'environnement qui contrôle ce que fait l'événement d'ouverture.

Vous pouvez créer le fichier/réglage à l'extérieur et tester à l'intérieur (utilisez GetEnviromentVariable pour les env-vars) et tester facilement. J'ai écrit du VBScript mais les similitudes avec le VBA me causent plus d'angoisse que de facilité

[plus]

Si je comprends bien le problème, vous voulez utiliser une feuille de calcul normalement la plupart du temps, mais la faire fonctionner par lot et faire quelque chose d'extra/différent. Vous pouvez ouvrir la feuille à partir de la ligne de commande excel.exe, mais vous ne pouvez pas contrôler ce qu'elle fait si elle ne sait pas où elle se trouve. L'utilisation d'une variable d'environnement est relativement simple et permet de tester facilement la feuille de calcul.

Pour clarifier, utilisez la fonction ci-dessous pour examiner l'environnement. Dans un module déclarer :

Private Declare Function GetEnvVar Lib "kernel32" Alias "GetEnvironmentVariableA" _
    (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long

Function GetEnvironmentVariable(var As String) As String
Dim numChars As Long

    GetEnvironmentVariable = String(255, " ")

    numChars = GetEnvVar(var, GetEnvironmentVariable, 255)

End Function

Dans l'événement d'ouverture du classeur (comme les autres) :

Private Sub Workbook_Open()
    If GetEnvironmentVariable("InBatch") = "TRUE" Then
        Debug.Print "Batch"
    Else
        Debug.Print "Normal"
    End If
End Sub

Ajoutez le code actif le cas échéant. Dans le fichier batch, utilisez

set InBatch=TRUE

3voto

laybmw Points 11

Au lieu de comparer directement les chaînes (VB ne les trouvera pas égales puisque GetEnvironmentVariable renvoie une chaîne de longueur 255), écrivez ceci :

Private Sub Workbook_Open()     
    If InStr(1, GetEnvironmentVariable("InBatch"), "TRUE", vbTextCompare) Then
        Debug.Print "Batch"  
        Call Macro
    Else    
        Debug.Print "Normal"     
    End If 

End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X