Façon d'exécuter des macros Excel à partir de la ligne de commande ou d'un fichier batch?

J'ai une macro Excel VBA que je dois exécuter lors de l'accès au fichier à partir d'un fichier batch, mais pas chaque fois que je l'ouvre (donc ne pas utiliser l'événement open file). 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.

59
demandé sur STF 2010-01-12 19:32:58

10 réponses

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 ' MyWorkbook.xls " et "Mamacro "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.Exécuter "Mamacro"

71
répondu Robert Mearns 2010-01-26 22:06:13

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

1) démarrez 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'événement Workbook_Open du classeur, 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

Cela va maintenant retourner le contrôle à votre fichier batch pour faire d'autres traitements.

16
répondu bvukas 2010-01-12 18:39:51

Vous pouvez é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, ou appeler le vbscript à partir d'un fichier de commandes.

Voici une ressource que je viens de trébucher: http://www.codeguru.com/forum/showthread.php?t=376401

4
répondu Fink 2010-01-12 16:45:17

La méthode ci-dessous permet d'exécuter une macro Excel définie à partir d'un fichier batch, elle utilise une variable d'environnement pour passer le nom de la macro du lot à Excel.

Mettez ce code dans le fichier batch (utilisez vos chemins vers EXCEL.EXE et vers le classeur):

Set MacroName=MyMacro
"C:\Program Files\Microsoft Office\Office15\EXCEL.EXE" "C:\MyWorkbook.xlsm"

Mettez ce code dans Excel VBA objet ThisWorkBook:

Private Sub Workbook_Open()
    Dim strMacroName As String
    strMacroName = CreateObject("WScript.Shell").Environment("process").Item("MacroName")
    If strMacroName <> "" Then Run strMacroName
End Sub

Et mettez votre code dans le Module Excel VBA, comme suit:

Sub MyMacro()
    MsgBox "MyMacro is running..."
End Sub

Lancez le fichier batch et obtenez le résultat:

boîte de dialogue de la macro

Pour le cas où vous n'avez pas l'intention d'exécuter une macro, il suffit de mettre la valeur vide Set MacroName= dans le lot.

3
répondu omegastripes 2015-12-28 20:52:25

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

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

[plus]

Si je comprends bien le problème, vous voulez utiliser un feuille de calcul normalement la plupart/une partie du temps encore l'ont exécuté en lot et faire quelque chose de supplémentaire / différent. Vous pouvez ouvrir la feuille à partir d'excel.ligne de commande exe mais vous ne pouvez pas contrôler ce qu'il fait à moins qu'il ne sache où il se trouve. L'utilisation d'une variable d'environnement est relativement simple et facilite le test de 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 Open classeur (comme les autres):

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

Ajouter actif code applicable. Dans le fichier batch, utilisez

set InBatch=TRUE
2
répondu Chris Chambers 2010-01-13 16:37:19

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 
2
répondu laybmw 2012-03-27 14:33:50

J'ai toujours testé le nombre de classeurs ouverts dans Workbook_Open(). Si c'est 1, alors le classeur a été ouverte par la ligne de commande (ou l'utilisateur a fermé tous les classeurs, puis ouvert).

If Workbooks.Count = 1 Then

    ' execute the macro or call another procedure - I always do the latter  
    PublishReport

    ThisWorkbook.Save

    Application.Quit

End If
2
répondu Brian Hoffman 2013-02-06 15:28:34

@ Robert: j'ai essayé d'adapter votre code avec un chemin relatif, et créé un fichier batch pour exécuter le SCRIPT.

Le VBS démarre et se ferme mais ne lance pas la macro... Une idée de l'endroit où le problème pourrait être?

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application")
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  strFilePath = objFSO.GetAbsolutePathName(".") 
  Set xlBook = xlApp.Workbooks.Open(strFilePath, "Excels\CLIENTES.xlsb") , 0, True) 
  xlApp.Run "open_form"


  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub

J'ai supprimé l'Application".Quitter " parce que ma macro appelle un userform en prenant soin d'elle.

Santé

Modifier

J'ai effectivement travaillé, juste au cas où quelqu'un veut exécuter un userform "alike" un stand alone application:

Problèmes auxquels j'étais confronté:

1-Je ne voulais pas utiliser L'événement Workbook_Open car excel est verrouillé en lecture seule. 2 - la commande batch est limitée au fait que (à ma connaissance) elle ne peut pas appeler la macro.

J'ai d'abord écrit une macro pour lancer mon userform, tout en cachant l'application:

Sub open_form()
 Application.Visible = False
 frmAddClient.Show vbModeless
End Sub

J'ai ensuite créé un vbs pour lancer cette macro (le faire avec un chemin relatif a été délicat):

dim fso
dim curDir
dim WinScriptHost
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing

Set xlObj = CreateObject("Excel.application")
xlObj.Workbooks.Open curDir & "\Excels\CLIENTES.xlsb"
xlObj.Run "open_form"

Et j'ai finalement fait un fichier batch pour exécuter le VBS...

@echo off
pushd %~dp0
cscript Add_Client.vbs

Notez que j'ai aussi inclus le "retour à visible" dans mon Userform_QueryClose:

Private Sub cmdClose_Click()
Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ThisWorkbook.Close SaveChanges:=True
    Application.Visible = True
    Application.Quit
End Sub

Quoi Qu'il en soit, merci pour votre aide, et j'espère que cela aidera si quelqu'un en a besoin

2
répondu Axn40 2014-01-05 09:06:42

Vous pouvez vérifier si Excel est déjà ouvert. Il n'est pas nécessaire de créer une autre isntance

   If CheckAppOpen("excel.application")  Then
           'MsgBox "App Loaded"
            Set xlApp = GetObject(, "excel.Application")   
   Else
            ' MsgBox "App Not Loaded"
            Set  wrdApp = CreateObject(,"excel.Application")   
   End If
1
répondu Adam Law 2014-11-11 08:18:45

Je suis partial à C#. J'ai couru ce qui suit en utilisant linqpad. Mais il pourrait tout aussi facilement être compilé avec csc et exécuté à travers l'appel de la ligne de commande.

N'oubliez pas d'ajouter des paquets excel à l'espace de noms.

void Main()
{
    var oExcelApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    try{
        var WB = oExcelApp.ActiveWorkbook;
        var WS = (Worksheet)WB.ActiveSheet;
        ((string)((Range)WS.Cells[1,1]).Value).Dump("Cell Value"); //cel A1 val
        oExcelApp.Run("test_macro_name").Dump("macro");
    }
    finally{
        if(oExcelApp != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcelApp);
        oExcelApp = null;
    }
}
0
répondu t3dodson 2014-12-09 20:48:27