【问题标题】:Copy only visible worksheets via Powershell通过 Powershell 仅复制可见的工作表
【发布时间】:2021-12-22 01:26:24
【问题描述】:

我有一个 powershell 脚本,它循环遍历 excel 文件的所有工作表,以将列从一个工作表复制到另一个文件中具有相同名称的另一个工作表。它运行良好,但我希望它只循环通过源文件中的可见工作表。我怎样才能修改脚本来完成这个?

Param(
   $Source = “Source.xlsm”,
   $range1 = “A1:EZ1”,
   $Output = “Output.xlsx”
   
   ) #end param
$Excel = New-Object -ComObject excel.application
$Excel.visible = $false

$Workbook = $excel.Workbooks.open($Source)
$WorkbookOutput = $excel.Workbooks.open($Output)
$Excel.displayAlerts = $false # don't prompt the user
$i = 1
foreach ($sheet in $workbook.Worksheets)

 {  
$Worksheet = $Workbook.WorkSheets.item($i)
$worksheet.activate() 
$wksname = $worksheet.name
Write-Output $wksname
$range = $WorkSheet.Range($range1).EntireColumn
$range.Copy() | out-null
#$Excel.displayAlerts = $false # don't prompt the user
$WorksheetOutput = $WorkbookOutput.WorkSheets.item($wksname)
$worksheetOutput.activate()
#$Range = $Worksheet.Range($range2)
$WorksheetOutput.Range("A1:EZ1").PasteSpecial(-4163)
$i++
Write-Output $i

}
$workbook.Save() 
$Excel.Quit()

感谢您的帮助!

亲切的问候,

Smid

【问题讨论】:

  • foreach ($sheet in ($workbook.Worksheets | Where-Object { $_.Visible -eq -1 })) {..}XlSheetVisibility
  • 这就像一个魅力。谢谢@Theo!
  • 感谢您告诉我。但是,作为 SO 新手,您可能不知道这一点,但习惯上单击左侧的 图标 accept the answer that best solved your problem。这将帮助其他有类似问题的人更轻松地找到它,并有助于激发人们回答您的问题。

标签: excel powershell


【解决方案1】:
foreach ($sheet in $workbook.Worksheets) {
  if ($sheet.Visible) {
    ...
  }
}

【讨论】:

  • .Visible 属性不是简单的布尔 ($true/$false) 值。如评论所述,查看三个可能的值 [此处[(docs.microsoft.com/en-us/office/vba/api/excel.xlsheetvisibility)
  • 两者都支持。查看示例here
  • 不,不是真的.. if ($sheet.Visible) 在这种情况下表示 如果不是零 并且因为 xlSheetVeryHidden 的值为 2,它会接受为 没有隐藏。在 VB 中,True 恰好有一个数值 -1,这是 xlSheetVisible 的值
【解决方案2】:

为我的评论添加更多解释:

Excel 工作表具有.Visibility 属性。通常,这样的属性是一个布尔值,只有$true$false 适用。
然而,在这种情况下,.Visibility 是一个 [Int32] 值,可以具有三个不同的值,取自 XlSheetVisibility 枚举:

Name Value Description
xlSheetHidden 0 Hides the worksheet which the user can unhide via menu.
xlSheetVeryHidden 2 Hides the object so that the only way for you to make it visible again is by setting this property to True (the user cannot make the object visible).
xlSheetVisible -1 Displays the sheet.

如您所见,可见工作表的值为-1

Microsoft 在此属性上的示例仅显示 VB 代码,它使用
Worksheets("Sheet1").Visible = TrueWorksheets("Sheet1").Visible = False 将可见性设置为 -10。 这是因为在 VB 中,True 的数值等于 -1

然而,在 PowerShell 中,$true 的数值不是-1,而是1

[int]$true # --> 1

这意味着您不应将该属性设置为使用$true 作为使工作表可见的值,而应改为使用-1

这同样适用于测试工作表是可见还是隐藏:
在这种情况下检查 if ($sheet.Visible){..} 不会检查 Boolean 是 $true 还是 $false,但由于值是整数,它会检查 "是否该属性为零"
如果工作表设置为 xlSheetVeryHidden(值 2),该测试将导致 $true,让您​​认为它是可见的..

最后,在您的用例中,只需将 foreach 循环更改为:

foreach ($sheet in ($workbook.Worksheets | Where-Object { $_.Visible -eq -1 })) {
    # the rest of your code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多