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

时间:2016-10-11 13:54:39

标签: vba excel-vba macros task scheduler

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

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

2 个答案:

答案 0 :(得分:1)

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

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

enter image description here

诀窍就是让它只在你告诉它时执行你的刷新任务,然后每隔一段时间静静地退出。

第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

答案 1 :(得分:0)

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

#
#  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()