如何使用PowerShell将VBA代码添加到Excel工作表?

如何使用PowerShell将VBA代码添加到Excel工作表?,excel,vba,powershell,Excel,Vba,Powershell,我需要在双击之前在我的工作表(1)中包含一个私有子工作表(ByVal目标作为范围,Cancel作为布尔值) 我能在单元格中打开和写入 $excel = New-Object -ComObject Excel.Application $workbook = $excel.Workbooks.Add() $worksheet = $workbook.WorkSheets.item(1) $worksheet.range("c1","g6").value = "str" ... $workbook.S

我需要在双击之前在我的工作表(1)中包含一个
私有子工作表(ByVal目标作为范围,Cancel作为布尔值)

我能在单元格中打开和写入

$excel = New-Object -ComObject Excel.Application
$workbook = $excel.Workbooks.Add()
$worksheet = $workbook.WorkSheets.item(1)
$worksheet.range("c1","g6").value = "str"
...
$workbook.SaveAs($xlFlie, 50)
$Excel.Application.Quit()
如何将VBA代码放在工作表中(而不是放在VBA模块中)

我试过这个:

$xlmodule = $workbook.VBProject.VBComponents.Add()
$xlmodule.CodeModule.AddFromString($code)
我得到了这个错误:

无法在表达式Null中调用方法。
Au caractère.\Build-ADGrpsMembers2Excel.ps1:273:5
+$xlmodule=$workbook.VBProject.VBComponents.Add(1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +类别信息:无效操作:(:)[],运行时异常
+FullyQualifiedErrorId:InvokeMethodOnFull


我需要将VBA选项更改为

$excel = New-Object -ComObject Excel.Application
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name AccessVBOM -Value 1 -Force | Out-Null
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name VBAWarnings -Value 1 -Force | Out-Null

我的工作代码是:

$excel = New-Object -ComObject Excel.Application
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name AccessVBOM -Value 1 -Force | Out-Null
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name VBAWarnings -Value 1 -Force | Out-Null

$workbook = $excel.Workbooks.Add(1)
$worksheet=$workbook.WorkSheets.item(1)

$excel.Visible=$true
$excel.DisplayAlerts = $true
$excel.ScreenUpdating = $true

#$worksheet.range("c1","f6").ColumnWidth = 4
#$worksheet.range("c1","f6").Orientation = 90

$xlmodule = $workbook.VBProject.VBComponents.item('feuil1')
$code = @"
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
End Sub
"@

$xlmodule.CodeModule.AddFromString($code)

$saveName = "$([Environment]::GetFolderPath('desktop'))\Export-Excel ($( ((Get-Date -Format u ) -replace ":", ".") -replace "Z", '' ) ).xlsb"

# savegarde du fichier
$workbook.SaveAs($saveName, 50)

Write-Verbose "Closing $($WorkSheetName)"
$Excel.Workbooks.Close()
Write-Verbose "Exit Excel"
$Excel.Application.Quit

这个答案对我帮助很大,但我不得不添加另一个模块,所以我做了类似的事情

$workbook.VBProject.VBComponents.Add(1) 
$workbook.VBProject.VBComponents.Add(2) 
$workbook.VBProject.VBComponents.Add(3) 
$excel = New-Object -ComObject Excel.Application
$vbaProject = new-object -ComObject VB
$FilePath = "c:\temp\excel.xlsm"
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name AccessVBOM -Value 1 -Force | Out-Null
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name VBAWarnings -Value 1 -Force | Out-Null

$workbook = $excel.Workbooks.Add($FilePath)
# Add(1) za dodavanje modula
#$workbook.VBProject.VBComponents.Add(1)

$xlmodule = $workbook.VBProject.VBComponents.item('Module1')


$code = @"
Sub test()
'
End Sub
"@
$xlmodule.CodeModule.AddFromString($code)
$workbook.SaveAs($FilePath,52)
$excel.Workbooks.Close() 
$excel.Application.Quit()
1代表模块,2代表用户表单,3代表类

要获取刚刚添加的模块,它将位于组件阵列中的最后一个位置

$arrayOfComponents = @($workbook.VBProject.VBComponents)
$justAddedModule = $arrayOfComponents[$arrayOfComponents.Length-1]
看起来是这样的

$workbook.VBProject.VBComponents.Add(1) 
$workbook.VBProject.VBComponents.Add(2) 
$workbook.VBProject.VBComponents.Add(3) 
$excel = New-Object -ComObject Excel.Application
$vbaProject = new-object -ComObject VB
$FilePath = "c:\temp\excel.xlsm"
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name AccessVBOM -Value 1 -Force | Out-Null
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$($excel.Version)\excel\Security" -Name VBAWarnings -Value 1 -Force | Out-Null

$workbook = $excel.Workbooks.Add($FilePath)
# Add(1) za dodavanje modula
#$workbook.VBProject.VBComponents.Add(1)

$xlmodule = $workbook.VBProject.VBComponents.item('Module1')


$code = @"
Sub test()
'
End Sub
"@
$xlmodule.CodeModule.AddFromString($code)
$workbook.SaveAs($FilePath,52)
$excel.Workbooks.Close() 
$excel.Application.Quit()

对于$工作簿,您不需要52而不是50吗