gpt4 book ai didi

powershell - 在函数中创建时无法命名 Excel 选项卡

转载 作者:行者123 更新时间:2023-12-03 00:52:07 28 4
gpt4 key购买 nike

我的目标:
创建一个新选项卡并在函数中为其命名。

我的问题:
当我在函数内部创建新选项卡时,我无法命名该选项卡。

备注:
当我在函数之外创建选项卡时,它会被正确命名。

我的代码:

Function Function_CreateWorksheets($Worksheets) {
ForEach ($Worksheet in $Worksheets) {
$Excel_Count_Worksheet++
If ($Excel_Count_Worksheet -gt 3) {$Script:Excel.Worksheets.Add() |Out-Null}
$Script:Excel.Worksheets.Item($Excel_Count_Worksheet).Name = $Worksheet
}
}

#Load-Module -Module grouppolicy -Reload
Get-Variable Excel_* |Remove-Variable -Force

#Create Excel Com Object
$Excel = New-Object -com Excel.Application

# Make the Excel Application Visible to the end user
$Excel.visible = $True

# Create a WorkBook inside the Excel application
# that we can start manipulating.
$Excel_Workbook = $Excel.Workbooks.Add()
$Action_CreateWorksheet =

#=======================================================
# Now that we have a workbook we need to create some
# additional worksheets (Tabs) beyond that initial 3
# that are created when the workbook is opened.
#=======================================================
#$Temp_MakeWorkSheet = $Excel.Worksheets.Add()

#=======================================================
# Once all the sheets are created each of the worksheets
# need to be assigned to a variable so they can be
# manipulated.
#=======================================================
Function_CreateWorksheets -Worksheets "System Summary","Test1","Test2","Test3","Test4"

最佳答案

问题是您假设新工作表被添加为最后一个工作表,但默认情况下 添加 方法在开头添加新工作表。您拥有的脚本最多可用于三个工作表,但之后它会在开头添加具有默认名称的新工作表并不断重命名最后一个工作表。您需要在最后添加工作表。

改变

$Script:Excel.Worksheets.Add()



$Script:Excel.Worksheets.Add([System.Reflection.Missing]::Value, $Script:Excel.Worksheets.Item($Script:Excel.Worksheets.Count))

这是如何工作的:
  • 添加 方法takes four arguments :之前、之后、编号和类型。
  • $Excel.Worksheets.Item($Excel.Worksheets.Count))获取表示最后一个工作表的对象。您想将其提供为 之后 参数,以便在最后一个工作表之后添加新工作表。
  • [System.Reflection.Missing]::Value是缺失的 的占位符之前 参数(不能为空)


  • 附录

    作为事后的想法......虽然它适用于这个特定的脚本,但我发现依赖三个工作表的默认初始配置有点不确定,基于该假设更改函数行为(重命名三个工作表,然后开始添加更多) , 并依靠计数器变量来确定要重命名的工作表,而不是重命名刚刚添加的事件工作表。由于该函数继承了一个预先存在的工作簿而不是创建一个新工作簿,因此我认为编写一个函数会“更干净”,该函数将为您提供一个具有指定名称的空白工作表的工作簿,而不管初始配置如何。

    也许这只是我个人的哲学倾向,以更普遍适用(阅读:可重用)而不是临时的方式编写函数,但我更喜欢尽可能少的假设的函数。这是我的做法:

    function Function_CreateWorksheets {
    [CmdletBinding()]
    param (
    [string[]] $WorkSheets,
    [object] $Excel
    )
    for ($i = 1; $i -le $Excel.Worksheets.Count; $i++) {
    $Excel.Worksheets.Item($i).Name = "DeleteMe$i"
    }
    foreach ($Worksheet in $Worksheets) {
    $Excel.Worksheets.Add([System.Reflection.Missing]::Value,$Excel.Worksheets.Item($Excel.Worksheets.Count)) | Out-Null
    $Excel.ActiveSheet.Name = $Worksheet
    }
    $Excel.DisplayAlerts = $false
    while ($Excel.Worksheets.Count -gt $Worksheets.Count) {
    $Excel.Worksheets.Item(1).Delete()
    }
    $Excel.DisplayAlerts = $true
    }
  • 最后的循环删除所有预先存在的工作表。所有新工作表都添加到最后,因此循环从头开始删除工作表,直到工作簿中的工作表数量 ( $Excel.Worksheets.Count ) 与新工作表的数量 ( $ Worksheets.Count )。这需要放在最后,因为工作簿必须至少有一个工作表,因此如果您在创建任何新工作表之前尝试删除所有工作表,则会出现错误。
  • 首字母循环重命名所有预先存在的工作表,以便在任何新名称与已在使用的名称匹配时函数不会中断。无论如何,你都会摆脱它们,所以你不在乎它们的名字是什么。
  • 通过将 Application 对象作为参数传递给函数,您可以避免需要继续确定它的范围。您可以像这样调用该函数:

    Function_CreateWorksheets -Worksheets "System Summary","Test1","Test2","Test3","Test4" -Excel $Excel

  • (当然,参数名称 -Worksheets -Excel 可以省略,只要保持正确的顺序即可。)

    关于powershell - 在函数中创建时无法命名 Excel 选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383795/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com