2012-02-01 11 views
7

byłem na to za jakiś czas,Tworzenie nowego arkusza programu Excel za pośrednictwem .Copy() i przesuwając go do ostatniej pozycji

Chcę utworzyć nowy arkusz przez skopiowanie innego. Spowoduje to umieszczenie nowego arkusza przed skopiowaniem arkusza. Następnie chcę przenieść go na sam koniec wszystkich arkuszy.

Celem jest, aby arkusze zwanych> summary1> summary2> summary3 .. itp w tej kolejności

Oto co mam (pretekst zwięzłość)

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

To działa dla pierwszego arkusza, zmienia nazwę arkusza, a następnie przesuwa go do końca, ale za każdym razem, gdy osiągnie metodę .Move, nie robi niczego poza .Activate() oryginalnym arkuszem "Summary".

Nie mam pojęcia, jak wytłumaczyć to zachowanie .. Dziękuję z góry.

Edit. Zmieniono $ wb.Worksheets.Item ("Podsumowanie") Przenieś do $ wb.Worksheets.Item ($ name) .Doprowadzić

Edit:

Oto rozwiązanie:

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

Witamy StackOverflow, należy pamiętać, że można odpowiedzieć Ci własne pytanie, a nie tylko jego edycji (to nawet [wysoce zalecane] (http: //meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the -answer-before-asking)) i zaakceptuj to. W ten sposób możesz podzielić się swoją wiedzą ze społecznością i rodzaju * zamknąć * pytanie - dzięki dla społeczności. – JMax

Odpowiedz

2

Oznaczono jako wspólnotowy, ponieważ pochodzi z powyższego pytania.

Oto rozwiązanie:

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

mogę zaproponować więcej „ogólne” i ewentualnie szybszą odpowiedź, właśnie ze względu na mające go. Po prostu pamiętaj, że pochodzi on z VBA i będzie wymagał drobnych modyfikacji, aby działały w tym samym środowisku co twoje pytanie.

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 

oczywiście co może zainteresować jesteś:

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

a reszta to po prostu zrobić z systemem demo.

można dokonać rzeczy jeszcze mniej kodu, ale to nie jest tak miły:

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

tak myślę (ale nie może potwierdzić) swój kod może być napisany tak:

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 
} 

zauważ, że składnia kopii to: .copy ([przed], [po]) z opcjami przed i po. W VBA sposoby, aby ustawić po byłoby: .copy after:=ASheetObject lub .copy ,aSheetObject

okrzyki

Powiązane problemy