1

我的目標: 創建一個新選項卡並將其命名爲函數。在函數中創建時無法命名Excel選項卡

我的問題: 當我在函數內部創建新選項卡時,我無法命名該選項卡。

備註: 當我在該函數的外部創建選項卡時,它會正確命名。

我的代碼:

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" 

回答

4

的問題是,你假設新的工作表添加爲最後一個工作表中,但默認情況下添加方法在開始添加新的工作表。該腳本最多可以處理三個工作表,但在此之後,它會在開始時添加具有默認名稱的新工作表,並不斷重命名最後一個工作表。您需要在最後添加工作表。

變化

$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是失蹤一個佔位符參數之前(不能爲null)

附錄

事後的想法......雖然它適用於這個特定的腳本,我發現它有點依賴於三個工作表的默認初始配置,根據這個假設讓功能改變行爲(重命名三個工作表,然後開始添加更多),並依靠一個計數器變量來檢測你正在重命名工作表,而不是重命名你剛添加的活動工作表。由於函數繼承了一個已有的工作簿而不是創建一個新的工作簿,我認爲編寫一個函數會更「乾淨」,它將爲您提供一個具有指定名稱的空白工作表的工作簿,而不管初始配置如何。

也許這只是我的個人哲學傾向,以更普遍適用的方式編寫函數(讀取:可重用)而不是特設的,但我更喜歡儘可能少假設的函數。以下是我想做到這一點:

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對象作爲參數傳遞給函數,可以避免需要繼續對其進行範圍化。你可以這樣調用該函數:(當然,你也可以,只要你保持正確的順序離開關參數名稱-Worksheets-Excel

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

+0

其中一個最好,最有答案我得到了,非常感謝你!在一個側面說明我從來沒有新的命令記錄像以前那樣。希望我能用它來阻止我在未來提出類似的問題。 – user1451070

+0

請注意更新 - 我忘記了在循環之前禁用警報以刪除默認工作表,以避免提示您確認三次,然後重新啓用它們。 –

0

感謝您的文章,我能夠得到我需要的結果。我做了一些細微的修改,使得這個功能可以重用。

Function Function_CreateWorksheets { 
    [CmdletBinding()] 
    param (
     [parameter(Mandatory=$true,ValueFromPipeline=$true)][object] $Excel, 
     [string[]] $WorkSheets 
    ) 
    ForEach ($Worksheet in $Worksheets) { 
     $Script:Excel_Count_Worksheet++ 
     If ($Excel_Count_Worksheet -gt $Excel.Worksheets.Count) {$Excel.Worksheets.Add([System.Reflection.Missing]::Value, $Excel.Worksheets.Item($Script:Excel.Worksheets.Count)) |Out-Null} 
     $Excel.Worksheets.Item($Excel_Count_Worksheet).Name = $Worksheet 
    } 
    While ($Excel.Worksheets.Count -gt $Script:Excel_Count_Worksheet) { 
     $Excel.Worksheets.Item($Excel.Worksheets.Count).Delete() 
    } 
} 
+0

關於比較添加的工作表數量的工作表數量以確定從頭開始刪除多少個數字的好主意,從而不需要將數字存儲在變量中。請注意,不需要對計數器變量進行範圍限制,因爲默認情況下它是本地函數,並且在函數外部沒有用處。但是,你甚至不需要計數器變量;你可以直接從** $ Worksheets **參數中獲取。我會更新我的答案。 –

相關問題