【问题标题】:How to use VBA Code inside a Powershell Script如何在 Powershell 脚本中使用 VBA 代码
【发布时间】:2020-01-07 15:15:31
【问题描述】:

我想使用 PowerShell 将一些原始数据放入一个新的 Excel 文件中。我知道如何使用 PowerShell 提供的 comobject Excel.Application。

现在我的问题是必须在 Excel 中以不同的方式处理数据(在脚本运行时)。不久前我已经创建了一些 VBA 宏来执行此操作,现在我想重用它们。是否可以通过新创建和填充的 Excel 中的脚本“使用”VBA?还是我需要在 Powershell 中重新创建 VBA?

【问题讨论】:

  • 为什么不让 Powershell 在 COM 连接后运行保存的宏?请注意:VBA 与 Excel 对象库建立相同的 COM 连接!
  • @f6a4 感谢您的回答,但仍有问题。我正在创建一个没有 VBA 代码的新 Excel,问题是我可以通过 PowerShell 将 VBA 运行到 Excel,而 Excel 中没有 VBA?
  • @Parfait 这听起来好像可行,但说实话,我不太明白,你能详细解释一下吗?

标签: excel vba powershell


【解决方案1】:

本质上,VBA 是一种连接到 Excel 对象库的语言。 PowerShell 也是一种可以连接 Excel 对象库的语言。还有其他一些工具,包括 JavaC#PythonPHPR 等,在 Windows 环境中通过 Component Object Model (COM) 提供了此功能。

因此,只需将您的 VBA 代码转换为 PowerShell,因为任何 Excel method 都应该可用。 VBA 往往与 MS Office 产品相关联,因为它是 defacto 连接的语言,但实际上是一个单独的组件(请参阅如何在 IDE 中的 Tools\References... 下对其进行首次引用检查)。以下是更简单的 VBA 到 PowerShell 转换的示例:

  1. 初始化 Office 对象

    • VBA

      ' EARLY BINDING
      Set xlObj = New Excel.Application
      Set accObj = New Access.Application
      Set wrdObj = New Word.Application
      ...
      
      ' LATE BINDING
      Set xlObj = CreateObject("Excel.Application")
      Set accObj = CreateObject("Access.Application")
      Set wrdObj = CreateObject("Word.Application")
      ...
      
    • PowerShell

      $xlObj = new-object -comobject excel.application
      $accObj = new-object -comobject access.application
      $wrdObj = new-object -comobject word.application
      ...
      
  2. 打开 Office 对象,使用 Excel 的 Workbooks.Open、Access 的 OpenCurrentDatabase、Word 的 Documents.Open。注意:这些方法都不限于 VBA。

    • VBA

      Set xlWB = xlObj.Workbooks.Open("C:\Path\To\Workbook.xlsx")
      Set accDB = accObj.OpenCurrentDatabase("C:\Path\To\Access.accdb")
      Set wrdDOC = wrdObj.Documents.Open("C:\Path\To\Document.docx")
      ...
      
    • PowerShell

      $xlWB = $xlObj.Workbooks.Open("C:\Path\To\Workbook.xlsx")
      $accDB = $accObj.OpenCurrentDatabase("C:\Path\To\Access.accdb")
      $wrdDOC = $wrdObj.Documents.Open("C:\Path\To\Document.docx")
      ...
      
  3. 处理集合(例如,Excel 工作表、Access 表格、Word 段落)。

    • VBA

      ' SELECT SINGLE OBJECTS
      Set xlSheet = xlWB.Worksheets("mySheet")
      Set accTable = accObj.Currentdb().TableDefs("myTable")
      Set wrdParag = wrdDOC.Paragraphs(1)
      ...
      
    • PowerShell

      # EXCEL WORKSHEETS LOOP
      $xlObj = new-object -comobject excel.application
      
      $xlWB = $xlObj.Workbooks.Open("C:\Path\To\Workbook.xlsx")
      
      Foreach($wsh in $xlWB.Worksheets)
      {
         Write-host $wsh.name
      }            
      
      $xlWB.Close($false)
      $xlObj.quit()
      
      [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlObj )
      
      
      # ACCESS DB TABLES LOOP
      $accObj = new-object -comobject access.application    
      $accDB = $accObj.OpenCurrentDatabase("C:\Path\To\Access.accdb")
      
      Foreach($tbl in $accObj.CurrentDb().TableDefs())
      {
         Write-host $tbl.name
      }
      
      $accDB.DoCmd.CloseDatabase
      $accObj.quit()
      
      [System.Runtime.Interopservices.Marshal]::ReleaseComObject($accObj )
      

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多