2012-04-19 43 views
23

Estoy tratando de ejecutar una macro de Excel desde fuera del archivo de Excel. Actualmente estoy usando un archivo ".vbs" que se ejecuta desde la línea de comandos, pero sigue diciéndome que no se puede encontrar la macro. Aquí es el guión que estoy tratando de utilizarEjecutar Excel Macro desde fuera de Excel mediante VBScript desde la línea de comandos

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 

Y aquí es la macro que estoy tratando de acceso:

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 

probé las soluciones ubicadas en Is it possible to run a macro in Excel from external command? para llegar hasta aquí (y modificado por supuesto), pero no pareció funcionar. Sigo recibiendo el error `Microsoft Office Excel: no se puede encontrar la macro 'Macro.TestMacro'.

EDIT: Excel 2003.

+1

¿usted intentó retirar el "Macro". y/o el paréntesis y simplemente llámelo como este objExcel.Application.Run "TestMacro"? – deusxmach1na

+0

objExcel.Application.Run "test.xls! Macro.TestMacro" –

+0

Esos no funcionan tampoco :( – muttley91

Respuesta

22

Ok, en realidad es simple. Suponiendo que la macro está en un módulo, no en una de las hojas, que utilice:

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

Para un nombre de archivo con espacios, encerrar el nombre de archivo con comillas.

Si ha colocado la macro debajo de una hoja, digamos hoja1, simplemente suponga que la hoja 1 posee la función, lo que hace.

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

Aviso: No necesita la notación de macro.testfunction que ha estado usando.

+0

No me di cuenta que tenía que estar en un Módulo, lo tenía en el libro de trabajo (también pude he probado la segunda parte si la dejé en una de las hojas). ¡Gracias! – muttley91

20

Creo que estás intentando hacer esto? (probado y comprobado)

Este código se abrirá la Prueba.xls archivo y ejecutar la macro TestMacro que a su vez de escritura en el archivo de texto 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 
0

Si usted está tratando de ejecutar la macro de su libro de trabajo personal podría no funcionar, ya que abrir un archivo de Excel con un VBScript no abre automáticamente su PERSONAL.XLSB. tendrá que hacer algo como esto:

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 

Así que al principio del bucle se está abriendo personals.xlsb y ejecutar la macro desde allí por todos los otros libros. Solo pensé que debería publicar aquí solo en caso de que alguien se encuentre con esto como yo lo hice, pero no puedo entender por qué la macro todavía no se está ejecutando.

4

Intenté adaptar el código de @ Siddhart a una ruta relativa para ejecutar mi macro open_form, pero no pareció funcionar. Aquí fue mi primer intento. Mi solución de trabajo está abajo.

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

EDITAR

que han trabajado realmente a cabo, por si acaso alguien quiere ejecutar un formulario de usuario "igual" una aplicación independiente:

Problemas que estaba enfrentando:

1 - No quería utilizar el evento Workbook_Open ya que Excel está bloqueado en solo lectura. 2 - El comando por lotes está limitado por el hecho de que (que yo sepa) no puede llamar a la macro.

escribí por primera vez una macro para lanzar mi UserForm al tiempo que oculta la aplicación:

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

Entonces creé un VBS para lanzar esta macro (hacerlo con una ruta relativa ha sido complicado):

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" 

Y finalmente hice un archivo por lotes para ejecutar el VBS ...

@echo off 
pushd %~dp0 
cscript Add_Client.vbs 

Tenga en cuenta que También he incluido el "Set de nuevo a visible" en mi 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 

De todos modos, gracias por su ayuda, y espero que esto ayudará si alguien lo necesita

+0

Es genial que haya encontrado una solución, pero debe saber que su primera versión de esta respuesta no fue una respuesta, era una pregunta. En el futuro, publique preguntas como preguntas, no como respuestas. Es posible que desee [vaya a la introducción del sitio nuevamente] (http://stackoverflow.com/tour). – Charles

0

Hola utiliza este hilo para obtener la solución, entonces me gustaría compartir lo que hice solo en caso de que alguien pueda usarlo.

Lo que quería era llamar a una macro que cambie algunas células y borrar algunas filas, pero necesitaba desde hace más de 1500 sobresale (aproximadamente de pasar 3 minuts para cada archivo)

Principalmente problema: -cuando llaman a la macro de vbe, tengo el mismo problema, era imposible llamar a la macro de PERSONAL.XLSB, cuando el script se abrió, Excel no ejecutó personal.xlsb y no había ninguna opción en la macro ventana

Lo resolví manteniendo abrir un archivo de Excel con la macro cargada (a.xlsm) (antes de ejecutar el script)

Entonces yo llamo la macro de Excel oppened por el 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 
2

Probé los métodos anteriores, pero tengo el error "macro no se puede encontrar". ¡Este es el código final que funcionó!

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 

En mi caso, MyMacro pasa a estar en Sheet1, por lo Sheet1.MyMacro.

+0

gracias! ¿Cuándo se necesita la sección "Importar complementos"? – DAE

1

Dado que mi pregunta relacionada fue eliminada por una mano justa después de haber matado todo el día buscando cómo superar el error "macro no encontrado o deshabilitado", publicando aquí la única sintaxis que funcionó para mí (application.run didn ' t, no importa lo que he intentado)

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

Cuestiones relacionadas