web-dev-qa-db-fra.com

Exécuter une macro Excel à partir d'Excel en utilisant VBScript à partir de la ligne de commande

J'essaie d'exécuter une macro Excel à partir d'un fichier Excel. J'utilise actuellement un fichier ".vbs" exécuté à partir de la ligne de commande, mais il ne cesse de me dire que la macro est introuvable. Voici le script que j'essaie d'utiliser

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("test.xls")

objExcel.Application.Visible = True
objExcel.Workbooks.Add
objExcel.Cells(1, 1).Value = "Test value"

objExcel.Application.Run "Macro.TestMacro()"
objExcel.ActiveWorkbook.Close


objExcel.Application.Quit
WScript.Echo "Finished."
WScript.Quit

Et voici la macro à laquelle j'essaie d'accéder:

Sub TestMacro()
'first set a string which contains the path to the file you want to create.
'this example creates one and stores it in the root directory
MyFile = "C:\Users\username\Desktop\" & "TestResult.txt"
'set and open file for output
fnum = FreeFile()
Open MyFile For Output As fnum
'write project info and then a blank line. Note the comma is required
Write #fnum, "I wrote this"
Write #fnum,
'use Print when you want the string without quotation marks
Print #fnum, "I printed this"
Close #fnum
End Sub

J'ai essayé les solutions situées à Est-il possible d'exécuter une macro dans Excel à partir d'une commande externe? pour aller aussi loin (et bien sûr modifié) mais cela ne semblait pas fonctionner. Le message d'erreur «Microsoft Office Excel: la macro« Macro.TestMacro »est introuvable.

EDIT: Excel 2003.

27
muttley91

Ok, c'est en fait simple. En supposant que votre macro se trouve dans un module et non dans l’une des feuilles, vous utilisez:

  objExcel.Application.Run "test.xls!dog" 
  'notice the format of 'workbook name'!macro

Pour un nom de fichier avec des espaces, placez-le avec des guillemets.

Si vous avez placé la macro sous une feuille, par exemple, feuille1, supposez que feuille1 possède la fonction, ce qui est le cas.

    objExcel.Application.Run "'test 2.xls'!sheet1.dog"

Remarque: vous n'avez pas besoin de la notation macro.testfunction que vous avez utilisée.

27
Wolf-Kun

Je pense que vous essayez de faire ça? ( ESSAYÉ ET TESTÉ )

Ce code ouvrira le fichier Test.xls et exécutera la macro TestMacro qui écrira à son tour dans le fichier texte TestResult.txt

Option Explicit

Dim xlApp, xlBook

Set xlApp = CreateObject("Excel.Application")
'~~> Change Path here
Set xlBook = xlApp.Workbooks.Open("C:\Test.xls", 0, True)
xlApp.Run "TestMacro"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Echo "Finished."
WScript.Quit
21
Siddharth Rout

J'ai essayé d'adapter le code de @ Siddhart à un chemin relatif pour exécuter ma macro open_form, mais cela ne semblait pas fonctionner. Voici ma première tentative. Ma solution de travail est ci-dessous.

Option Explicit

Dim xlApp, xlBook
dim fso
dim curDir
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing

Set xlApp = CreateObject("Excel.Application")
'~~> Change Path here
Set xlBook = xlApp.Workbooks.Open(curDir & "Excels\CLIENTES.xlsb", 0, true)
xlApp.Run "open_form"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Echo "Finished."

MODIFIER

En fait, j'ai résolu le problème au cas où quelqu'un voudrait exécuter un formulaire utilisateur "de la même manière" qu'une application autonome:

Problèmes auxquels je faisais face:

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 formulaire utilisateur 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 également inclus le "Retour à la visibilité" 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

4
Axn40

Depuis que ma question connexe a été supprimée par une main droite après que j'ai tué toute la journée en cherchant comment battre l'erreur "macro introuvable ou désactivé", en affichant ici la seule syntaxe qui a fonctionné pour moi ce que j'ai essayé)

Set objExcel = CreateObject("Excel.Application")

' Didn't run this way from the Modules
'objExcel.Application.Run "c:\app\Book1.xlsm!Sub1"
' Didn't run this way either from the Sheet
'objExcel.Application.Run "c:\app\Book1.xlsm!Sheet1.Sub1"
' Nor did it run from a named Sheet
'objExcel.Application.Run "c:\app\Book1.xlsm!Named_Sheet.Sub1"

' Only ran like this (from the Module1)

Set objWorkbook = objExcel.Workbooks.Open("c:\app\Book1.xlsm")
objExcel.Run "Sub1"

Excel 2010, Win 7

3
access_granted

J'ai essayé les méthodes ci-dessus mais j'ai eu l'erreur "macro introuvable" .. C'est le code final qui a fonctionné!

Option Explicit

Dim xlApp, xlBook

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True

  ' Import Add-Ins
xlApp.Workbooks.Open "C:\<pathOfXlaFile>\MyMacro.xla"
xlApp.AddIns("MyMacro").Installed = True

'
Open Excel workbook
Set xlBook = xlApp.Workbooks.Open("<pathOfXlsFile>\MyExcel.xls", 0, True)

' Run Macro
xlApp.Run "Sheet1.MyMacro"

xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Quit

Dans mon cas, MyMacro se trouve sous Sheet1, donc Sheet1.MyMacro.

2
maryhadalittlelamb

Si vous essayez d'exécuter la macro à partir de votre classeur personnel, il se peut que l'ouverture d'un fichier Excel avec un script VBScript n'ouvre pas automatiquement votre PERSONAL.XLSB. vous aurez besoin de faire quelque chose comme ça:

Dim oFSO
Dim oShell, oExcel, oFile, oSheet
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
Set oExcel = CreateObject("Excel.Application")
Set wb2 = oExcel.Workbooks.Open("C:\..\PERSONAL.XLSB") 'Specify foldername here

oExcel.DisplayAlerts = False


For Each oFile In oFSO.GetFolder("C:\Location\").Files
    If LCase(oFSO.GetExtensionName(oFile)) = "xlsx" Then
        With oExcel.Workbooks.Open(oFile, 0, True, , , , True, , , , False, , False)



            oExcel.Run wb2.Name & "!modForm"


            For Each oSheet In .Worksheets



                oSheet.SaveAs "C:\test\" & oFile.Name & "." & oSheet.Name & ".txt", 6


            Next
            .Close False, , False
        End With
    End If



Next
oExcel.Quit
oShell.Popup "Conversion complete", 10

Au début de la boucle, il ouvre donc le fichier personals.xlsb et exécute la macro à partir de là pour tous les autres classeurs. Je pensais juste que je devrais poster ici juste au cas où quelqu'un courrait ça comme moi, mais je ne pouvais pas comprendre pourquoi la macro ne fonctionnait toujours pas.

0
Eduardo Dennis

Salut utilisé ce fil pour obtenir la solution, alors je voudrais partager ce que je faisais juste au cas où quelqu'un pourrait l'utiliser.

Ce que je voulais, c’était d’appeler une macro qui change certaines cellules et efface certaines lignes, mais il me fallait plus de 1500 excels (environ 3 minutes passées pour chaque fichier)

Principalement le problème: - en appelant la macro de vbe, j'ai eu le même problème, il était impossible d'appeler la macro depuis PERSONAL.XLSB, lorsque le script ouvert, Excel n'exécutait pas personal.xlsb et n'était pas une option de la macro la fenêtre 

J'ai résolu ce problème en gardant ouvert un fichier Excel avec la macro chargée (a.xlsm) (avant d'exécuter le script)

J'appelle ensuite la macro d'Excel ouverte par le script

    Option Explicit
    Dim xl
    Dim counter

   counter =10



  Do

  counter = counter + 1

  Set xl = GetObject(, "Excel.Application")
  xl.Application.Workbooks.open "C:\pruebas\macroxavi\IA_030-08-026" & counter & ".xlsx"
  xl.Application.Visible = True
  xl.Application.run "'a.xlsm'!eraserow" 
  Set xl = Nothing


  Loop Until counter = 517

  WScript.Echo "Finished."
  WScript.Quit
0
xarokk