2012-02-01 38 views
7

我已經在這個相當長一段時間,通過創建一個.Copy新的Excel工作表(),並將其移動到最後的位置

我想通過複製另一個創建一個新的工作表。這會將新工作表放置在複印工作表之前。然後我想將它移到所有工作表的最後。

目的是有工作表稱爲> summary1> summary2> summary3 ...等的順序

這裏是我有什麼(藉口簡潔)

$ex = New-Object -ComObject Excel.Application 
$ex.Visible = $true 
$wb = $ex.Workbooks.Add() 

for ($i = 1; $i -le 3; $i++) 
{ 
    $wb.Worksheets.Item(2).Copy($wb.Worksheets.Item(2)) 
    $newSheet = $wb.Worksheets.Item(2) 
    $newSheet.Activate() 
    $name = "Summary$i" 
    $newSheet.Name = $name 
    $wb.Worksheets.Item($name).Move($wb.Worksheets.Item($i + 1))   
} 

它適用於第一板,它重命名工作表,然後將其移動到最後,但每次達到.Move方法後,它都不會執行任何操作,除了激活()原始「摘要」工作表之外。

我不知道如何解釋這種行爲..謝謝友善提前。

編輯:改變$ wb.Worksheets.Item( 「摘要」)移動到$ wb.Worksheets.Item($名).Move

編輯:

這裏是解決方案:

for ($i = 1; $i -le 3; $i++) 
{ 
    $wb.Worksheets.Item(2).Copy($wb.Worksheets.Item(2)) 
    $newSheet = $wb.Worksheets.Item(2) 
    $newSheet.Activate() 
    $name = "Summary$i" 
    $newSheet.Name = $name 

    $lastSheet = $wb.WorkSheets.Item($wb.WorkSheets.Count) 
    $newSheet.Move([System.Reflection.Missing]::Value, $lastSheet)  
} 
+9

歡迎計算器,請注意,你可以回答你自己的問題,而不是僅在編輯它(它甚至[強烈推薦](HTTP: //meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking))並接受它。這樣,您可以與社區分享您的知識,並*關閉*問題 - 感謝社區。 – JMax 2012-02-01 11:57:18

回答

2

標記爲社區,因爲它來自上面的問題。

這裏是解決方案:

for ($i = 1; $i -le 3; $i++) 
{ 
    $wb.Worksheets.Item(2).Copy($wb.Worksheets.Item(2)) 
    $newSheet = $wb.Worksheets.Item(2) 
    $newSheet.Activate() 
    $name = "Summary$i" 
    $newSheet.Name = $name 

    $lastSheet = $wb.WorkSheets.Item($wb.WorkSheets.Count) 
    $newSheet.Move([System.Reflection.Missing]::Value, $lastSheet)  
} 
0

我可以提出一個更「一般」,並可能更快地得到答案,不僅僅是因爲它的緣故。請記住,它來自VBA,需要稍微修改才能在與您的問題相同的環境中運行。

Sub sheetCopier() 
    Dim destSht As Object, srcSht As Object, NewShts As Long, shtCnt As Long 

    Set srcSht = ThisWorkbook.Sheets(2) 

    For NewShts = 1 To 5 
     shtCnt = ThisWorkbook.Sheets.Count 
     srcSht.Copy after:=ThisWorkbook.Sheets(shtCnt) 
     Set destSht = ThisWorkbook.Sheets(shtCnt + 1) 
     destSht.Name = "New Sht" & Format(NewShts, "00") 
    Next 
    Set srcSht = Nothing 
    Set destSht = Nothing 

End Sub 

顯然什麼您可能感興趣的是:

shtCnt = ThisWorkbook.Sheets.Count 
srcSht.Copy after:=ThisWorkbook.Sheets(shtCnt) 
Set destSht = ThisWorkbook.Sheets(shtCnt + 1) 
destSht.Name = "New Sht" & Format(NewShts, "00") 

,其餘都只是爲了運行演示。

你可以做的事情甚至更少的代碼,但它不是那麼好看:

thisworkbook.sheets(2).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) 
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = "New Sht" & Format(NewShts, "00") 

,所以我猜(但不能確認)您的代碼可以這樣寫:

for ($i = 1; $i -le 3; $i++) 
{ 
    $wb.Worksheets(2).Copy(,$wb.Worksheets($wb.Worksheets.count)) 
    $name = "Summary$i" 
    $wb.Worksheets($wb.Worksheets.count).Name = $name 
} 

只需注意複製語法是:.copy([之前],[之後])與optionals之前和之後。在VBA後設置方式爲:.copy after:=ASheetObject.copy ,aSheetObject

歡呼

相關問題