Как использовать код VBA внутри скрипта Powershell - PullRequest
1 голос
/ 07 января 2020

Я хочу поместить некоторые необработанные данные в новый файл Excel с помощью PowerShell. Я знаю, как использовать comobject Excel.Application, который поставляется PowerShell.

Теперь моя проблема заключается в том, что Данные должны обрабатываться в Excel различными способами (во время работы скрипта). Я уже создал несколько макросов VBA, чтобы сделать это некоторое время назад, и теперь я хотел бы использовать их повторно. Можно ли «использовать» VBA через скрипт внутри недавно созданного и заполненного Excel? Или мне нужно воссоздать VBA в Powershell?

1 Ответ

1 голос
/ 08 января 2020

По сути, VBA - это язык, который подключается к библиотеке объектов Excel. PowerShell также является языком, который может подключаться к библиотеке объектов Excel. Другие, в том числе Java, C#, Python, PHP, R и многие другие имеют эту возможность через Компонентную объектную модель (COM) , доступную в Windows средах.

Поэтому просто переведите свой код VBA в PowerShell как любой метод Excel должно быть доступно. VBA имеет тенденцию быть привязанным к продуктам MS Office, потому что это подключенный язык defacto , но на самом деле это отдельный компонент (см., Как это первая ссылка проверена в Tools \ References ... в IDE). Ниже приведены примеры более простых переводов 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, таблицы доступа, абзацы 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 )
      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...