Подтвердить что ты не робот

Запуск макроса Excel из внешнего Excel с помощью VBScript из командной строки

Я пытаюсь запустить макрос Excel из-за пределов файла Excel. В настоящее время я использую ".vbs" файл из командной строки, но он продолжает говорить мне, что макрос не может быть найден. Вот script Я пытаюсь использовать

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

И вот макрос, к которому я пытаюсь получить доступ:

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

Я попробовал решения, расположенные в Возможно ли запустить макрос в Excel из внешней команды?, чтобы получить это далеко (и, конечно же, изменено), но это не так, похоже, работает. Я продолжаю получать сообщение об ошибке "Microsoft Office Excel: макрос" Macro.TestMacro "не найден.

EDIT: Excel 2003.

4b9b3361

Ответ 1

Хорошо, это на самом деле просто. Предполагая, что ваш макрос находится в модуле, а не на одном из листов, вы используете:

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

Для имени файла с пробелами помещайте имя файла в кавычки.

Если вы разместили макрос под листом, скажем, sheet1, просто предположите, что sheet1 владеет функцией, которую она выполняет.

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

Примечание. Вам не нужна нотация macro.testфункции, которую вы использовали.

Ответ 2

Думаю, вы пытаетесь это сделать? (ИСПЫТАНИЕ И ИСПЫТАНИЕ)

Этот код откроет файл Test.xls и запустит макрос TestMacro, который, в свою очередь, напишет в текстовый файл 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

Ответ 3

Я попытался адаптировать код @Siddhart к относительному пути для запуска моего макроса open_form, но он, похоже, не работал. Это была моя первая попытка. Мое рабочее решение ниже.

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

ИЗМЕНИТЬ

Я действительно отработал это, на всякий случай, когда кто-то хочет запустить пользовательскую форму "подобно" автономному приложению:

Проблемы, с которыми я столкнулся:

1 - Я не хотел использовать событие Workbook_Open, поскольку excel заблокирован только для чтения. 2 - Команда партии ограничена тем фактом, что (насколько мне известно) она не может вызвать макрос.

Сначала я написал макрос, чтобы запустить мою пользовательскую форму, скрывая приложение:

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

Затем я создал vbs для запуска этого макроса (выполнение этого с относительным путем было сложным):

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"

И я, наконец, сделал пакетный файл для выполнения VBS...

@echo off
pushd %~dp0
cscript Add_Client.vbs

Обратите внимание, что я также включил "Установить обратно в видимый" в мой 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

В любом случае, спасибо за вашу помощь, и я надеюсь, что это поможет, если кому-то это понадобится

Ответ 4

Я попробовал вышеуказанные методы, но я получил ошибку "macro not found". Это окончательный код, который сработает!

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

В моем случае MyMacro находится под Sheet1, таким образом Sheet1.MyMacro.

Ответ 5

Так как мой связанный вопрос был удален праведной рукой после того, как я убил весь день, чтобы узнать, как победить ошибку "макрос не найден или отключен", опубликовал здесь единственный синтаксис, который работал у меня (application.run не, независимо от того, что я пробовал)

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

Ответ 6

Если вы пытаетесь запустить макрос из своей личной книги, это может не сработать, поскольку открытие файла Excel с помощью VBScript автоматически не открывает ваш PERSONAL.XLSB. вам нужно будет сделать что-то вроде этого:

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

Итак, в начале цикла он открывает personals.xlsb и запускает макрос оттуда для всех других книг. Просто подумал, что я должен опубликовать здесь на всякий случай, если кто-то столкнется с этим, как я, но не могу понять, почему макрос все еще не работает.

Ответ 7

Привет, я использовал этот поток, чтобы получить решение, тогда я хотел бы поделиться тем, что я сделал на случай, если кто-то сможет его использовать.

То, что я хотел, - это вызвать макрос, который меняет некоторые ячейки и стирает некоторые строки, но мне нужно было более 1500 excels (приблизительно потратил 3 минуты для каждого файла)

Основная проблема: Когда вы вызывали макрос из vbe, у меня была та же проблема, было невозможно вызвать макрос из PERSONAL.XLSB, когда script отклонил excel, не выполнил personal.xlsb и не был какой-либо опцией в окне макроса

Я решил это, сохранив один файл excel с загруженным макросом (a.xlsm) (перед выполнением script)

Затем я вызываю макрос из excel, созданного 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

Ответ 8

я пытаюсь сделать loading.gif появляться, пока vbsricpt запускает vba excel. и в конце скрипта loading.gif закроется и на экране появится надпись "Завершено".

образец кода:

set objExcel = createobject("Excel.Application")
objExcel.application.visible=false
objExcel.application.run"c:\Folder\excel.xlsm'!Module1.Macro1"
objExcel.DisplayAlert = False
objExcel.application.activeworkbook.save
wscript.echo "Finished"
objExcel.application.quit
set objExcel = Nothing