侠义非凡的脆皮肠 · java 关闭window进程命令行 ...· 1 周前 · |
曾经爱过的南瓜 · pst格式文件转eml或mbox-CSDN博客· 2 周前 · |
豪爽的肉夹馍 · Django使用form表单填写错误不清空已 ...· 1 年前 · |
腹黑的剪刀 · 前端基于dom或者canvas实现页面水印_ ...· 1 年前 · |
我有一个Excel VBA宏,在从批处理文件访问文件时需要运行它,但不是每次打开它时都需要运行它(因此不使用open file事件)。有没有办法从命令行或批处理文件运行宏?我不熟悉这样的命令。
假设是Windows NT环境。
您可以编写一个vbscript来通过createobject()方法创建一个excel实例,然后打开工作簿并运行宏。可以直接调用vbscript,也可以从批处理文件中调用vbscript。
这是我刚刚偶然发现的一个资源: http://www.codeguru.com/forum/showthread.php?t=376401
如果您更喜欢在Excel/VBA中工作,请使用open事件并测试环境:有一个信号文件、一个注册表项或一个控制open事件功能的环境变量。
您可以在外部创建文件/设置并在内部进行测试(对env-vars使用GetEnviromentVariable ),并且可以轻松地进行测试。我写过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"
Debug.Print "Normal"
End If
End Sub
根据需要添加活动代码。在批处理文件中,使用
set InBatch=TRUE
最简单的方法是:
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
现在,这会将控件返回到批处理文件以进行其他处理。
不是直接比较字符串(VB不会发现它们相等,因为GetEnvironmentVariable返回一个长度为255的字符串),而是这样写:
Private Sub Workbook_Open()
If InStr(1, GetEnvironmentVariable("InBatch"), "TRUE", vbTextCompare) Then
Debug.Print "Batch"
Call Macro
Debug.Print "Normal"
End If
End Sub
我总是在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
您可以检查Excel是否已打开。不需要创建另一个isntance
If CheckAppOpen("excel.application") Then
'MsgBox "App Loaded"
Set xlApp = GetObject(, "excel.Application")
' MsgBox "App Not Loaded"
Set wrdApp = CreateObject(,"excel.Application")
End If
我偏爱C#。我使用linqpad运行以下命令。但它可以很容易地用csc编译,并通过从命令行调用。
不要忘记将excel包添加到名称空间中。
void Main()
var oExcelApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
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;
}
下面显示的方法允许从批处理文件中运行定义的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()
曾经爱过的南瓜 · pst格式文件转eml或mbox-CSDN博客 2 周前 |