Có cần thiết phải có dòng lệnh giải phóng bộ nhớ?

Liên hệ QC

moihocvba

Thành viên thường trực
Tham gia
16/8/20
Bài viết
211
Được thích
50
Xin chào anh chị GPE!
Ứng dụng Excel VBA của em viết dùng một lúc là nó bị hiện màn hình đen xì và có thông báo là:
There isn't enough memory to complete this action.
Try using less data or closing other applications.
To increase memory availbaility, consider,
- Using a 64-bit version of Microsoft Excel.
- Adding memory to your device

Em chợt nhớ có lần một thầy nói khi viết code sau cùng phải giải phóng bộ nhớ, ví dụ như:
Set dic = nothing
arr = nothing
....

Anh chị cho em hỏi là có phải bị lỗi màn hình đen excel là do em viết code ko có đoạn giải phóng bộ nhớ hay ko, và làm sao để khắc phục lỗi màn hình đen ạ?

Em cảm ơn anh chị nhiều!
 
Bạn phải, phải và nhất định phải úp cái code của bạn lên đây thì mới nói tiếp được.
 
Upvote 0
Bạn phải, phải và nhất định phải úp cái code của bạn lên đây thì mới nói tiếp được.
Dạ file của em là ứng dụng phục vụ bán hàng tổng hợp rất nhiều chức năng, em viết cho người nhà em dùng, hay bị như vậy và nhiều dòng code tổng hợp, mà em ko có đoạn giải phóng bộ nhớ, ko biết nó nằm ở đoạn code nào mà gửi. Còn gửi nguyên file thì cho em xin phép ko gửi được ạ. Cám ơn anh befaint!

Em chỉ hỏi thao tác giải phóng bộ nhớ có cần thiết quan trọng ko ạ?
 
Upvote 0
Upvote 0
Dạ file của em là ứng dụng phục vụ bán hàng tổng hợp rất nhiều chức năng, em viết cho người nhà em dùng, hay bị như vậy và nhiều dòng code tổng hợp, mà em ko có đoạn giải phóng bộ nhớ, ko biết nó nằm ở đoạn code nào mà gửi. Còn gửi nguyên file thì cho em xin phép ko gửi được ạ. Cám ơn anh befaint!

Em chỉ hỏi thao tác giải phóng bộ nhớ có cần thiết quan trọng ko ạ?
Hihi cái này thì theo mình có nhiều nguyên nhân lắm, có thể phải xem code và debug mới biết được.
Có 1 cách không cần xem code của bạn và cũng đúng như yêu cầu của bạn là khi nào bạn thấy đày bộ nhớ thì rút dây điện nguồn của cpu ra sau đó cấm lại rồi nhấn nút Power doi cpu khởi động xong bảo đảm giải phóng 100% bộ nhớ sau đó mở lại chương trình của bạn bạn khi nào đày bộ nhớ lại tiếp tục vòng lập nhé
 
Upvote 0
gp bn là c pl nếu pm có sd nhiều arrays n objects.
tn, lỗi "out of memory" hơi pt. Cần nt code.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào anh chị GPE!
Ứng dụng Excel VBA của em viết dùng một lúc là nó bị hiện màn hình đen xì và có thông báo là:


Em chợt nhớ có lần một thầy nói khi viết code sau cùng phải giải phóng bộ nhớ, ví dụ như:
Set dic = nothing
arr = nothing
....

Anh chị cho em hỏi là có phải bị lỗi màn hình đen excel là do em viết code ko có đoạn giải phóng bộ nhớ hay ko, và làm sao để khắc phục lỗi màn hình đen ạ?

Em cảm ơn anh chị nhiều!
Trả lời:
Có thể KHÔNG: khi các chương trình nhỏ, biến ít, và phân bố gọi theo các sub function độc lập, Biến Public không có hoặc ít
CÓ cần: khi chương trình lớn, tổ chức không hợp lý, Biến public nhiều ...vv
Nên kết luận là tùy tình huống cụ thể
 
Upvote 0
máy của bạn bộ nhớ nhỏ thì chắc chắn phải doạn dẹp biến đối tượng. Bạn cũng nên đóng ứng dụng khác để chừa bộ nhớ cho Excel và VBA.


Đa số trường hợp người mới học thường khai báo Dạng Early binding, khai báo này chỉ dành cho người phát triển code, hoặc thư viện có lớp chạy sự kiện WithEvents.
Đối với ứng dụng đã đến tay người sử dụng, thì tất cả phải sử dụng CreateObject để load thư viện và chạy. Mặc dù chậm hơn nhưng tiết kiệm bộ nhớ hơn.

Khởi tạo kiểu biến tiết kiệm nếu phù hợp.
Khởi tạo biến không nên Dim O As New ..., vì cách này chỉ dành cho biến chạy đến khi ứng dụng đóng. Nếu dùng New theo cách như vậy biến không được giải phóng kể cả set thành nothing.

Giải phóng: tất cả các đối tượng trong một thủ tục ngắn hay dài luôn luôn cần giải phóng. Vì VBA không được tối ưu như bạn nghĩ. Trong quá trình chạy nó có thể để lại rác trong bộ nhớ. Và cũng tạo một thói quen lập trình tốt.

Nếu code không chứa các biến toàn cục quang trọng, hay userform đã load, bạn hãy đặt lệnh end ở cuối macro.
 
Upvote 0
cứ mua cái CPU mới nhất thế hệ thứ 9 + RAM trên 16 G thì ko cần thiết phải set x = nothing làm gì cả ... trừ khi bạn muốn tận dùng lại cái đã lưu trong bộ nhớ truy xuất lại nó thì đó lại là cái rất nhanh đấy

tuy nhiên đâu đó họ vẫn khuyên dùng set x = nothing là cần thiết vì 1 vài lý do xx ... còn xx là gì sau này vọc nhiều khắc sẻ nhận ra thôi
 
Upvote 0
máy của bạn bộ nhớ nhỏ thì chắc chắn phải doạn dẹp biến đối tượng. Bạn cũng nên đóng ứng dụng khác để chừa bộ nhớ cho Excel và VBA.


Đa số trường hợp người mới học thường khai báo Dạng Early binding, khai báo này chỉ dành cho người phát triển code, hoặc thư viện có lớp chạy sự kiện WithEvents.
Đối với ứng dụng đã đến tay người sử dụng, thì tất cả phải sử dụng CreateObject để load thư viện và chạy. Mặc dù chậm hơn nhưng tiết kiệm bộ nhớ hơn.

Khởi tạo kiểu biến tiết kiệm nếu phù hợp.
Khởi tạo biến không nên Dim O As New ..., vì cách này chỉ dành cho biến chạy đến khi ứng dụng đóng. Nếu dùng New theo cách như vậy biến không được giải phóng kể cả set thành nothing.

Giải phóng: tất cả các đối tượng trong một thủ tục ngắn hay dài luôn luôn cần giải phóng. Vì VBA không được tối ưu như bạn nghĩ. Trong quá trình chạy nó có thể để lại rác trong bộ nhớ. Và cũng tạo một thói quen lập trình tốt.

Nếu code không chứa các biến toàn cục quang trọng, hay userform đã load, bạn hãy đặt lệnh end ở cuối macro.
Cám ơn anh vì những kiến thức hữu ích. Có lẽ em nên set nothing tất cả các biến sau khi chạy xem có khắc phục được lỗi màu đen ko!
 
Upvote 0
Trả lời:
Có thể KHÔNG: khi các chương trình nhỏ, biến ít, và phân bố gọi theo các sub function độc lập, Biến Public không có hoặc ít
CÓ cần: khi chương trình lớn, tổ chức không hợp lý, Biến public nhiều ...vv
Nên kết luận là tùy tình huống cụ thể
Nói chuyện cụ thể:

Phần lớn các trường hợp bị hết bộ nhớ là do copy dữ liệu của một sheet. Cách giải quyết lỗi này rất khó. Thường thì đổi code lại thành copy cả sheet sang một sheet mới, rồi xoá sửa những chỗ cần thiết. Khi copy dữ liệu, chương trình phải dùng bọ nhớ để chứa. Khi copy sang sheet khác, chương trình có thể dùng cách copy từng phần.

Trường hợp cũng thường gặp nữa là do mảng quá lớn. Nên nhớ rằng mảng cần một vùng nhớ liên tục cho nên không thể swap page khi không đủ bộ nhớ. Để giải quyết, xem lại code và đổi tất cả những mảng tĩnh thành mảng động. Kế đó là thêm lệnh Erase khi dùng xong mảng, không đợi đến lúc mảng tự động giải phóng khi thoát hàm. Nếu mảng lớn quá thì có thể phải dùng kỹ thuật phân thành nhiều mảng con, và kỹ thuật tạm chứa trong sheet.

Lỗi thứ ba là do các đối tượng phình to quá. Một số đối tượng như collection, arraylist, ... có có khả năng phình to lên theo diễn tiến code. Những cái này cứ việc set nothing sau khi dùng.

Lỗi thứ tư là do một số đối tượng đặc biệt, điển hình là đối tượng chuyên chuyển đổi data (ADO). Bên trong nó còn một số bugs và không hoàn toàn 100% phù hợp với VBA. Sử dụng các đối tượng này có thể bị rò bộ nhớ (mãi cho đến năm 2016 tôi mới thấy ADO hết bị lỗi rò bộ nhớ). Cách tốt nhất là Set Nothing chúng ngay sau khi sử dụng xong. Tốt hơn nữa là khi gặp code dài, tách đoạn code sử dụng các đối tượng này sang hàm riêng để khi xong hàm chúng tự huỷ diệt.

Các lỗi khác thuộc về chủ quan, tức là code tệ quá, đệ quy dùng biến nội quá lớn,...

Chú: tôi chỉ trao đổi với bạn chứ không trực tiếp với thớt vì tôi không thích trao đổi với người hay viết tắt.
 
Upvote 0
1620796045688.png
Xin chào anh chị GPE!
Ứng dụng Excel VBA của em viết dùng một lúc là nó bị hiện màn hình đen xì và có thông báo là:


Em chợt nhớ có lần một thầy nói khi viết code sau cùng phải giải phóng bộ nhớ, ví dụ như:
Set dic = nothing
arr = nothing
....

Anh chị cho em hỏi là có phải bị lỗi màn hình đen excel là do em viết code ko có đoạn giải phóng bộ nhớ hay ko, và làm sao để khắc phục lỗi màn hình đen ạ?

Em cảm ơn anh chị nhiều!
Trước khi giải phóng bộ nhớ, thử làm theo cách tô vàng như hình bên dưới
 
Upvote 0
Ngày trước 1 số file của mình cũng bị lỗi tràn bộ nhớ, tìm hiểu thì rút ra kết luận sau bạn có thể tham khảo:
1. Nên dùng code giải phóng bộ nhớ set... = nothing
2. Không nên để tất cả các code vào 1 module, mà nên tách thành nhiều module vì dung lượng 1 module mà kết xuất ra file dung lượng lớn hơn 32kb cũng dễ bị tràn bồ nhớ, thấy tây nó nói thế
 
Upvote 0
Ngày trước 1 số file của mình cũng bị lỗi tràn bộ nhớ, tìm hiểu thì rút ra kết luận sau bạn có thể tham khảo:
1. Nên dùng code giải phóng bộ nhớ set... = nothing
2. Không nên để tất cả các code vào 1 module, mà nên tách thành nhiều module vì dung lượng 1 module mà kết xuất ra file dung lượng lớn hơn 32kb cũng dễ bị tràn bồ nhớ, thấy tây nó nói thế
Cám ơn bạn vì thông tin rất bổ ích!
 
Upvote 0
Xin chào anh chị GPE!
Ứng dụng Excel VBA của em viết dùng một lúc là nó bị hiện màn hình đen xì và có thông báo là:


Em chợt nhớ có lần một thầy nói khi viết code sau cùng phải giải phóng bộ nhớ, ví dụ như:
Set dic = nothing
arr = nothing
....

Anh chị cho em hỏi là có phải bị lỗi màn hình đen excel là do em viết code ko có đoạn giải phóng bộ nhớ hay ko, và làm sao để khắc phục lỗi màn hình đen ạ?

Em cảm ơn anh chị nhiều!
Bạn đọc và hiểu đúng đoạn này của các chuyên gia microsoft nhé
Riêng bản thân mình (có thể sai tè le) chưa bao giờ mình set x= nothing mà chưa bao giờ bị lỗi gì cả
.........................................................................................................................................
Nothing <keyword>


Nothing <keyword>

The Nothing keyword is used to disassociate an object variable from an actual object. Use the Set statement to assign Nothing to an object variable. For example:


Set MyObject = Nothing

Several object variables can refer to the same actual object. When Nothing is assigned to an object variable, that variable no longer refers to an actual object. When several object variables refer to the same object, memory and system resources associated with the object to which the variables refer are released only after all of them have been set to Nothing, either explicitly using Set, or implicitly after the last object variable set to Nothing goes out of scope.
 
Upvote 0
Web KT

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

Back
Top Bottom