File Excel khi làm rất nặng
Nhờ mọi người giúp dùm mình có 2 file Exel khi mở ra để làm và trong quá trình làm thì nó rất chậm. Cám ơn nhiều.
Cái đó chưa chắc đâu. Máy tôi chỉ là con Core2 – 2.2GHz, RAM 2GB —> Thuộc dạng bèo và tôi không nghĩ cấu hình này có thể hơn máy bạn (vì máy tôi mua lâu rồi)
—————————-
có phải a dùng code để xóa như PTH đã nói ko? cho e xin đoạn code đó với. Thanks a!
Code mà tôi dùng chỉ có vầy:
Sub DelObjects()
Dim i As Long, wks As Worksheet
On Error Resume Next
Set wks = ActiveSheet
For i = 1 To 10000
wks.Shapes(1).Delete
Next
MsgBox "Còn " & wks.Shapes.Count & " objects"
End Sub
Cứ chạy code đến khi nào nhận được thông báo "Còn 0 objects" thì ngưng
Số 10000 trong code có thể thay bởi wks.Shapes.Count thì khỏi phải chạy nhiều lần anh nhỉ.
Cũng tùy theo máy mạnh thì mình cách này máy yếu nên gắt từng đoạn mà xử giống như bó đũa lấy từng chiếc ra mà bẻ sẽ dễ hơn để nguyên bó anh Phúc? Em thì dùng cách ngắt từng đoạn để đỡ bị treo máy
Do bác ndu lười thôi –=0, dùng For each là chuẩn nhất:
Sub ShapesDelete() Dim Obj As Shape For Each Obj In ActiveSheet.Shapes If Obj.Visible = msoFalse Then Obj.Delete 'Xóa đối tượng Shape bị ẩn, do virus tạo ra End If Next Set Obj = Nothing End Sub
Ẹc… Ẹc… Đó là vì các bạn ít khi đụng đến mấy "cục đá" này nên nghĩ vậy. Nếu mà sửa như Phúc và thầy Hướng, bảo đảm máy đơ luôn
Tóm lại: Phài xóa từ từ và con số 10000 là giới hạn mà tôi thí nghiệm ra (trên mấy tôi)
Đúng rồi. Luật chung của dọn rác đống khổng lồ là dọn từ từ từng vùng một.
Nếu bạn vẫn muốn delete một loạt thì nên làm ngược từ số lớn trở về số nhỏ – với hy vọng tránh được tình trạng index hoặc bộ nhớ bị sắp xếp lại thường xuyên – tôi không chắc có hiệu nghiệm không, nhưng nguyên tắc của delete vẫn là vậy.
Máy tôi yếu nên đã đơ từ khi mở tập tin rồi. Vậy không test được, chỉ "võ mồm" thôi.
Dứt khoát là đã Delete tất cả thì làm trong vòng lặp và luôn delete "phần tử cuối". Delete phần tử cuối là đúng bài bản.
Để khỏi phân tích cụ thể thì cứ nghĩ nôm na là nếu ta có 1 hàng học sinh và nếu cứ bỏ từng em đứng cuối thì rồi sẽ hết học sinh. Cũng có thể bỏ từng em thứ 1 nhưng như thế thì sau mỗi lần bỏ thì toàn bộ "hàng hiện hành" phải dịch lên đầu 1 "chỗ".
Tôi tin chắc rằng nếu ai có máy mạnh thì có thể test 2 kiểu delete và theo tôi kiểu luôn delete cuối là nhanh hơn.
Kiểu như
Do while wks.Shapes.Count > 0
wks.Shapes(wks.Shapes.Count).Delete
Loop
Hoặc tốt hơn
k = wks.Shapes.Count
Do while k > 0
wks.Shapes(k).Delete
k = k - 1
Loop
Tôi không rõ với For Each thì các đối tượng được duyệt theo thứ tự nào. Chắc theo thứ tự tăng dần của chỉ số.
e đã test code trên
Sub Siwtom_Xoa() k = ActiveSheet.Shapes.Count Application.ScreenUpdating = False Do While k > 0 ActiveSheet.Shapes(k).Delete k = k - 1 'Tong: 58.559 If k = 45000 Then MsgBox ("con ") & k If k = 40000 Then MsgBox ("con ") & k If k = 30000 Then MsgBox ("con ") & k If k = 20000 Then MsgBox ("con ") & k If k = 10000 Then MsgBox ("con ") & k If k = 1000 Then MsgBox ("con ") & k Loop Application.ScreenUpdating = True End Subtime:
9h19 -> 9h24 con 40.000
9h24 -> 9h28 con 30.000
9h28 -> 9h32 con 20.000
9h32 -> 9h33 con 10.000
9h33 -> 9h34 con 1000
—> càng về sau xoá càng nhanh
www.giaiphapexcel.com/diendan/threads/file-excel-khi-l%C3%A0m-r%E1%BA%A5t-n%E1%BA%B7ng.90153/
Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ
Con người là một trong những yếu tố quan trọng của công ty, là tài sản quý giá của doanh nghiệp. Chính vì thế,...
Xem khóa học
Bình luận