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

时间:2012-02-01 10:30:52

标签: excel powershell copy position move

我已经有一段时间了,

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

目标是将工作表称为> 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方法之后,除了.Activate()原始的“摘要”工作表之外,它不会做任何事情。

我不知道如何解释这种行为..谢谢你提前。

编辑:更改了$ wb.Worksheets.Item(“摘要”)。移至$ wb.Worksheets.Item($ name)。移动

编辑:

以下是解决方案:

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

2 个答案:

答案 0 :(得分: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)      
}

答案 1 :(得分: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中,设置之后的方法是:.copy after:=ASheetObject.copy ,aSheetObject

欢呼声