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.
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.
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
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
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
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.
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.
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