Xóa các hàng trong các table, code chạy rất chậm, Làm sao để chạy nhanh hơn?

Liên hệ QC

phamvandunghp84

Thành viên thường trực
Tham gia
5/3/20
Bài viết
241
Được thích
12
Tôi dùng code này để xóa các hàng trong các table nhưng chạy rất chậm mỗi lần chạy cần cả một ngày ( có 350 table, mỗi table có rất nhiều hàng), Vậy phải làm thế nào để xóa các hàng trong table chỉ giữ lại 2 hàng đầu mà code chạy được nhanh? mong mọi người chỉ giáo, Chân thành cảm ơn!

Sub ShrinkTable_All() ' xóa tu hang cuoi giu hai hai hang tren cung, tat ca cac table
Dim i As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With ThisWorkbook.Worksheets("Data") 'Update Sheet Name
If .ListObjects.Count > 0 Then
For i = 1 To 350
With .ListObjects(i)
While .ListRows.Count > 2 'Delete last row until first
.ListRows(.ListRows.Count).Delete
Wend
End With
Next i
End If
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
end sub
 
Lần chỉnh sửa cuối:
350 table (chứ không phải taple như bạn viết) ở trong cùng sheet Data hả bạn? Tôi thấy code chỉ duyệt sheet Data từ 1 => 350 ListObject. Sao lại dồn chừng ấy table trong 1 sheet? Rồi 350 table x 9000 dòng/table = 3.150.000 dòng => một sheet chỉ 1.048.576 dòng chứ đâu có nhiều dòng đến vậy.

Vấn đề quan trọng là code bài #1 xóa từng dòng trên trang tính, trong khi tổng số dòng phải xóa là 350 x 9000 - 350 x 2 = 3.149.300 thì chạy cả ngày mới xong là đúng rồi.
 
Lần chỉnh sửa cuối:
350 table (chứ không phải taple như bạn viết) ở trong cùng sheet Data hả bạn? Tôi thấy code chỉ duyệt sheet Data từ 1 => 350 ListObject. Sao lại dồn chừng ấy table trong 1 sheet? Rồi 350 table x 9000 dòng/table = 3.150.000 dòng => một sheet chỉ 1.048.576 dòng chứ đâu có nhiều dòng đến vậy.

Vấn đề quan trọng là code bài #1 xóa từng dòng trên trang tính, trong khi tổng số dòng phải xóa là 350 x 9000 - 350 x 2 = 3.149.300 thì chạy cả ngày mới xong là đúng rồi.
đúng rồi bạn, là 350 table ở trong cùng một sheet. table nhiều thì 9000 hàng, có table thì ít hàng hơn. Mình không biết làm thế nào để xóa các hàng trong các table (chỉ giữ lại 2 hàng đầu ) cho nhanh bạn ạ, bạn có phương án nào cho mình với?
 
đúng rồi bạn, là 350 table ở trong cùng một sheet. table nhiều thì 9000 hàng, có table thì ít hàng hơn. Mình không biết làm thế nào để xóa các hàng trong các table (chỉ giữ lại 2 hàng đầu ) cho nhanh bạn ạ, bạn có phương án nào cho mình với?
Chung 1 sheet nhưng có khi nào table ngang dòng với table kia không. Rất quan trọng đấy vì nếu 2 table ở ngang dòng thì khi code xoá cả dòng Excel thì sẽ xoá phạm vào table kia.
 
Chung 1 sheet nhưng có khi nào table ngang dòng với table kia không. Rất quan trọng đấy vì nếu 2 table ở ngang dòng thì khi code xoá cả dòng Excel thì sẽ xoá phạm vào table kia.
Mình không hiểu câu hỏi của bạn, các table là riêng biệt với nhau mà, xóa hàng table này không ảnh hưởng đến table kia đâu bạn
 
Không có file cụ thể thì sẽ còn nhiều điểm không hiểu.
 
Chung 1 sheet nhưng có khi nào table ngang dòng với table kia không. Rất quan trọng đấy vì nếu 2 table ở ngang dòng thì khi code xoá cả dòng Excel thì sẽ xoá phạm vào table kia.
Xoá dòng của table không ảnh hưởng đến dòng của bảng tính.
Chỉ là thớt xoá từng dòng cho nên bị chậm. Mỗi dòng xoá là Excel lại phải chỉnh các thông số của Table. Nếu xoá cả cụm một lúc thì nhanh hơn.

Đại khái như vầy:
[Table1].Rows("3:" & [Table1].Rows.Count).Delete Shift:=xlUp
 
Mình không hiểu câu hỏi của bạn, các table là riêng biệt với nhau mà, xóa hàng table này không ảnh hưởng đến table kia đâu bạn
Tôi chưa bao giờ làm việc với table nên không biết liệu xoá dòng của table 1 có tác động đến table 2 không. Xin lỗi bạn vì không hỏi rõ.
Tôi thấy: khi xoá dòng của table trên thì table dưới tịnh tiến lên trên, sao nói không ảnh hưởng được?
 
Lần chỉnh sửa cuối:
Tôi thực là đã có code cho thớt rồi nhưng nếu không nói rõ thì code sẽ tầm bậy. Lý do: thớt có đến 350 table trên 1 sheet lận, một con số không tưởng đối với tôi.
Nếu chưa biết các bảng đó bố trí trong sheet thế nào thì anh lại code mò mất rồi.
 
Tôi thực là đã có code cho thớt rồi nhưng nếu không nói rõ thì code sẽ tầm bậy. Lý do: thớt có đến 350 table trên 1 sheet lận, một con số không tưởng đối với tôi.
Về lý thuyết và nguyên tắc, 1 sheet nhiều table thì sẽ trải ra theo hàng ngang, không đè đầu cỡi cổ nhau, mỗi table cách table kế tiếp bằng ít nhất 1 cột trống.
Khi đè đầu nhau, thêm bớt dòng cho table trên sẽ lôi table ở dưới lên hoặc ấn table ở dưới xuống, với điều kiện table dưới ít cột hơn table trên. Nếu không nó không cho thực hiện. So le cột cũng không cho luôn.
Khi các table nằm hàng ngang thì khi xóa dòng 1 table không ảnh hưởng đến table khác, khi code phải viết lệnh xóa "Table row" chứ không xóa "EntiredRow"
Không có file ví dụ nó khổ thế đấy bác ạ.
Bài này thì cần gì file.
 
Nếu chưa biết các bảng đó bố trí trong sheet thế nào thì anh lại code mò mất rồi.
Đúng. Phải chờ chủ thớt trả lời thì mới kết thúc vấn đề được

Nếu các bảng bố trí kiểu trên - dưới - lên - xuống mà dòng, cột không đồng nhất thì khi xoá, các khối cell của các bảng tịnh tiến lên hỗn loạn, dẫm chân nhau thì sao.
Bài đã được tự động gộp:

Về lý thuyết và nguyên tắc, 1 sheet nhiều table thì sẽ trải ra theo hàng ngang, không đè đầu cỡi cổ nhau, mỗi table cách table kế tiếp bằng ít nhất 1 cột trống.
Khi đè đầu nhau, thêm bớt dòng cho table trên sẽ lôi table ở dưới lên hoặc ấn table ở dưới xuống, với điều kiện table dưới ít cột hơn table trên. Nếu không nó không cho thực hiện. So le cột cũng không cho luôn.
Khi các table nằm hàng ngang thì khi xóa dòng 1 table không ảnh hưởng đến table khác, khi code phải viết lệnh xóa "Table row" chứ không xóa "EntiredRow"
Bác ptm0412 nói tôi mới biết, cảm ơn bác!
 
Về lý thuyết và nguyên tắc, 1 sheet nhiều table thì sẽ trải ra theo hàng ngang, không đè đầu cỡi cổ nhau, mỗi table cách table kế tiếp bằng ít nhất 1 cột trống.
Khi đè đầu nhau, thêm bớt dòng cho table trên sẽ lôi table ở dưới lên hoặc ấn table ở dưới xuống, với điều kiện table dưới ít cột hơn table trên. Nếu không nó không cho thực hiện. So le cột cũng không cho luôn.
Khi các table nằm hàng ngang thì khi xóa dòng 1 table không ảnh hưởng đến table khác, khi code phải viết lệnh xóa "Table row" chứ không xóa "EntiredRow"

Bài này thì cần gì file.
Vì em đọc bài #4 nên đoán chủ bài #4 code theo cách đó thì cần xem các bảng bố trí thế nào, nhưng đọc phần giải thích của anh thì thấy không cần nữa, cảm ơn anh ạ.
 
...
Tôi thấy: khi xoá dòng của table trên thì table dưới tịnh tiến lên trên, sao nói không ảnh hưởng được?
Bạn có thể sort các Tables theo Address của chúng. Xoá từ dưới lên trên, từ phải qua trái.

Dữ liệu để sort: dòng cuối & cột cuối & tên Table (hoặc chỉ số của nó trong collection)
 
Nếu các bảng bố trí kiểu trên - dưới - lên - xuống mà dòng, cột không đồng nhất thì khi xoá, các khối cell của các bảng tịnh tiến lên hỗn loạn, dẫm chân nhau thì sao.
Excel không cho chuyện hỗn loạn đó xảy ra, nên chắc chắn code sẽ lỗi.
Nếu cẩn thận thì xóa các table lần lượt từ dưới lên trên, mà xác định trên dưới cho 350 table phức tạp lắm.
 
(hoặc chỉ số của nó trong collection)
Tôi thử tạo table rồi, cái nào tạo sau thì chỉ số lớn hơn, bất kể nó ở địa chỉ nào. Do đó, chỉ khi các table bố trí trật tự theo hàng dọc hoặc ngang và không dẫm chân (dòng, cột) lên nhau thì kết quả code mới đúng.
 
1650812674138.png
Tôi thử tạo table rồi, cái nào tạo sau thì chỉ số lớn hơn, bất kể nó ở địa chỉ nào. Do đó, chỉ khi các table bố trí trật tự theo hàng dọc hoặc ngang và không dẫm chân (dòng, cột) lên nhau thì kết quả code mới đúng.
Tôi nói cộng chỉ số vào là để còn tìm nó ở đâu chứ có ai bảo sort chỉ số.
Right(CStr(1000000+dòng cuối), 7) & Right(CStr(10000+cột cuối), 5) & chỉ số Table

Sau khi sort xong thì tìm nó bằng:
chỉ số = CLng(Mid(chuỗi, 13))
 
Tôi nói cộng chỉ số vào là để còn tìm nó ở đâu chứ có ai bảo sort chỉ số.
Right(CStr(1000000+dòng cuối), 7) & Right(CStr(10000+cột cuối), 5) & chỉ số Table

Sau khi sort xong thì tìm nó bằng:
chỉ số = CLng(Mid(chuỗi, 13))
Dạ, bác. Nhưng nếu thớt bố trí các table đúng trật tự thì khỏi cần băn khoăn. Chờ thớt xác nhận thôi.

P/s: Nhưng mà bỏ qua các chuyện bên trên đi. Sau bài này, tôi được nâng 1 cấp thành viên. Đấy là vinh hạnh và cũng là động lực với tôi trong hành trình cùng GPE.
Qua đây tôi gửi lời cảm ơn chân thành đến bác VetMini đã không ngại nhận tôi là bạn dù cách xa tuổi tác và kiến thức, sở học. Cảm ơn bác ptm0412 "lão chết tiệt" luôn làm tôi nể phục về sự công bằng của 1 Super Moderator (tất nhiên không cần nhắc đến học thuật vì ai cũng biết rồi).

Tình cờ là 2 bác đều có mặt trong thớt này.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom