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

8

我已经做了相当长时间了,

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

目标是按照顺序命名工作表> 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"方法时,它不执行任何操作,只激活原始的“Summary”表格。

我不知道如何解释这种行为。非常感谢您的帮助。

编辑:将$wb.Worksheets.Item("Summary").Move更改为$wb.Worksheets.Item($name).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
欢迎来到Stack Overflow,请注意您可以回答自己的问题,而不仅仅是编辑它(这甚至是强烈推荐的),并接受它。这样,您可以与社区分享您的知识,并且可以“关闭”问题 - 感谢社区。 - JMax
2个回答

3

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

以下是解决方案:

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

1
我可以提供一个更“通用”的、可能更快的答案,只是为了有个参考。请注意,这是来自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([before],[after]),均为可选项。在vba中设置after的方式可以是:.copy after:=ASheetObject.copy ,aSheetObject 干杯

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接