Coppy dữ liệu nhiều sheet ( theo thứ tự giảm dần) vào 1 sheet cuối cùng!

Liên hệ QC

alias1313

Thành viên hoạt động
Tham gia
7/4/17
Bài viết
163
Được thích
13
Mong cách anh giúp đỡ!
Em có 11 sheet ( 01 - 11). em muốn copy dữ liệu 10 sheet đầu vào sheet11
+ Sheet11 đag chứa dữ liệu ở cột E và G, em muốn dữ liệu copy vào sẽ nối tiếp theo dữ liệu cũ ở cột E và G
+ thứ tự copy giảm dần: sheet10 trước rồi sheet09,sheet08,sheet07,...
+ Em thử viết code nhưng ko chạy đc, em ko hiểu sao dòng: Sheets(j).active bị lỗi
+ Em có đính kèm file
Em cảm ơn các anh!
Mã:
Dim copy1()
dim j
for j = 10 to 1 step -1
Sheets(j).active
lr1 = Cells(Rows.count, "E").End(xlUp).Row
Sheets(j).range("E4:G"& lr1).copy
lr2 = Sheets("11").Cells(Rows.count, "E").End(xlUp).Row
Sheets("11").range("E4"& lr2).PasteSpecial
next j
End sub
 

File đính kèm

  • LayGiaTri - 1.xlsm
    26.7 KB · Đọc: 12
Mong cách anh giúp đỡ!
Em có 11 sheet ( 01 - 11). em muốn copy dữ liệu 10 sheet đầu vào sheet11
+ Sheet11 đag chứa dữ liệu ở cột E và G, em muốn dữ liệu copy vào sẽ nối tiếp theo dữ liệu cũ ở cột E và G
+ thứ tự copy giảm dần: sheet10 trước rồi sheet09,sheet08,sheet07,...
+ Em thử viết code nhưng ko chạy đc, em ko hiểu sao dòng: Sheets(j).active bị lỗi
+ Em có đính kèm file
Em cảm ơn các anh!
Mã:
Dim copy1()
dim j
for j = 10 to 1 step -1
Sheets(j).active
lr1 = Cells(Rows.count, "E").End(xlUp).Row
Sheets(j).range("E4:G"& lr1).copy
lr2 = Sheets("11").Cells(Rows.count, "E").End(xlUp).Row
Sheets("11").range("E4"& lr2).PasteSpecial
next j
End sub
Sheets(j).Activate
 
Upvote 0
Mong cách anh giúp đỡ!
Em có 11 sheet ( 01 - 11). em muốn copy dữ liệu 10 sheet đầu vào sheet11
+ Sheet11 đag chứa dữ liệu ở cột E và G, em muốn dữ liệu copy vào sẽ nối tiếp theo dữ liệu cũ ở cột E và G
+ thứ tự copy giảm dần: sheet10 trước rồi sheet09,sheet08,sheet07,...
+ Em thử viết code nhưng ko chạy đc, em ko hiểu sao dòng: Sheets(j).active bị lỗi
+ Em có đính kèm file
Em cảm ơn các anh!
Mã:
Dim copy1()
dim j
for j = 10 to 1 step -1
Sheets(j).active
lr1 = Cells(Rows.count, "E").End(xlUp).Row
Sheets(j).range("E4:G"& lr1).copy
lr2 = Sheets("11").Cells(Rows.count, "E").End(xlUp).Row
Sheets("11").range("E4"& lr2).PasteSpecial
next j
End sub
Sai 2 chỗ:
1> Sheets(j).Activate chứ không phải là Sheets(j).active
2> Sheets("11").range("E4"& lr2).PasteSpecial <--- chỗ màu đỏ là sai. Phải là Sheets("11").Range("E" & lr2 + 1).PasteSpecial mới đúng
 
Upvote 0
Sai 2 chỗ:
1> Sheets(j).Activate chứ không phải là Sheets(j).active
2> Sheets("11").range("E4"& lr2).PasteSpecial <--- chỗ màu đỏ là sai. Phải là Sheets("11").Range("E" & lr2 + 1).PasteSpecial mới đúng

Em đã sửa rồi nhưng vẫn không đc Thầy ơi! vẫn lỗi ở chỗ: Sheets(j).Activate
kỳ ở chỗ nếu mình thêm mảng: arr = Sheets(j).range("E4:G20").value2 hoặc Debug.Print Sheets(j).Name thì không lỗi!
Sheets("11").Range("E4" & lr2 + 1).PasteSpecial: cũng bị lỗi ạ!

Mong Thầy và các anh giúp đỡ!
Mã:
Sub copy1()
dim j
for j = 10 to 1 step -1
Sheets(j).Active
lr1 = Cells(Rows.count, "E").End(xlUp).Row
Sheets(j).range("E4:G"& lr1).copy
lr2 = Sheets("11").Cells(Rows.count, "E").End(xlUp).Row
Sheets("11").range("E4"& lr2+1).PasteSpecial
next j
End sub
 
Upvote 0
Em đã sửa rồi nhưng vẫn không đc Thầy ơi! vẫn lỗi ở chỗ: Sheets(j).Activate
kỳ ở chỗ nếu mình thêm mảng: arr = Sheets(j).range("E4:G20").value2 hoặc Debug.Print Sheets(j).Name thì không lỗi!
Sheets("11").Range("E4" & lr2 + 1).PasteSpecial: cũng bị lỗi ạ!

Mong Thầy và các anh giúp đỡ!
Mã:
Sub copy1()
dim j
for j = 10 to 1 step -1
Sheets(j).Active
lr1 = Cells(Rows.count, "E").End(xlUp).Row
Sheets(j).range("E4:G"& lr1).copy
lr2 = Sheets("11").Cells(Rows.count, "E").End(xlUp).Row
Sheets("11").range("E4"& lr2+1).PasteSpecial
next j
End sub
1. Code bạn vẫn sai Sheets(j).Active
2. khi PasteSpecial thì bạn muốn paste kiểu gì thì phải thêm kiểu cho nó
Ví dụ: Sheets("11").range("E4"& lr2+1).PasteSpecial XlValues ' dán value

Cái xlvalues mình ko chắc, nhưng bạn cứ gõ xl (ctrl + space) nó sẽ gợi ý là bạn muốn paste cái gì
 
Upvote 0
Em đã sửa rồi nhưng vẫn không đc Thầy ơi! vẫn lỗi ở chỗ: Sheets(j).Activate
kỳ ở chỗ nếu mình thêm mảng: arr = Sheets(j).range("E4:G20").value2 hoặc Debug.Print Sheets(j).Name thì không lỗi!
Sheets("11").Range("E4" & lr2 + 1).PasteSpecial: cũng bị lỗi ạ!

Mong Thầy và các anh giúp đỡ!
Mã:
Sub copy1()
dim j
for j = 10 to 1 step -1
Sheets(j).Active
lr1 = Cells(Rows.count, "E").End(xlUp).Row
Sheets(j).range("E4:G"& lr1).copy
lr2 = Sheets("11").Cells(Rows.count, "E").End(xlUp).Row
Sheets("11").range("E4"& lr2+1).PasteSpecial
next j
End sub
Tôi ghi rõ ở trên rồi còn gì. 2 chỗ sai sao bạn không sửa
Còn không rút gọn code luôn thành vầy đi
Mã:
Sub copy1()
  Dim j As Long
  For j = 10 To 1 Step -1
    Sheets(j).Range("E4:G1000").Copy Sheets("11").Range("E6000").End(xlUp).Offset(1)
  Next j
End Sub
 
Upvote 0
Tôi ghi rõ ở trên rồi còn gì. 2 chỗ sai sao bạn không sửa
Còn không rút gọn code luôn thành vầy đi
Mã:
Sub copy1()
  Dim j As Long
  For j = 10 To 1 Step -1
    Sheets(j).Range("E4:G1000").Copy Sheets("11").Range("E6000").End(xlUp).Offset(1)
  Next j
End Sub
Bác cho em hỏi, tại sao em viết Code phía dưới mà không chạy:
PHP:
Sub Copy_abc()
    Dim i%
    For i = 10 To 1 'Step -1
        Sheets(i).Range("E4:E" & Sheets(i).Range("E65000").End(3).Row).Copy Sheets("11").Range("E" & Range("E6500").End(3).Row + 1)
    Next
End Sub
 
Upvote 0
Bác cho em hỏi, tại sao em viết Code phía dưới mà không chạy:
PHP:
Sub Copy_abc()
    Dim i%
    For i = 10 To 1 'Step -1
        Sheets(i).Range("E4:E" & Sheets(i).Range("E65000").End(3).Row).Copy Sheets("11").Range("E" & Range("E6500").End(3).Row + 1)
    Next
End Sub
Thầy đang thử độ tinh mắt của các trò đây, thầy thừa dấu nháy đơn trước chữ Step.
For i = 10 To 1 'Step -1
 
Upvote 0
Thầy đang thử độ tinh mắt của các trò đây, thầy thừa dấu nháy đơn trước chữ Step.
For i = 10 To 1 'Step -1
Chẳng những vây, thầy còn đang thử độ kiên nhẫn của mình.
Viết code bao nhiêu năm rồi mà còn hỏi trổng 1 câu "sao không chạy".

@chủ thớt: code trên là code nguy hiểm. Gặp đúng tình huống, nó có thể copy chồng lên sheet kết quả.
Gợi ý:
1. lúc duyệt qua sheets collection, phải có code xét để chừa cái sheet kết quả ra
2. sheets collection có thể bao gồm cả chart sheet. Làm việc cẩn thận thì nên dùng worksheets
 
Upvote 0
Thầy đang thử độ tinh mắt của các trò đây, thầy thừa dấu nháy đơn trước chữ Step.
For i = 10 To 1 'Step -1
Như bạn biết đấy, đối với vòng lặp For....Next, nếu bước nhảy là +/-1, thì người ta có thể bỏ đoạn"Step +/-1" đi.
Và từ trước đến giờ trong code, tôi toàn cắt đoạn đó đi, Code vẫn chạy bình thường.
Nhưng riêng bài toán này, khi tôi bỏ "Step -1" đi, thì Code lại không chạy, đó mới là vấn đề tôi cần hỏi.
Bài đã được tự động gộp:

Chẳng những vây, thầy còn đang thử độ kiên nhẫn của mình.
Viết code bao nhiêu năm rồi mà còn hỏi trổng 1 câu "sao không chạy".
Không phải vậy bác ơi, oan cho em quá!
 
Upvote 0
Nhưng riêng bài toán này, khi tôi bỏ "Step -1" đi, thì Code lại không chạy, đó mới là vấn đề tôi cần hỏi.
Không biết thì có thể thí nghiệm:
Mã:
Sub Test()
  Dim n As Long
  For n = 5 To 2
    MsgBox n
  Next
End Sub
Tự rút ra kết luận rồi tự an ủi mình rằng: "Đó là cú pháp phải thuộc lòng"
 
Upvote 0
Như bạn biết đấy, đối với vòng lặp For....Next, nếu bước nhảy là +/-1, thì người ta có thể bỏ đoạn"Step +/-1" đi.
Và từ trước đến giờ trong code, tôi toàn cắt đoạn đó đi, Code vẫn chạy bình thường.
Nhưng riêng bài toán này, khi tôi bỏ "Step -1" đi, thì Code lại không chạy, đó mới là vấn đề tôi cần hỏi.
Cú pháp của For là
For (biến vòng lặp) = (trị khởi đầu) To (trị giới hạn) [step (trị bước vòng lặp)]
Khi phần trong ngoặc vuông không có thì (trị bước vòng lặp) được mặc định là 1
Tôi không tin là khi (trị khởi đầu) > (trị giới hạn) thì trị bước có thể hiểu ngầm là -1. Bởi vì như vậy sẽ làm việc kiểm soát code khùng luôn.

Chú: tuy nói vậy, tôi cũng nhìn nhận VBA là một ngôn ngữ khá "bất cần chuẩn". Nếu bạn tìm được đoạn code nào nó làm như vậy thì tôi sẵn sàng chịu mình sai.
 
Upvote 0
Tôi ghi rõ ở trên rồi còn gì. 2 chỗ sai sao bạn không sửa
Còn không rút gọn code luôn thành vầy đi
Mã:
Sub copy1()
  Dim j As Long
  For j = 10 To 1 Step -1
    Sheets(j).Range("E4:G1000").Copy Sheets("11").Range("E6000").End(xlUp).Offset(1)
  Next j
End Sub
Code này quả thật rất ảo diệu! Em cứ nghĩ phải xác định: lr, thì ra vẫn còn kiểu offset ngược!
Em cảm ơn Thầy rất nhiều!
Bài đã được tự động gộp:

1. Code bạn vẫn sai Sheets(j).Active
2. khi PasteSpecial thì bạn muốn paste kiểu gì thì phải thêm kiểu cho nó
Ví dụ: Sheets("11").range("E4"& lr2+1).PasteSpecial XlValues ' dán value

Cái xlvalues mình ko chắc, nhưng bạn cứ gõ xl (ctrl + space) nó sẽ gợi ý là bạn muốn paste cái gì

Cảm ơn anh!
Đây là code hoàn chỉnh em đã sửa và chạy đúng!
Mã:
Sub CopPy1() 'chay tot


Dim j
For j = 10 To 1 Step -1
Worksheets(j).Activate
lr1 = Cells(Rows.Count, "E").End(xlUp).Row
Worksheets(j).Range("E4:G" & lr1).Copy
lr2 = ThisWorkbook.Sheets("11").Cells(Rows.Count, "E").End(xlUp).Row
ThisWorkbook.Sheets("11").Range("E" & lr2 + 1).PasteSpecial
Next j
End Sub
 
Upvote 0
Code này quả thật rất ảo diệu! Em cứ nghĩ phải xác định: lr, thì ra vẫn còn kiểu offset ngược!
Em cảm ơn Thầy rất nhiều!
Bài đã được tự động gộp:



Cảm ơn anh!
Đây là code hoàn chỉnh em đã sửa và chạy đúng!
Mã:
Sub CopPy1() 'chay tot


Dim j
For j = 10 To 1 Step -1
Worksheets(j).Activate
lr1 = Cells(Rows.Count, "E").End(xlUp).Row
Worksheets(j).Range("E4:G" & lr1).Copy
lr2 = ThisWorkbook.Sheets("11").Cells(Rows.Count, "E").End(xlUp).Row
ThisWorkbook.Sheets("11").Range("E" & lr2 + 1).PasteSpecial
Next j
End Sub
Để cải tiến thêm chút nữa thì bạn chỉ xác định lr2 =end(xlup) lần đầu tiên. Những lần sau tăng lr2 thêm lr1-3 là số dòng vừa copy vào.
 
Upvote 0
Để cải tiến thêm chút nữa thì bạn chỉ xác định lr2 =end(xlup) lần đầu tiên. Những lần sau tăng lr2 thêm lr1-3 là số dòng vừa copy vào.

Em hiểu là những lần sau thì: lr2_sau = lr2_dautien + lr1
Nhưng em không thể thay biến lr2 trong code - để có thể chạy hợp lý:
ThisWorkbook.Sheets("11").Range("E" & lr2 + 1).PasteSpecial
Mong anh chỉ thêm!
 
Upvote 0
Em hiểu là những lần sau thì: lr2_sau = lr2_dautien + lr1
Nhưng em không thể thay biến lr2 trong code - để có thể chạy hợp lý:
ThisWorkbook.Sheets("11").Range("E" & lr2 + 1).PasteSpecial
Mong anh chỉ thêm!
Lr2 đầu tiên bạn tính trước khi vào vòng lặp for. Mỗi lần lặp, bạn copy từ dòng 4 đến lr1 nên lr2=lr2+lr1-3
 
Upvote 0
Em hiểu là những lần sau thì: lr2_sau = lr2_dautien + lr1
Nhưng em không thể thay biến lr2 trong code - để có thể chạy hợp lý:
ThisWorkbook.Sheets("11").Range("E" & lr2 + 1).PasteSpecial
Mong anh chỉ thêm!
Copy - Paste 10 lần sao không đưa tất cả vào 1 mảng và ghi vào sheets("11") 1 lần?
 
Upvote 0
Copy - Paste 10 lần sao không đưa tất cả vào 1 mảng và ghi vào sheets("11") 1 lần?
Em nghĩ tác giả viết chơi thôi. Dùng mảng tác dụng tốt khi mỗi sheet có khoảng vài nghìn dòng, nếu mỗi sheet vài trăm dòng thì tốc độ không hơn mấy mà mất công viết code, nếu mỗi sheet có vài chục nghìn dòng trở lên thì dùng mảng dễ thất bại. Vì vậy dùng copy paste an toàn trong trường hợp tổng quát hơn.
 
Upvote 0
Web KT
Back
Top Bottom