繁体   English   中英

自动更新 Excel 文件,使用任务计划程序运行宏

[英]Auto Update Excel File, running Macro with Task Scheduler

我正在尝试每天打开、更新和保存一个 excel 文件。 该文件位于远程桌面上,因为它正在从远程桌面上的程序中提取数据。 不是每个人都可以访问远程桌面,但他们可以访问 excel 文件。

文件从软件中提取数据,运行宏来组织和过滤。 我想每天早上打开这个文件,运行宏,然后保存并关闭文件。 我已经让任务管理器打开文件,但不确定如何运行获取宏,以及我需要添加什么才能使文件自行保存。

如果您想在纯 Excel/VBA 中执行此操作,您实际上可以将命令行参数发送到工作簿。 这不是最直接的过程。

如果在工作簿对象本身上创建Workbook_Open事件,则每次打开 Excel 时都会运行此事件中的代码。

在此处输入图片说明

诀窍是让它只在您告诉它时执行刷新任务并每隔一次安静地退出。

第 1 步:创建您的活动:

Private Sub Workbook_Open()
  Dim CmdRaw As Long
  Dim CmdLine, LastParam As String
  Dim Params As Variant

  CmdRaw = GetCommandLine     ' in our example, this will be /e/Refresh
  CmdLine = CmdToSTr(CmdRaw)
  Params = Split(CmdLine, "/")
  LastParam = Params(UBound(Params))

  If LastParam = "Refresh" Then
     Module1.RunAllOfThatAutomationJunk
  End If

End Sub

同样,如果它获得最后一个参数是“Refresh”的命令行参数,它只会执行实际的工作。 当然,你可以随心所欲地制作它。

这是不直观的部分。 当您在任务管理器中打开工作簿时,您必须使用命令行参数打开 Excel 应用程序以及您的文档:

excel.exe c:\MyLocation\MyFile.xlsm /e/Refresh

/e是触发将命令发送到 Excel 的原因,您可以看到事件如何解析它。 您可以通过这种方式在斜杠之间放置任意数量的命令行参数。

请记住 Excel.exe 实际上可能类似于:

"c:\Program Files (x86)\Microsoft Office\Office14\excel.exe"

但我不想假设任何事情。

- 编辑 -

此代码还必须存在(在模块中)才能启用这些功能。 过去,我尝试将它添加到 VBA 本身的工作簿中,但没有成功,但是如果它在单独的模块/类中,它似乎可以完美运行。

Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long
Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long)

Function CmdToSTr(cmd As Long) As String
Dim Buffer() As Byte
Dim StrLen As Long

   If cmd Then
      StrLen = lstrlenW(cmd) * 2
      If StrLen Then
         ReDim Buffer(0 To (StrLen - 1)) As Byte
         CopyMemory Buffer(0), ByVal cmd, StrLen
         CmdToSTr = Buffer
      End If
   End If
End Function

这是我们用来打开 Excel 文件、将一些工作表提取到 CSV 然后退出的 PowerShell 脚本。 我希望它有帮助。

#
#  Extract worksheets from Excel into CSV files
#
$workingDir = Get-Location
$XL = New-Object -ComObject Excel.Application
$XL.Visible = $false
$XL.DisplayAlerts = $false

$inputFile = $workingDir.ProviderPath + '\Properties.xlsx'
write-debug $inputFile

$wb = $XL.Workbooks.Open($inputFile)

foreach ($ws in $wb.Worksheets)
{
    $outputName = $workingDir.ProviderPath + '\' + $ws.Name + '.csv'
    write-debug $outputName

    #
    #  The second argument is XlFileFormat enum.
    #  6 = xlCSV
    #  23 = xlCSVWindows
    #
    $ws.SaveAs($outputName, 6)
}
$XL.Quit()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM