File Excel khi làm rất nặng

  • Thread starter Thread starter haiwang
  • Ngày gửi Ngày gửi
Liên hệ QC

haiwang

Thành viên mới
Tham gia
25/2/14
Bài viết
3
Được thích
0
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.
 

File đính kèm

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.

lỗi trên file đó là do có quá nhiều Objects. (object của bạn là các Textbox ... quá trời --=0, máy mình cũng khá mạnh mà cũng chạy ko nổi cái file đó)

'- - -
nếu là Excel 2013 thì bạn sửa bằng cách (chắc 2007, 2010 cũng tương tự)
Menu Home --> Find&Select --> Selection Pane, bạn sẽ thấy các Textbox đó.
 
Nếu object do virus tạo ra thì có thể dùng code xóa chú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.

File của bạn chứa trên 50000 "cục đá" nên nó "nặng" là phải rồi
Đã dọn dẹp giúp bạn
 

File đính kèm

File của bạn chứa trên 50000 "cục đá" nên nó "nặng" là phải rồi
Đã dọn dẹp giúp bạn
a tài thật đó, e cố gắng ngồi run cả buổi trưa mà chẳng thấm vào đâu --=0 (chắc do máy của e cùi hơn)

có phải a dùng code để xóa như PTH đã nói ko? cho e xin đoạn code đó với. Thanks a!
 
a tài thật đó, e cố gắng ngồi run cả buổi trưa mà chẳng thấm vào đâu --=0 (chắc do máy của e cùi hơn)

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:
Mã:
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
 
Code mà tôi dùng chỉ có vầy:
Mã:
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ỉ.
 
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
 
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ỉ.

Do bác ndu lười thôi --=0, dùng For each là chuẩn nhất:

Mã:
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
 
Do bác ndu lười thôi --=0, dùng For each là chuẩn nhất:

Mã:
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

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... Ẹ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)
 
Ẹ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.
 
Ẹ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)

Hic, em chưa hiểu lý do máy đơ? Hay với kiểu vòng lặp For each cho tập hợp nhiều Shape thì máy hoạt động kém. Có bạn nào test thử chưa?
 
Hic, em chưa hiểu lý do máy đơ? Hay với kiểu vòng lặp For each cho tập hợp nhiều Shape thì máy hoạt động kém. Có bạn nào test thử chưa?

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ư
Mã:
Do while wks.Shapes.Count > 0
    wks.Shapes(wks.Shapes.Count).Delete
Loop

Hoặc tốt hơn

Mã:
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ố.
 
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ư
Mã:
Do while wks.Shapes.Count > 0
    wks.Shapes(wks.Shapes.Count).Delete
Loop

Hoặc tốt hơn

Mã:
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
Mã:
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 Sub

time:
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
 
Lần chỉnh sửa cuối:
Em cũng bị hiện tượng một số file excel bị tăng dung lượng mặc dù dữ liệu rất ít. Nhờ mọi người giúp đỡ. Em gửi kèm theo một trong số các file đó.
 

File đính kèm

Tôi xóa thử với đoạn code tôi đưa ra thấy ổn (lúc đầu máy hơn đơ 1 chút), khoảng 15 s là xong. Chắc do cấu hình máy mình ngon (core 5, 1.7Ghz). Tiêu diệt hơn 20.000 Shape --=0

 
Em cũng bị hiện tượng một số file excel bị tăng dung lượng mặc dù dữ liệu rất ít. Nhờ mọi người giúp đỡ. Em gửi kèm theo một trong số các file đó.
Tạm thời mình phát hiện file của bạn có nhiều name rác vì đang dùng máy cài office 2003.
Bạn nhấn Ctrl+F3 chọn các name rồi nhấn Delete.
 
Có cách nào nhanh hơn không ạ? Xóa bằng tay từng cái thì rất lâu, mà mình bị nhiều file như thế này.
 
Có cách nào nhanh hơn không ạ? Xóa bằng tay từng cái thì rất lâu, mà mình bị nhiều file như thế này.

name của bạn cũng ko nhiều lắm
26-02-14 10-15-50 AM.jpg

bạn muốn xoá nhanh thì có thể dùng cách sau:

- Sort cột Value (hoặc Refers To)
- chọn từ vị trí 1 + Shift + vị trí 2, rồi Delete là xong.
 
Lần chỉnh sửa cuối:
Có cách nào nhanh hơn không ạ? Xóa bằng tay từng cái thì rất lâu, mà mình bị nhiều file như thế này.
Nếu dùng excel 2007 trở lên thì việc xóa name rác rất đơn giản.
Chỉ cần chọn name rác đầu tiên sau đó nhấn Shift + End rồi nhấn Delete là xong.
to phucbugis và các thành viên : Bạn có biết cách nào xóa hàng loạt name rác trên excel 2003 không?
 
Web KT

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

Back
Top Bottom