Создание нового листа Excel с помощью .Copy () и перемещение его на последнюю позицию - PullRequest
8 голосов
/ 01 февраля 2012

Я давно этим занимаюсь,

Я хочу создать новый лист, скопировав другой. Это помещает новый лист перед копируемым листом. Затем я хочу переместить его в самый конец всех листов.

Цель состоит в том, чтобы рабочие листы назывались> 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 () исходного листа «Summary».

Понятия не имею, как объяснить это поведение. Заранее благодарим.

Редактировать: Изменен $ wb.Worksheets.Item ("Сводка"). Перейти к $ wb.Worksheets.Item ($ name). Переместить

Edit:

Вот решение:

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 ]

2 голосов
/ 22 января 2013

Помечено как Сообщество, потому что это из вопроса выше.

Вот решение:

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 голос
/ 26 января 2013

Я могу предложить более «общий» и, возможно, более быстрый ответ, просто ради его получения.Просто имейте в виду, что он от 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 ([до], [после]) с дополнительными параметрами до и после.В VBA способы установки после будут: .copy after:=ASheetObject или .copy ,aSheetObject

ура

...