从 bat 文件调用 VBA 宏

Calling a VBA macro from bat file

我有一个 vba 宏来取消合并合并的单元格并在 excel 中重复,但我需要 运行 这个宏而不打开 excel 和同样的逻辑也将应用于多个 excel,因此我需要一个批处理文件来调用 vba 并应用于文件夹中的 excel。有什么办法吗?

您可以从批处理文件(在循环中)调用此 VBscript

用法:

CScript inject.vbs "C:\johan\VbaStuff\Empty workbook.xlsx" "C: \johan\VbaStuff\DummyMacro.bas" "AddDateToA1"

inject.vbs:

dim oArgs, i, FSO
dim fileName, macroFileName, functionName
dim oApplication, oWorkbooks, oWorkbook, oVbProject
dim oComponents, oModule, fullFunction

Set oArgs = WScript.Arguments
For i = 0 to oArgs.Count - 1
   WScript.Echo "Arg" & i & ": " & oArgs(i)
Next
WScript.Echo ""

if oArgs.Count < 3 then
    WScript.Echo "Too few arguments"
    WScript.Quit
end if

fileName = oArgs(0)
macroFileName = oArgs(1)
functionName = oArgs(2)

set FSO = CreateObject("Scripting.FileSystemObject")

if not FSO.FileExists(fileName) then
    WScript.Echo "Excel file does not exist"
    WScript.Quit
end if

if not FSO.FileExists(macroFileName) then
    WScript.Echo "Macro file does not exist"
    WScript.Quit
end if

set oApplication = CreateObject("Excel.Application")

oApplication.DisplayAlerts = False

WScript.Echo "Injecting in Excel version: " & oApplication.Version

set oWorkbooks = oApplication.Workbooks
set oWorkbook = oWorkbooks.Open(fileName)
WScript.Echo oWorkbook.Name

set oVbProject = oWorkbook.VBProject
WScript.Echo oVbProject.Name

set oComponents = oVbProject.VBComponents
set oModule = oComponents.Import(macroFileName)

fullFunction = Trim(oModule.Name & "." & functionName)
WScript.Echo "Full function: '" & fullFunction & "'"
oApplication.Run(fullFunction)
oComponents.Remove(oModule)

oWorkbook.Save()
WScript.Echo "Saved changes"
oWorkbook.Close(False)

Call oApplication.Quit()

set oModule = Nothing
set oComponents = Nothing
set oVbProject = Nothing
set oWorkbook = Nothing
set oWorkbooks = Nothing
set oApplication = Nothing
set FSO = Nothing

完整性的虚拟宏:

Attribute VB_Name = "DummyMacro"
Sub AddDateToA1()
    Dim oCell As Range
    Dim sTime As String

    Set oCell = ThisWorkbook.Sheets(1).Cells(1, 1)
    sTime = CStr(TimeValue(Now))

    oCell.Value = sTime
    MsgBox "Wrote time " & sTime & " to " & oCell.Address(0, 0, xlA1, 1)
End Sub