[HỌC TẬP] Tìm hiểu về cách khai báo biến và khai thác biến trong lập trình VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

langtuchungtinh360

Thành viên đã dừng hoạt động
Tham gia
7/10/13
Bài viết
1,062
Được thích
334
chào mọi người
như thành viên VieMini có nói vấn đề khai báo biến ở diễn đàn này
nhưng có lẽ trình độ của em chưa hiểu được là nó như thế nào nên lập topic này để tìm hiểu thêm
theo bác VetMini thì chắc là đang nói đến khai báo biến thế này
Mã:
Sub test()    Static Fso As Object, ObjFile As Object
    If Fso Is Nothing Then
        Set Fso = CreateObject("Scripting.FileSystemObject")
    End If
End Sub
nhưng em không biết được tác dụng, cách xử lý, thao tác, khai thác việc khai báo biến như thế
liệu các tiền bối có thâm niên lâu năm có thể hướng dẫn thêm giúp em không
nó có khác gì so với khai báo biến dạng này
Mã:
Public Y As Long
Private Y As Long
Const Pi = 3.1412
theo em được biết thì khai báo Public thì tất cả các Sub- Function ở các module khác đề khai thác được nó
nhưng khi có lỗi thì biến đó sẽ mất giống như ta dùng End để kết thúc
còn Private thì khác Public là chỉ sử dụng được trong chính Module được khai báo.
còn Const thì là biến chết không thay đổi được. không biết nếu End rồi thì nó có mất không.
rất mong nhận được sự chỉ bảo từ mọi người.
 
Lần chỉnh sửa cuối:
nhưng khi có lỗi thì biến đó sẽ mất giống như ta dùng End để kết thúc
...

Chịu khó học chậm một chút xíu cho nó kỹ lưỡng. "End" có nhiều loại.
Đọc kỹ một chút thì đã thấy tôi luôn luôn dùng End/Exit Sub/Function. Thoát ra khỏi chuonwg trình con.
Từ khóa End mà khong có Sub/Function chấm dứt luôn chương trình. Chả còn gì hết

...
còn Const thì là biến chết không thay đổi được. không biết nếu End rồi thì nó có mất không.
...

Đã const thì còn biến thế nào nữa? Const là hằng !!!!!
Việc xác định tình trạng mất hay không mất dùng để xét xem biến có giữ lại trị ở lần được gán gần nhất hay khởi trị lại. Đã là hằng, khong thay đổi thì có mất hay khong có nhằm nhòi gì?

Câu hỏi trên cho thấy bạn muốn học chạy trước khi biết đi. Cần trau giồi căn bản từ đầu.

Ở diễn đàn này có bài viết căn bản về biến và tầm vực của biến, do mọt trong những thành viên lão thành ở đây viết. Chịu khó tìm bài ấy mà đọc.
Nếu tìm khong ra thì mua quách 1 quyển VBA căn bản mà học. Đăng ngay trong trang chủ GPE.
 
Upvote 0
Chịu khó học chậm một chút xíu cho nó kỹ lưỡng. "End" có nhiều loại.
Đọc kỹ một chút thì đã thấy tôi luôn luôn dùng End/Exit Sub/Function. Thoát ra khỏi chuonwg trình con.
Từ khóa End mà khong có Sub/Function chấm dứt luôn chương trình. Chả còn gì hết



Đã const thì còn biến thế nào nữa? Const là hằng !!!!!
Việc xác định tình trạng mất hay không mất dùng để xét xem biến có giữ lại trị ở lần được gán gần nhất hay khởi trị lại. Đã là hằng, khong thay đổi thì có mất hay khong có nhằm nhòi gì?

Câu hỏi trên cho thấy bạn muốn học chạy trước khi biết đi. Cần trau giồi căn bản từ đầu.

Ở diễn đàn này có bài viết căn bản về biến và tầm vực của biến, do mọt trong những thành viên lão thành ở đây viết. Chịu khó tìm bài ấy mà đọc.
Nếu tìm khong ra thì mua quách 1 quyển VBA căn bản mà học. Đăng ngay trong trang chủ GPE.
vâng! không biết là có tìm nhầm bài không mà chả thấy giải thích gì thêm
https://www.giaiphapexcel.com/forum/content.php?173-Khai-báo-biến-và-đặt-tên-biến-trong-VBA

em cảm ơn bác, đọc bài bác chỉ ngồi chơi 1 hồi mới nghĩ ra. thì ra là biến static nó vẫn còn sau khi kết thúc và chỉ sử dụng trong chính thủ tục đó. còn các thủ tục khác thì không => nó không chiếm dụng bộ nhớ.
để xem có áp dụng được vô bài kia của em không.
--------------
ngoài lề:
còn việc bác kêu gửi file .bas lên là sao? nó là file Module mà. trong khi ở bài kia thì trong đó có tới mấy Module lận.
em nghĩ bác kêu gửi file thư viện .bas lên thì chỉ là 1 file, trong khi có tới 4-5 module thì đâu gọi là thư viện được. em nghĩ thư viện thì kiểu như là ".dll" thôi chứ nhỉ
 
Upvote 0
(1) biến nào cũng chiếm bộ nhớ tuốt. Chỉ khác nhau là phần bộ nhớ heap (đống chung) hay stack (ngăn xếp) mà thôi.
Cách hoạt động của ngăn xếp là: sau khi chạy xong hàm, tất cả những gì trong ngăn xếp được thải ra hết. Khi hàm khác được gọi thì lại nhét vào chỗ trống.
Cách hoạt động của heap là cái gì vào rồi thì nằm đó luôn (trừ trường hợp dùng hàm phục hồi bộ nhớ - như hàm erase phục hồi bộ nhớ của mảng động. Nhưng đó chỉ là bộ nhớ mảng, chứ chính tên mảng thì vẫn còn trong heap)

(2) nếu bạn đọc kỹ, lúc đề nghị export tôi có dùng từ "các". Nếu không phải số nhiều thì nói chuyện chỉnh cấu trúc code làm chi cho mệt.
Bạn nên tập giữ đầu óc khách quan khi đọc bài ngừoi khác. Chủ quan giúp đi thẳng vào vấn đề nhưng đồng thời sẽ cản trở sự phát triển của tầm nhìn.
 
Upvote 0
(1) biến nào cũng chiếm bộ nhớ tuốt. Chỉ khác nhau là phần bộ nhớ heap (đống chung) hay stack (ngăn xếp) mà thôi.
Cách hoạt động của ngăn xếp là: sau khi chạy xong hàm, tất cả những gì trong ngăn xếp được thải ra hết. Khi hàm khác được gọi thì lại nhét vào chỗ trống.
Cách hoạt động của heap là cái gì vào rồi thì nằm đó luôn (trừ trường hợp dùng hàm phục hồi bộ nhớ - như hàm erase phục hồi bộ nhớ của mảng động. Nhưng đó chỉ là bộ nhớ mảng, chứ chính tên mảng thì vẫn còn trong heap)

(2) nếu bạn đọc kỹ, lúc đề nghị export tôi có dùng từ "các". Nếu không phải số nhiều thì nói chuyện chỉnh cấu trúc code làm chi cho mệt.
Bạn nên tập giữ đầu óc khách quan khi đọc bài ngừoi khác. Chủ quan giúp đi thẳng vào vấn đề nhưng đồng thời sẽ cản trở sự phát triển của tầm nhìn.
nếu vậy thì khi em khai báo private ở đầu module thì ở tất cả các sub khác chung module đều thấy biến đó
còn khi khai báo static ở trong sub thì các sub khác chung module khi chạy thì không có biến đó
như thế thì không bị chiếm bộ nhớ vì khai báo biến cục bộ chứ bác nhỉ
dẫu biết là nó cũng chiếm bộ nhớ khi chạy Sub thì khai báo static nó chỉ tốn khi chạy Sub chứa nó còn các Sub khác không ảnh hưởng
em hiểu vậy thì đúng không?
 
Upvote 0
Biến module là biến toàn cục. Hễ mở code lên chạy là VBA đưa chúng vào bộ nhớ chung.
Với các biến này, từ khoá private hay public chỉ là lời rao báo cho các module khác biết mà thôi.

Biến khai báo bên trong sub/function là biến nội. Khi sub/function được gọi thì VBA đưa chúng vào ngăn xếp, và khi sub/function thoát thì VBA thải chúng ra và phục hồi bộ nhớ ngăn xếp. Ngăn xếp LUÔN LUÔN làm việc như vậy. Và hầu như ngôn ngữ lập trình nào cũng vậy (*)

Vì có vấn đề đôi khi cần giữ lại trị của biến nội để làm việc tiếp cho nên hầu hết các ngôn ngữ lập trình đều đặt ra cách để thực hiện loại biến tĩnh (static). Loại biến này vẫn thuộc về sub/function nhưng lại chứa trong bộ nhớ chung dể tránh bị thải ra khỏi ngăn xếp khi sub/function thoát.

Lý thuyết là vậy thôi. Còn thực hành thì cách học code của bạn không cùng trường phái với tôi nên khó giải thích thêm.

Chú thích cho các bạn khác: tôi cố tình tránh cụm từ "chiếm bộ nhớ" bởi vì theo cách viết code của tôi thì các tiêu chuẩn "chiếm bộ nhớ" (memory resource) và "tăng tốc" (efficiency) thuộc về thứ yếu. Trường phái viết code của tôi là code dễ theo dõi (readable), dễ sửa (ease of maintenance), dùng được nhiều lần (reusable), tức là mang đi áp dụng chỗ khác mà không cần chỉnh sửa.

(*) Chú ý: JavaScript có khái niệm "closure" khá phức tạp về chuyện này.
 
Upvote 0
Web KT

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

Back
Top Bottom