2012-02-01 9 views
7

Sono stato a questo per un bel po ',Creazione di un nuovo foglio di lavoro Excel tramite .copy() e spostandolo verso l'ultima posizione

voglio creare un nuovo foglio di lavoro copiando un'altra. Questo posiziona il nuovo foglio prima che il foglio venga copiato. Poi voglio spostarlo fino alla fine di tutti i fogli.

L'obiettivo è quello di avere i fogli di lavoro chiamati> Sommario1> summary2> summary3 .. ecc in questo ordine

Ecco quello che ho (scusa brevità)

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

Si lavora per il primo foglio, rinomina il foglio, quindi lo sposta fino alla fine, ma dopo di che, ogni volta che raggiunge il metodo .Move, non fa nulla se non. Attiva() il foglio "Riepilogo" originale.

Non ho idea di come spiegare questo comportamento .. Grazie gentilmente in anticipo.

Edit:. Cambiato $ wb.Worksheets.Item ("Sommario") Spostare a $ wb.Worksheets.Item ($ name) .Portare

Edit:

ecco la soluzione:

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

Benvenuti a StackOverflow, si ricorda che è possibile rispondere voi stessa domanda e non solo la modifica di esso (lo è ancora di [altamente consigliato] (http: //meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking)) e accettarlo. In questo modo, puoi condividere le tue conoscenze con la comunità e tipo di * chiudere * la domanda - grazie per la comunità. – JMax

risposta

2

Contrassegnato come comunità perché proviene dalla domanda precedente.

ecco la soluzione:

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

posso proporre una risposta più "generale" e, eventualmente, più veloce, solo per il gusto di averlo. Basti pensare che proviene da VBA e necessiterà di piccole modifiche per essere eseguito nello stesso ambiente della domanda.

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 

ovviamente quello che potrebbe interessarti sono:

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

e il resto sono solo per fare una demo in esecuzione.

si potrebbe fare le cose con ancora meno codice, ma non è così bello:

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

quindi credo (ma non possibile confermare) il codice può essere scritto come:

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 
} 

è sufficiente notare che la sintassi della copia è: .copy ([before], [after]) con optionals sia prima che dopo. In VBA i modi per impostare dopo sarebbero: .copy after:=ASheetObject o .copy ,aSheetObject

applausi

Problemi correlati