2011-12-19 26 views
5

Tôi đang cố giải quyết một vấn đề tương đối đơn giản nhưng tôi không thể nhận ra nó. Mục đích của tôi là sao chép một phạm vi ô trong một trang tính của Ứng dụng Excel chính sang một phạm vi khác (có cùng kích thước) trong một trang tính của Ứng dụng Excel mới được tạo thứ hai. Tôi tạo Ứng dụng thứ hai bằng cách sử dụngVB: Sao chép một phạm vi sang một ứng dụng Excel khác

Set secondExApp = CreateObject("Excel.Application") 

Tôi đang sử dụng tham chiếu này để xử lý thêm. Cho đến bây giờ tôi đã thử hai cách khác nhau. Cả hai đều không hoạt động đúng.

0 .: Chuẩn bị/Giới thiệu

Set srcWb = Application.ActiveWorkbook 
Set srcSheet = srcWb.Worksheets("example") 

Set dstApp = CreateObject("Excel.Application") 
Set dstWb = dstApp.Workbooks(1) 
Set dstSheet = dstWb.Worksheets(1) 

1 .: PasteSpecial - cung cấp một hình ảnh thay vì chỉ khoảng

srcSheet.Range("A1:B2").Copy 
dstSheet.Range("A1:B2").PasteSpecial xlPasteAll 

2 .: Range.Copy [Destination (!) ] - không hoạt động - Có phải tôi chỉ có thể sử dụng phương pháp này cho các trang tính trong cùng một ứng dụng không?

srcSheet.Range(srcSheet.Cells(..., ...), srcSheet.Cells(..., ...)).Copy _ 
dstSheet.Range(dstSheet.Cells(..., ...), dstSheet.Cells(..., ...)) 

Mọi trợ giúp đều được đánh giá cao.


Sửa: Tôi đã chơi với "kỷ lục vĩ mô" chức năng nhưng tôi thích mã hóa nó trên của riêng tôi mà không "chọn" hoặc "kích hoạt" tế bào/tờ/vv


Sửa (giải quyết): Cảm ơn bạn cả GSerg và iDevlop rất nhiều, bạn cung cấp một điểm khởi đầu hơn nữa tốt cho tôi. Tôi đã làm một số nghiên cứu như xa như các hằng số Excel như xlClipboardFormatDspText có liên quan.

Điều gì thực sự giúp tôi là việc mở một phiên bản Excel mới sẽ thay đổi menu Dán (Đặc biệt).

Vì vậy, thay vì tạo một trường hợp mới, tôi chỉ cần thêm một sổ làm việc (có thể ẩn) và sử dụng đối tượng này để thêm nội dung của tôi. Vì nó được giữ trong cùng một thể hiện (cũng có một cái nhìn tại trình quản lý tác vụ), menu Paste (Special) hoàn toàn giống nhau.

Bây giờ, bạn có thể sử dụng Range.Copy [destination] ngay cả khi không chọn!

quả:

'Hides the new workbook 
Application.ScreenUpdating = False 

Set dstWb = Workbooks.Add 
Set dstSheet = dstWb.Worksheets(1) 

srcSheet.Range(srcSheet.Cells(..., ...), srcSheet.Cells(..., ...)).Copy 
dstSheet.Paste dstSheet.Range(dstSheet.Cells(..., ...), dstSheet.Cells(..., ...)) 

'Avoids the often seen dashed border around the copied range 
Application.CutCopyMode = False 

'Setting the initial change back 
Application.ScreenUpdating = True 

phần mềm: Excel 2007

+0

Tại sao lại sử dụng ứng dụng Excel thứ hai thay vì một sổ làm việc khác trong cùng một phiên bản Excel? Tiền thưởng duy nhất tôi có thể thấy là tận dụng bộ xử lý lõi kép để tính toán rất lớn. Nhưng nó sẽ chậm hơn nếu bạn không cần điều đó. –

+0

@iDevlop Vui nhộn. Tôi chỉ đọc bình luận của bạn sau khi tôi phát hiện ra bản thân mình. Nhận xét rất hữu ích! – Mic

Trả lời

4

Như được xác định bằng cách chọc Excel với một cây gậy, bạn phải sử dụng Worksheet.Paste cho liên excel thứ:

srcSheet.Range("A1:B2").Copy 
dstSheet.Paste dstSheet.Range("A1") 

chọc Excel với một cây gậy dày tiết lộ rằng công thức được bảo quản khi dán từ Clipboard như xlClipboardFormatDspText:

srcSheet.Range("A1:B2").Copy 
dstSheet.Range("A1").Select 
dstSheet.PasteSpecial xlClipboardFormatDspText, False 

Tuy nhiên, điều này không đòi hỏi phải chọn một ô trên dstSheet đầu tiên, bởi vì Worksheet.PasteSpecial sử dụng tế bào hoạt động.

+0

Cảm ơn bạn GSerg! Điều này làm việc tốt ngoại trừ thực tế là ** công thức ** không được truyền đi. Có cách nào để bao gồm công thức không? Và tại sao phương pháp PasteSpecial không hoạt động? – Mic

+0

@Mic Nó hoạt động nhưng không sử dụng định dạng bạn muốn. Xem chỉnh sửa của tôi. – GSerg

+0

@Mic Ok, một chỉnh sửa khác. Dường như làm việc. – GSerg

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