2012-02-01 91 views
7

Tôi đã ở đây một thời gian,Tạo bảng tính excel mới qua .Copy() và di chuyển nó đến vị trí cuối cùng

Tôi muốn tạo trang tính mới bằng cách sao chép một trang tính khác. Điều này đặt trang tính mới trước khi trang tính được sao chép. Sau đó tôi muốn di chuyển nó đến cuối của tất cả các tờ.

Mục đích là để có bảng gọi> summary1> summary2> summary3 .. vv theo thứ tự mà

Dưới đây là những gì tôi có (lý do ngắn gọn)

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

Nó hoạt động cho tấm đầu tiên, nó đổi tên trang tính sau đó di chuyển nó đến cuối nhưng sau đó mọi lúc nó đạt đến phương thức .Move nó không làm bất cứ điều gì ngoại trừ .Activate() bản gốc "Tóm tắt" tờ.

Tôi không biết cách giải thích hành vi này .. Xin cảm ơn trước.

Edit:. Thay đổi $ wb.Worksheets.Item ("Tóm tắt") Di chuyển đến $ wb.Worksheets.Item ($ name) .Move

Edit:

Dưới đây là giải pháp:

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

Chào mừng bạn đến stackoverflow, xin lưu ý rằng bạn có thể trả lời bạn câu hỏi của riêng và không chỉ chỉnh sửa nó (nó thậm chí còn [rất khuyến khích] (http: //meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking)) và chấp nhận nó. Bằng cách này, bạn có thể chia sẻ kiến ​​thức của bạn với cộng đồng và loại * đóng * câu hỏi - cảm ơn cộng đồng. – JMax

Trả lời

2

Được đánh dấu là Cộng đồng vì nó là từ câu hỏi trên.

Dưới đây là giải pháp:

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

tôi có thể đưa ra một câu trả lời nhiều hơn "chung" và có thể nhanh hơn, chỉ vì lợi ích của việc có nó. Chỉ cần nhớ rằng nó là từ VBA và sẽ cần sửa đổi nhỏ để chạy trong cùng một môi trường như câu hỏi của bạn.

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 

rõ ràng những gì có thể bạn quan tâm là:

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

và phần còn lại chỉ là để tạo ra một bản demo chạy.

bạn có thể làm mọi thứ với mã thậm chí ít hơn, nhưng nó không phải là quá đẹp:

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

vì vậy tôi đoán (nhưng không thể xác nhận) mã của bạn có thể được viết như sau:

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 
} 

chỉ cần chú ý rằng cú pháp sao chép là: .copy ([trước], [sau]) với cả hai tùy chọn trước và sau. Trong VBA trong những cách để thiết lập sau sẽ là: .copy after:=ASheetObject hoặc .copy ,aSheetObject

cổ vũ

Các vấn đề liên quan