По сути, VBA - это язык, который подключается к библиотеке объектов Excel. PowerShell также является языком, который может подключаться к библиотеке объектов Excel. Другие, в том числе Java, C#, Python, PHP, R и многие другие имеют эту возможность через Компонентную объектную модель (COM) , доступную в Windows средах.
Поэтому просто переведите свой код VBA в PowerShell как любой метод Excel должно быть доступно. VBA имеет тенденцию быть привязанным к продуктам MS Office, потому что это подключенный язык defacto , но на самом деле это отдельный компонент (см., Как это первая ссылка проверена в Tools \ References ... в IDE). Ниже приведены примеры более простых переводов VBA в PowerShell:
Инициализация объектов 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
...
Открытые объекты 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")
...
Наборы ручек (например, таблицы 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 )