2012-10-24 14 views
10

Tôi đang cố gắng chạy một macro duy nhất thực hiện các chức năng trên nhiều trang tính. Giả sử tôi đã gán nút macro trên trang tính 4. Tôi đã liệt kê các hàm tôi muốn thực hiện từng bước:VBA Macro trên nhiều trang tính

1) Chọn một số ô trong trang tính 4 và sao chép vào ô liền kề trong trang tính 4.
2) Xóa phạm vi ô trong trang tính 3.
3) Dải ô CUT trong trang tính 2 sau đó dán dải ô này vào trang tính 3.
4) Lấy phạm vi ô từ sổ làm việc riêng và sao chép vào trang tính 2. (I biết đây là vấn đề hoàn toàn khác vì sổ làm việc được tự động xuất bản và tôi sẽ phải tìm cách liên kết hai.)
5) Cập nhật bảng tổng hợp nằm trong Bảng tính 4 và Trang tính 3.

Tôi rất muốn được trợ giúp về 3 chức năng đầu tiên trong số này. Tôi đã dán mã hiện tại của mình bên dưới.

Sub START() 

Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
Dim sh3 As Worksheet 
Dim sh4 As Worksheet 

Set sh1 = ActiveWorkbook.Sheets("Brand") 
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek") 
Set sh3 = ActiveWorkbook.Sheets("PriorWeek") 
Set sh4 = ActiveWorkbook.Sheets("Pivot") 

sh4.Range("B29:B30").Select 
Selection.Copy 

sh4.Range("C29").Select 
ActiveSheet.Paste 

sh3.Range("A4:AC1000").Select 
Selection.Delete 

sh2.Range("A4:AC1000").Select 
Selection.Copy 

sh3.Range("A4").Select 
ActiveSheet.Paste 

End Sub 

Nó hoạt động ... nhưng nó chỉ hoạt động khi tôi ở đúng trang tính để thực hiện một chức năng cụ thể.

+1

Thay vì các tên biến không đọc được như 'sh1',' sh2' v.v ... tại sao không gọi chúng là cái gì hữu ích và minh bạch như 'shtBrand',' shtCurrentWeek' v.v. Một người làm việc thực hiện chính xác công việc kinh doanh 'sh1' 'sh2' này và nó khiến mọi người trở nên điên rồ khi chúng tôi cố đọc mã của anh ấy. –

+0

@ Jean-FrançoisCorbett Vâng, đó thực sự là một ý tưởng hay. Lý do tôi không làm điều này lúc đầu là bởi vì trong kinh doanh của tôi, không ai biết cách viết mã. Nhiệm vụ này tôi đang cố gắng để tự động hóa đã được thực hiện bằng tay trong khoảng 2-3 năm. Đó là vô lý, nhưng đó là một ý tưởng tuyệt vời! Cảm ơn bạn. – kmiao91

Trả lời

12

Bằng cách loại bỏ các select, các selectionactivesheet, bạn sẽ có thể để làm cho tấm độc lập này

Sub START() 

Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
Dim sh3 As Worksheet 
Dim sh4 As Worksheet 

Set sh1 = ActiveWorkbook.Sheets("Brand") 
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek") 
Set sh3 = ActiveWorkbook.Sheets("PriorWeek") 
Set sh4 = ActiveWorkbook.Sheets("Pivot") 

sh4.Range("B29:B30").Copy sh4.Range("C29") 

sh3.Range("A4:AC1000").Delete 

sh2.Range("A4:AC1000").Copy sh3.Range("A4") 

End Sub 
+0

Tôi ước tôi có thể upvote bạn. CẢM ƠN BẠN. – kmiao91

+0

Tôi tin rằng bạn có thể bây giờ. – nutsch

5

Bạn đang có một khởi đầu tuyệt vời. Chỉ cần ít tinh tế hơn và bạn sẽ có nó.

Về cơ bản, không cần phải .Select phạm vi của bạn (trang tính, sổ làm việc, v.v.), ít nhất trong trường hợp này. Bạn có thể làm việc trực tiếp với họ và bằng cách sử dụng nguồn cung cấp Copy nơi họ sẽ được sao chép.

Xem mã bên dưới:

Sub START() 

Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
Dim sh3 As Worksheet 
Dim sh4 As Worksheet 
Dim wkb As Workbook 

Set wkb = Workbooks("wkbName") '-> best to call workbooks by name, as opposed to "ActiveWorkbook", also best to set it to object 

With wkb '-> now we can work with this object directly and succinctly 

    Set sh1 = .Sheets("Brand") 
    Set sh2 = .Sheets("CurrentWeek") 
    Set sh3 = .Sheets("PriorWeek") 
    Set sh4 = .Sheets("Pivot") 

    sh4.Range("B29:B30").Copy sh4.Range("C29") 

    'sh3.Range("A4:AC1000").Delete -> you don't need this if you are overwritting it 

    sh2.Range("A4:AC1000").Copy sh3.Range("A4") 

End With 

End Sub 
+0

Tại sao cần phải giết các biến? – mattboy

+1

@Mattboy -> cách tốt nhất là đưa chúng ra khỏi bộ nhớ. Đối với bit nhỏ của mã, không phải là một việc lớn, nhưng nó có thể giúp khi bạn có các dự án mã lớn. –

+0

Họ bị giết khi bạn rời khỏi phụ dù sao, nhưng như Scott nói, nó không phải là một thói quen xấu để có khi bạn thực sự cần nó. – nutsch

-2
Sub START() 

Sheet("Pivot").Range("B29:B30").Copy Sheet("Pivot").Range("C29") 
Sheet("CurrentWeek").Range("A4:AC1000").Copy Sheet("PriorWeek").Range("A4") 

End Sub 
+4

-1 Điểm quan trọng trong việc đăng những gì về bản chất là một phần của câu trả lời đã được chấp nhận? –

0

tờ ("name1 ") .range (" B29: B30 ") sao chép Đích: = trang tính (" tên2 "). phạm vi (" C29 ")

Sẽ sao chép từ trang này sang trang khác, giả sử tên trang tính là name1 và name2