【问题标题】:How to add VBA code to Excel worksheet using PowerShell?如何使用 PowerShell 将 VBA 代码添加到 Excel 工作表?
【发布时间】:2014-02-12 06:21:24
【问题描述】:

我需要在工作表 (1) 中包含 Private Sub Worksheet_BeforeDoubleClick (ByVal Target As Range, Cancel As Boolean)

我可以在单元格中打开和书写。

$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 中调用方法。
特征 .\Build-ADGrpsMembers2Excel.ps1:273 : 5
+ $xlmodule = $workbook.VBProject.VBComponents.Add(1)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~
+ CategoryInfo : InvalidOperation : (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

【问题讨论】:

    标签: excel vba powershell


    【解决方案1】:

    我需要将 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
    

    【讨论】:

    【解决方案2】:

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

    $workbook.VBProject.VBComponents.Add(1) 
    $workbook.VBProject.VBComponents.Add(2) 
    $workbook.VBProject.VBComponents.Add(3) 
    

    1 用于模块,2 用于用户窗体,3 用于类

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

    $arrayOfComponents = @($workbook.VBProject.VBComponents)
    $justAddedModule = $arrayOfComponents[$arrayOfComponents.Length-1]
    

    所以它看起来像这样

    $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()
    

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多