办法从命令行或批处理文件运行Excel宏?办法从命令行或批处理文件运行Excel宏?(Way to

2019-05-08 22:59发布

我每次我打开它(因此不使用打开文件事件)时一个Excel VBA宏,我需要从一个批处理文件访问文件时运行,但不是。 有没有一种方法来运行命令行或批处理文件中的宏? 我不熟悉这样的命令。

假设一个Windows NT环境。

Answer 1:

您可以启动Excel,打开工作簿并运行一个VBScript文件中的宏。

下面的代码复制到记事本中。

更新“MyWorkbook.xls”“MyMacro”参数。

用VBS扩展名保存并运行它。

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application") 
  Set xlBook = xlApp.Workbooks.Open("C:\MyWorkbook.xls", 0, True) 
  xlApp.Run "MyMacro"
  xlApp.Quit 

  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub 

运行该宏的键线为:

xlApp.Run “MyMacro”



Answer 2:

做到这一点最简单的方法是:

1)从您的批处理文件启动Excel,打开工作簿包含您的宏:

EXCEL.EXE /e "c:\YourWorkbook.xls"

2)从工作簿中的调用宏Workbook_Open事件,如:

Private Sub Workbook_Open()
    Call MyMacro1          ' Call your macro
    ActiveWorkbook.Save    ' Save the current workbook, bypassing the prompt
    Application.Quit       ' Quit Excel
End Sub

现在,这将控制返回到您的批处理文件做其他处理。



Answer 3:

下面给出的方法允许从运行批处理文件中定义的Excel宏,它使用环境变量来从批次传递宏名称到Excel。

把这段代码的批处理文件(使用你的路EXCEL.EXE和工作簿):

Set MacroName=MyMacro
"C:\Program Files\Microsoft Office\Office15\EXCEL.EXE" "C:\MyWorkbook.xlsm"

将这个代码到Excel VBA的ThisWorkbook对象:

Private Sub Workbook_Open()
    Dim strMacroName As String
    strMacroName = CreateObject("WScript.Shell").Environment("process").Item("MacroName")
    If strMacroName <> "" Then Run strMacroName
End Sub

并把你的代码到Excel VBA模块,如如下:

Sub MyMacro()
    MsgBox "MyMacro is running..."
End Sub

启动批处理文件,并得到结果:

对于情况下,当你不打算运行任何宏只是把空值Set MacroName=到批处理。



Answer 4:

你可以写一个VBScript通过CREATEOBJECT()方法创建Excel的实例,然后打开工作簿并运行宏。 你既可以直接调用VBScript或者从一个批处理文件调用的VBScript。

这里是一个资源我只是偶然翻过: http://www.codeguru.com/forum/showthread.php?t=376401



Answer 5:

我一直在测试Workbook_Open打开的工作簿的数量()。 如果它是1,则该工作簿是由命令行打开(或用户关闭所有工作簿,然后打开此一)。

If Workbooks.Count = 1 Then

    ' execute the macro or call another procedure - I always do the latter  
    PublishReport

    ThisWorkbook.Save

    Application.Quit

End If


Answer 6:

如果你更舒适的Excel / VBA容器内工作,使用开放的事件和测试环境:要么有一个信号文件,注册表项或控制什么open事件做一个环境变量。

您可以创建文件/设置外部和内部测试(使用GetEnviromentVariable为ENV-增值经销商)和测试很容易。 我写的VBScript但相似之处VBA事业比我更缓解焦虑..

[更多]

据我了解的问题,要正常使用大部分电子表格/某些时候却让它在批量运行,并做一些额外的/不同。 您可以打开从EXCEL.EXE命令行的负债,但你无法控制它做什么,除非它知道它在哪里。 使用环境变量相对简单,使得测试的电子表格容易。

为了澄清,使用下面的函数来检查环境。 在模块声明:

Private Declare Function GetEnvVar Lib "kernel32" Alias "GetEnvironmentVariableA" _
    (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long

Function GetEnvironmentVariable(var As String) As String
Dim numChars As Long

    GetEnvironmentVariable = String(255, " ")

    numChars = GetEnvVar(var, GetEnvironmentVariable, 255)

End Function

在打开工作簿事件(如其他):

Private Sub Workbook_Open()
    If GetEnvironmentVariable("InBatch") = "TRUE" Then
        Debug.Print "Batch"
    Else
        Debug.Print "Normal"
    End If
End Sub

添加在活动代码适用。 在批处理文件,使用

set InBatch=TRUE


Answer 7:

而不是直接比较字符串(VB不会找到他们平等的,因为GetEnvironmentVariable返回一个长度为255的字符串)这样写:

Private Sub Workbook_Open()     
    If InStr(1, GetEnvironmentVariable("InBatch"), "TRUE", vbTextCompare) Then
        Debug.Print "Batch"  
        Call Macro
    Else    
        Debug.Print "Normal"     
    End If 

End Sub 


Answer 8:

@罗伯特:我曾尝试使用相对路径来适应你的代码,并创建一个批处理文件来运行VBS。

在VBS启动和关闭,但不启动宏......哪里的问题可能是任何想法?

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application")
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  strFilePath = objFSO.GetAbsolutePathName(".") 
  Set xlBook = xlApp.Workbooks.Open(strFilePath, "Excels\CLIENTES.xlsb") , 0, True) 
  xlApp.Run "open_form"


  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub

我删除了“Application.Quit”,因为我的宏调用一个窗体照顾它。

干杯

编辑

其实我已经工作了,以防万一有人想运行一个窗体“一点通”独立的应用程序:

我的问题是面临着:

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

无论如何,感谢您的帮助,我也希望如果有人需要它,这将帮助



Answer 9:

您可以检查Excel是否已经打开。 没有必要创建另一个isntance

   If CheckAppOpen("excel.application")  Then
           'MsgBox "App Loaded"
            Set xlApp = GetObject(, "excel.Application")   
   Else
            ' MsgBox "App Not Loaded"
            Set  wrdApp = CreateObject(,"excel.Application")   
   End If


Answer 10:

我偏爱C#。 我跑了使用linqpad以下。 但它可以很容易地与CSC编译,并通过命令行被叫跑。

不要忘了Excel中包到命名空间。

void Main()
{
    var oExcelApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    try{
        var WB = oExcelApp.ActiveWorkbook;
        var WS = (Worksheet)WB.ActiveSheet;
        ((string)((Range)WS.Cells[1,1]).Value).Dump("Cell Value"); //cel A1 val
        oExcelApp.Run("test_macro_name").Dump("macro");
    }
    finally{
        if(oExcelApp != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcelApp);
        oExcelApp = null;
    }
}


文章来源: Way to run Excel macros from command line or batch file?