Giải thích giúp mình code giải phóng bộ nhớ từ biến

Liên hệ QC

adult

Thành viên hoạt động
Tham gia
2/12/07
Bài viết
193
Được thích
30
Mã:
Sub ReleaseObjectMemory() 
'Co the la bat ky bien Object nao
Dim wSheet as Worksheet 
'Dat bien Object
Set wSheet = Sheet1 
'Dat code cua ban o day
'Giai phong bo nho
Set wSheet = Nothing 
End Sub
mình đọc được đoạn code trên của bác levanduyet nhưng kô hiểu lắm. Mong các bạn có thể cho mình 1 ví dụ cụ thể được không ạh, và giải thích khi có code thì khác gì so với kô có
 
-Đó chưa phải là một đoạn code hoàn chỉnh. Đúng hơn chỉ là phần đầu và phần cuối của Sub. Còn phần giữa là code của bạn bổ sung vào.
-Theo mình hiểu, đó chỉ là một ví dụ để hướng dẫn kỹ năng viết code. Vào đầu thủ tục, nếu ta gán giá trị cho một biến đối tượng thì phần cuối phải Set = Nothing để giải phóng bộ nhớ.
 
Upvote 0
Đúng như bác Voda hướng dẫn, biến đối tượng có thể làm đầy bộ nhớ --> tốc độ xử lý của máy tính sẽ chậm đi. Vì vậy, khi đặt biến bằng Nothing thì có thể hiểu biến đã bị xóa bỏ khi đã sử dụng xong. Chỉ có điều nếu dùng biến dạng Public thì cẩn thận Nothing khi biến đang sử dụng.
 
Upvote 0
Vậy anh có thể giúp em cho 1 ví dụ được không ạh.Tiện thể phân tích giúp em làm việc đó lợi ích là gì? Mình có đọc 1 số code thấy khai báo declare ... từ file.ocx or dll gì đó, như vậy có hao tốn bộ nhớ không, cần phải làm gì với những khai báo dạng như thế để đỡ tốn bộ nhớ.
Xin cám ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy anh có thể giúp em cho 1 ví dụ được không ạh.Tiện thể phân tích giúp em làm việc đó lợi ích là gì? Mình có đọc 1 số code thấy khai báo declare ... từ file.ocx or dll gì đó, như vậy có hao tốn bộ nhớ không, cần phải làm gì với những khai báo dạng như thế để đỡ tốn bộ nhớ.
Xin cám ơn.

Việc khai báo các hàm trong thư viện (*.dll, *.ocx, *.exe) với từ khóa Declare và việc viết các hàm và thủ tục trong VBA molule chỉ ảnh hưởng ít tới bộ nhớ, chỉ khi hàm hay thủ tục được sử dụng thực sự, nó sẽ được WINDOWS quản lý và giải phóng chúng hoàn toàn khỏi bộ nhớ khi thoát khỏi khỏi Excel.

Ảnh hưởng tới bộ nhớ xảy ra thực sự khi các hàm đó làm việc và nếu người viết hàm đó mà không có cơ chế bảo toàn bộ nhớ thì bộ nhớ của máy sẽ bị chiếm dụng và đến mục lúc phải khởi động lại máy.
 
Upvote 0
Xin vui lòng cho hỏi, nếu khai báo trong Form như dưới đây, thì khi thoát Form dùng lệnh gì để giải phóng bộ nhớ?

PHP:
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
 (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hWnd As Long, _
  ByVal hWndInsertAfter As Long, ByVal x As Long, _
  ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Cám ơn rất nhiều!
 
Upvote 0
Xin vui lòng cho hỏi lại, nếu có ai đó trả lời. Kính nhờ Mod xóa dùm threat này!
 
Upvote 0
Xin vui lòng cho hỏi, nếu khai báo trong Form như dưới đây, thì khi thoát Form dùng lệnh gì để giải phóng bộ nhớ?

PHP:
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
 (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hWnd As Long, _
  ByVal hWndInsertAfter As Long, ByVal x As Long, _
  ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Cám ơn rất nhiều!
Trong code này có cái nào là biến gì đâu mà cần giải phóng hả bạn?
Hàm API thôi mà! Quan trọng là bạn dùng nó ra sao? (mới biết mà nói tiếp được)
 
Upvote 0
Trong code này có cái nào là biến gì đâu mà cần giải phóng hả bạn?
Hàm API thôi mà! Quan trọng là bạn dùng nó ra sao? (mới biết mà nói tiếp được)

Cứ mỗi lần load form lên, rồi chuyển qua form khác rồi quay lại form này với form khác, vài lần thấy bộ nhớ bị tăng đáng kể có lúc bị ngưng hoạt động mà không làm gì trên form cả, từ 33M tăng 42, 71... (theo dõi qua Processing Task Management), nếu không phải nó thì tại sao nhỉ? Nhưng khi không sử dụng Form trở về Sheet (trước khi load form cho ẩn sheet) thì lại trở về 33M.
 
Upvote 0
Cứ mỗi lần load form lên, rồi chuyển qua form khác rồi quay lại form này với form khác, vài lần thấy bộ nhớ bị tăng đáng kể có lúc bị ngưng hoạt động mà không làm gì trên form cả, từ 33M tăng 42, 71... (theo dõi qua Processing Task Management), nếu không phải nó thì tại sao nhỉ? Nhưng khi không sử dụng Form trở về Sheet (trước khi load form cho ẩn sheet) thì lại trở về 33M.
Vấn đề quan trọng vẫn là cách viết code thế nào!
Nếu có thể được, bạn cho file lên đây nhé
 
Upvote 0
Vấn đề quan trọng vẫn là cách viết code thế nào!
Nếu có thể được, bạn cho file lên đây nhé

Em tìm ra nguyên nhân tăng dung lượng rồi Thầy ơi, không phải do Code mà là do Form. Thuộc tính Form em để Picture là Bitmap, nhúng hình vào đó, khi em gỡ ra thì không thấy tăng lên, hoặc tăng rất ít. Không lẽ show form này, unload form kia lại chồng dung lượng lên ta? Cái hình ảnh hưởng gì vậy?
 
Upvote 0
Em tìm ra nguyên nhân tăng dung lượng rồi Thầy ơi, không phải do Code mà là do Form. Thuộc tính Form em để Picture là Bitmap, nhúng hình vào đó, khi em gỡ ra thì không thấy tăng lên, hoặc tăng rất ít. Không lẽ show form này, unload form kia lại chồng dung lượng lên ta? Cái hình ảnh hưởng gì vậy?

Có lẽ trong Userform của Thiện có sử dụng cái gì đó liên quan tới ảnh?
 
Upvote 0
Có lẽ trong Userform của Thiện có sử dụng cái gì đó liên quan tới ảnh?

Em đã thử nghiệm với 2 Form, mỗi Form insert 1 Picture (khoảng 2M). Trước khi load form thì Window Task Manager báo bộ nhớ Excel.exe chiếm khoảng 30M, nhưng khi load Form1 lên, rồi từ đó load Form2 thoát Form1, rồi từ Form2 gọi Form1, thoát Form2, lặp đi lặp lại khoảng 15 lần, bộ nhớ tăng lên 520M. Rõ ràng, nó không giải phóng được bộ nhớ khi có Picture!
Form chỉ có 1 CommandButton, Code trong form chỉ như vầy:
PHP:
Private Sub CommandButton1_Click()
  Unload Me
  UserForm2.Show
End Sub

PHP:
Private Sub CommandButton1_Click()
  Unload Me
  UserForm1.Show
End Sub
 

File đính kèm

  • DOC.rar
    666.8 KB · Đọc: 23
Upvote 0
Anh Thiện thử dùng phương thức LoadPicture xem sao, khi đóng nó tự mất hình cho đỡ mệt cái giải phóng biến:

Private Sub UserForm_Activate()
Image1.Picture = LoadPicture("D:\Anh\New Folder\DSC03069.jpg")
End Sub
 
Upvote 0
Anh Thiện thử dùng phương thức LoadPicture xem sao, khi đóng nó tự mất hình cho đỡ mệt cái giải phóng biến:

Hình như là nếu chuyển Form qua, lại liên tục, nên dùng UserForm.Hide (ở chế độ ẩn Form) thay cho Unload UserForm thì dung lượng sẽ không bị tăng!
Cám ơn Anh HƯỚNG nhé!
 
Upvote 0
Khi khai báo các biến trong chương trình con hay thủ tục hàm, sau khi dùng xong chương trình con hay thủ tục hàm thì chương trình cũng tự động giải phóng bộ nhớ rồi mà.Tôi nói như thế có đúng không nhỉ?
 
Upvote 0
Chào mọi người, xin hãy chỉ dẫn cho tôi vấn đề sau:
Ví dụ ở mỗi module Khi tôi khai báo các biến X,Y,Z ở dạng Public .. sau mỗi lần chạy code các biến này vẫn lưu lại giá trị.
Có đoạn code nào sau mỗi lần chạy code để nó xóa toàn bộ gia trị trong các biến này không, mà không phải thoát file?
 
Upvote 0
Web KT
Back
Top Bottom