通过.Copy()创build一个新的Excel工作表并将其移动到最后的位置

我已经有一段时间了,

我想通过复制另一个来创build一个新的工作表。 这将新工作表放置在复印工作表之前。 然后我想把它移到所有表单的最后。

目标是按照该顺序将工作表称为> 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($名称)。移动

编辑:

这是解决scheme:

 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) } 

标记为社区,因为它来自上面的问题。

这是解决scheme:

 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) } 

我可以提出一个更“一般”,也许更快的答案,只是为了拥有它。 只要记住,这是从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") 

其余的只是做一个演示。

你可以用更less的代码来做事情,但这不是很好:

 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([之前],[之后])与选项之前和之后。 在vba中设置的方法是: .copy after:=ASheetObject或者.copy ,aSheetObject

干杯