我正在尝试从 Excel 文件外部运行 Excel 宏。我目前正在使用从命令行运行的“.vbs”文件,但它一直告诉我找不到宏。这是我正在尝试使用的脚本
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
我尝试了位于 Is it possible to run a Macro in Excel from external command? 的解决方案,以达到此目的(当然进行了修改),但它似乎不起作用。我不断收到错误“Microsoft Office Excel:找不到宏“Macro.TestMacro”。
编辑:Excel 2003。
好吧,其实很简单。假设您的宏位于模块中,而不是在其中一张表中,您可以使用:
objExcel.Application.Run "test.xls!dog"
'notice the format of 'workbook name'!macro
对于包含空格的文件名,请用引号将文件名引起来。
如果您已将宏放置在工作表下,例如工作表 1,则假设工作表 1 拥有该函数,事实也是如此。
objExcel.Application.Run "'test 2.xls'!sheet1.dog"
注意:您不需要一直使用的 Macro.testfunction 符号。
此代码将打开文件 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
由于我的相关问题在我花了一整天的时间搜索如何击败“宏未找到或禁用”错误后被正义之手删除,因此在此发布对我有用的唯一语法(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
我尝试将 @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
无论如何,感谢您的帮助,如果有人需要的话,我希望这会有所帮助
我尝试了上述方法,但出现“找不到宏”错误。 这是最终有效的代码!
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。
我通常将宏与工作簿分开存储在
xlam
加载项中,因此我想打开一个工作簿,然后运行单独存储的宏。
由于这需要 VBS 脚本,我想让它“可移植”,这样我就可以通过传递参数来使用它。这是最终的脚本,它有 3 个参数。
我是这样测试的:
"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlam" "Hello"
"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlsx" "Hello" "%AppData%\Microsoft\Excel\XLSTART\Book1.xlam"
runmacro.vbs:
Set args = Wscript.Arguments
ws = WScript.Arguments.Item(0)
macro = WScript.Arguments.Item(1)
If wscript.arguments.count > 2 Then
macrowb= WScript.Arguments.Item(2)
End If
LaunchMacro
Sub LaunchMacro()
Dim xl
Dim xlBook
Set xl = CreateObject("Excel.application")
Set xlBook = xl.Workbooks.Open(ws, 0, True)
If wscript.arguments.count > 2 Then
Set macrowb= xl.Workbooks.Open(macrowb, 0, True)
End If
'xl.Application.Visible = True ' Show Excel Window
xl.Application.run macro
'xl.DisplayAlerts = False ' suppress prompts and alert messages while a macro is running
'xlBook.saved = True ' suppresses the Save Changes prompt when you close a workbook
'xl.activewindow.close
xl.Quit
End Sub
如果您尝试从个人工作簿运行宏,它可能不起作用,因为使用 VBScript 打开 Excel 文件不会自动打开您的 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
因此,在循环开始时,它打开 individuals.xlsb 并从那里为所有其他工作簿运行宏。只是想我应该在这里发帖,以防万一有人像我一样遇到这个问题,但无法弄清楚为什么宏仍然没有运行。
您好,使用此线程来获得解决方案,然后我想分享我所做的事情,以防万一有人可以使用它。
我想要的是调用一个宏来更改一些单元格并删除一些行,但我需要超过1500个excel(每个文件大约花费3分钟)
主要问题: -当从 vbe 调用宏时,我遇到了同样的问题,无法从 PERSONAL.XLSB 调用宏,当脚本打开时,excel 没有执行 individual.xlsb 并且宏窗口中没有任何选项
我通过保持打开一个加载了宏的 Excel 文件(a.xlsm)(在执行脚本之前)解决了这个问题
然后我从脚本打开的Excel中调用宏
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