【问题标题】:Auto Update Excel File, running Macro with Task Scheduler自动更新 Excel 文件,使用任务计划程序运行宏
【发布时间】:2016-10-11 13:54:39
【问题描述】:

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

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

【问题讨论】:

  • 也许你可以看看让任务管理器运行脚本而不是打开文件,脚本可以打开工作簿并启动宏。
  • 谢谢。我对它的工作原理有点不熟悉,但我会考虑这样做。如果您对如何提供帮助有任何建议,将不胜感激
  • 我用来启动宏的 vbscript 是这样的。 Sub ExcelMacroExample() Dim xlApp Dim xlBook Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("Tables.xls", 0, false) xlapp.visible = true xlApp.Run "UpdateAll" xlapp .activeworkbook.close xlApp.Quit Set xlBook = Nothing Set xlApp = Nothing End Sub

标签: vba excel macros task scheduler


【解决方案1】:

如果您想在纯 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

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

这是不直观的部分。当您在任务管理器中打开工作簿时,您必须使用命令行参数打开 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

【讨论】:

  • 我有 "CmdLine = CmdToSTr(CmdRaw)" CmdToSTr 出现未定义
  • 糟糕,我的错...现在更新答案。
  • 所以我得到一个编译错误:找不到与 Module1.RunAllOfThatAutomationJunk 的私有子工作簿 Open() 相关的方法或数据成员。我不知道从这里做什么。
  • 您可以将电子表格发布到 DropBox / GDrive 或类似的东西吗?
  • 我认为我无法从我的工作计算机访问 Dropbox。我也许可以将其发送给自己,稍后再上传
【解决方案2】:

这是一个 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()

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2012-05-23
    相关资源
    最近更新 更多