Code tăng tốc độ tạo sheet chi tiết. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

phuyen89

Thành viên tích cực
Tham gia
20/11/08
Bài viết
875
Được thích
341
Nghề nghiệp
Student
- Chào anh chị diễn đàn.
- Nhờ sự giúp đỡ của anh quanghai mà em có thể đấy nhanh quá trình làm công nợ của đơn vị.
Nhưng với sự lớn dần của dữ liệu, làm cho code trở nên ì ạch trước khối dữ liệu đó.
Cho nên hôm nay em upload File này mong mọi người cải tiền giùm em những nhược điểm sau:
- Tăng tốc độ đối với việc tạo sheet.
- Nhờ viết Code tìm kiếm tên Sheet ( cái này em search nhưng chưa thấy)
http://www.mediafire.com/?r2p4pgd7o7ccbex
Xin cảm ơn mọi người!
 
Góp ý:
1. Bạn thêm
Application.ScreenUpdating = False
Application.Calculation = xlManual
ở đầu Sub và
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
ở cuối Sub.
2.Các sheet DLKT1 và DLNH1 bạn nên tạo Sub để tổng hợp dữ liệu theo điều kiện của bạn chứ dùng hàm như thể sẽ tăng vùng dữ liệu trống không cần thiết.Lúc đó sẽ gây chậm khi xử lý trên những CELL không có dữ liệu
 
Upvote 0
Chào Bác. Rất cảm ơn.
Riêng ý 2: Mình chỉ biết dùng hàm đó thôi, chứ chưa biết cách dùng VBA đâu.
Thực ra điều kiến lấy của mình cũng đơn giản.Do mình dùng hàm Index kết hợp với match đó. Cho nên mình chỉ lấy những dòng có mang số 1,2,3... và Sổ theo từng cột thôi.
- Bác VBA khá hãy giúp em tối ưu công đoạn này nhé. Biết là Công thức làm chậm tốc độ bảng tính, nhưng chưa có cách hay nên vẫn cứ dùng tạm thay cho thủ công đó.
 
Upvote 0
Có sư phụ nào ghé qua, giúp giùm em với!
 
Upvote 0
code rất gọn, nhẹ nhàng (bạn QuangHai viết thì còn fải nói).
data cũng ko lớn, vậy mà chạy ko nổi.

mình chỉ thấy vậy, trong code của bạn có một cái form đăng nhập (uf)
khi chạy đoạn code copy nó liên tục tạo ra cái form uf (có fai là hết hạn sử dụng ko bạn?...hì hì)
mình kiểm tra xem chổ nào kích hoạt nó, mà tìm ko ra
bạn QuanhHai viết cho bạn chắc phải cầu cứu bạn ấy thui...bó tay
 
Upvote 0
sorry, làm spam một chút, vì cũng thấy thắc mắt quá
về đoạn code này (vì thấy bạn nói là do sư phụ QuangHai viết nên mình cũng ko xem kỹ)

Private Sub cmdChay_Click()
Application.ScreenUpdating = False
Dim r As Integer
For r = 9 To [B5000].End(xlUp).Row
Sheets("SCT").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = Cells(r, 2)
Next
Application.ScreenUpdating = True
End Sub

số màu đỏ đó là 250 vậy nó lặp tới 241 lần và tạo ra 241 sheet, sao mà ko lâu cho được.
 
Upvote 0
sorry, làm spam một chút, vì cũng thấy thắc mắt quá
về đoạn code này (vì thấy bạn nói là do sư phụ QuangHai viết nên mình cũng ko xem kỹ)

Private Sub cmdChay_Click()
Application.ScreenUpdating = False
Dim r As Integer
For r = 9 To [B5000].End(xlUp).Row
Sheets("SCT").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = Cells(r, 2)
Next
Application.ScreenUpdating = True
End Sub

số màu đỏ đó là 250 vậy nó lặp tới 241 lần và tạo ra 241 sheet, sao mà ko lâu cho được.

Vậy để cho nó nhanh, mình giới hạn lại con số B5000 thành ít hơn hả bạn. Mà sao bạn cho rằng khoảng đó là con số 250 mà không phải là một con số khác.
- Do mình chỉ nghĩ thuật toán là:
Nó sẽ chạy từ R=9 và chèn một sheet mới sau cái Sheet SCT này.
Và nhờ
ActiveSheet.Name = Cells(r, 2)

nó sẽ đổi tên giùm mình.Thế mà rất chậm mới lạ chứ.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy để cho nó nhanh, mình giới hạn lại con số B5000 thành ít hơn hả bạn. Mà sao bạn cho rằng khoảng đó là con số 250 mà không phải là một con số khác.
- Do mình chỉ nghĩ thuật toán là:
Nó sẽ chạy từ R=9 và chèn một sheet mới có tên tại vị trị B9 và lấy dữ liệu qua thôi.
Cứ như thế cho đến hết cột B thôi hà.

bạn kiểm tra bằng cach này

Private Sub cmdChay_Click()
Application.ScreenUpdating = False
Dim r As Integer
'For r = 9 To [B5000].End(xlUp).Row
'Sheets("SCT").Copy After:=Sheets(Sheets.Count)
'ActiveSheet.Name = Cells(r, 2)
'Next
MsgBox "" & [B5000].End(xlUp).Row
Application.ScreenUpdating = True
End Sub

bạn sẻ thấy nó ra số 252 (sorry 252 chứ ko fải 250)
dòng lệnh này [B5000].End(xlUp).Row, đáng lẻ nó sẻ dò đến cell cuối cùng chứa dữ liệu trong cột B (lấy mốc là B5000), như vậy đáng lẻ nó sẻ ra số 900 (ko nhớ chính xác, cell cuối cùng ở cột B có dữ liệu). nhưng nó lại ra 252 (cái này mình cũng ko hiểu)
đoạn lệnh của bạn có nghĩa là nó sẻ lặp lại từ hàng thứ 9 cho đến hàng cuối cùng có dữ liệu trong cột B.
mỗi lần như vậy nó tạo ra một sheet mới với tên ở cell (r,2).
bạn thử bỏ đi cái vòng lặp for xem sao?
 
Upvote 0
Vậy để cho nó nhanh, mình giới hạn lại con số B5000 thành ít hơn hả bạn. Mà sao bạn cho rằng khoảng đó là con số 250 mà không phải là một con số khác.
- Do mình chỉ nghĩ thuật toán là:
Nó sẽ chạy từ R=9 và chèn một sheet mới sau cái Sheet SCT này.
Và nhờ
ActiveSheet.Name = Cells(r, 2)

nó sẽ đổi tên giùm mình.Thế mà rất chậm mới lạ chứ.
Code không có vấn đề gì đâu. Cho dù là 5.000 hay 50.000 cũng giống nhau vì có cú pháp (Xlup).row
Vấn đề ở chổ tại sao phải nhân bản lên cùng lúc hơn 250 sheets, rồi làm gì với 250 sheets đó. Tại sao không nghĩ theo hướng khác. Cần làm việc với sheet nào thì nhân bản sheet đó thôi. Mình gợi ý thế, bạn tự cân nhắc nhé

To bạn NhapMon:
Hỏng biết sao bạn có cái số 900 nhỉ? Cái code đó bạn í đặt trong sheet BTH2012 thì đương nhiên nó dò tới dòng 252 thì dừng lại rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
ah quên, cứ tưởng là nó ở sheet "SCT".
tks
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom