Xin giải thích Code trong Module và Code trong WorkBook khác nhau thế nào?

Liên hệ QC

a.nguoidensau

Thành viên hoạt động
Tham gia
12/4/12
Bài viết
138
Được thích
28
Chào các ACE!
Tôi đang ngâm cứu về VBA, nhưng tôi chưa rõ Code viết trong Module và Code viết trong ThisWorkBook có gì giống và khác nhau nhỉ. Xin mọi người chỉ giúp.
Xin cảm ơn.
 
Lần chỉnh sửa cuối:
Chào các ACE!
Tôi đang ngâm cứu về VBA, nhưng tôi chưa rõ Code viết trong Module và Code viết trong WorkBook có gì giống và khác nhau nhỉ. Xin mọi người chỉ giúp.
Xin cảm ơn.

Các code trong Module của WorkSheet hay của ThisWorkbook hay của UserForm thường là nơi diễn ra các macro về sự kiện liên quan đến các đối tượng đó hoặc các controls nằm trong đối tượng đó. Còn các Standard Module thường là nơi chứa các thủ tục, các macro thực thi lệnh.
 
Upvote 0
Các code trong Module của WorkSheet hay của ThisWorkbook hay của UserForm thường là nơi diễn ra các macro về sự kiện liên quan đến các đối tượng đó hoặc các controls nằm trong đối tượng đó. Còn các Standard Module thường là nơi chứa các thủ tục, các macro thực thi lệnh.
Cảm ơn bác đã giải thích, nhưng tôi vẫn cảm thấy còn mơ hồ, chưa rõ về "cơ chế" hoạt động của Module hay ThisWorkbook.
Bác nào có ví dụ minh họa giúp cho tôi dễ hiểu không nhỉ.
 
Upvote 0
Cảm ơn bác đã giải thích, nhưng tôi vẫn cảm thấy còn mơ hồ, chưa rõ về "cơ chế" hoạt động của Module hay ThisWorkbook.
Bác nào có ví dụ minh họa giúp cho tôi dễ hiểu không nhỉ.

Cứ hiểu thế này:
- Code trong Workbook hoặc WorkSheet là để chạy tự động các sự kiện. Chẳng hạn:
* Workbook_Open là sự kiện Open, sẽ chạy code khi Workbook vừa mở lên
* Worksheet_SelectionChange là sự kiện chọn cell, sẽ chạy code khi bạn chọn 1 cell nào đó
* Worksheet_Change là sự kiện thay đổi dữ liệu, sẽ chạy code khi bạn nhập liệu vào cell
vân vân... và... mây mây
Bạn không thể gọi "bằng tay" các code sự kiện này (tự nó sẽ chạy khi "nhìn thấy" sự kiện xảy ra "khớp" với nó thôi)
- Code trong Module: Cứ nằm đó "chơi" và chẳng làm gì cả. Đến khi bạn bấm Alt + F8 hoặc nhấn Button nào đó có Asign Macro đến nó thì nó sẽ chạy
--------------
Ngắn gọn thế cho người mới bắt đầu, sau này sẽ đi sâu hơn
 
Upvote 0
Cứ hiểu thế này:
- Code trong Workbook hoặc WorkSheet là để chạy tự động các sự kiện. Chẳng hạn:
* Workbook_Open là sự kiện Open, sẽ chạy code khi Workbook vừa mở lên
* Worksheet_SelectionChange là sự kiện chọn cell, sẽ chạy code khi bạn chọn 1 cell nào đó
* Worksheet_Change là sự kiện thay đổi dữ liệu, sẽ chạy code khi bạn nhập liệu vào cell
vân vân... và... mây mây
Bạn không thể gọi "bằng tay" các code sự kiện này (tự nó sẽ chạy khi "nhìn thấy" sự kiện xảy ra "khớp" với nó thôi)
- Code trong Module: Cứ nằm đó "chơi" và chẳng làm gì cả. Đến khi bạn bấm Alt + F8 hoặc nhấn Button nào đó có Asign Macro đến nó thì nó sẽ chạy
--------------
Ngắn gọn thế cho người mới bắt đầu, sau này sẽ đi sâu hơn
Thầy giải thích rất dễ hiểu quan trọng hơn là rất dễ nhớ. Em có 1 suy nghĩ là tại sao thầy không viết 1 cuốn sách hay 1 ebook về VBA nhỉ. Em thấy với kiến thức cũng như kinh nghiệm qua các bài tập thực tế thầy đã giúp đỡ trên diễn đàn thì cuốn sách thầy viết sẽ dễ hiểu và dễ học hơn. Vài dòng suy nghĩ rất chân thành của em!
 
Upvote 0
Thầy giải thích rất dễ hiểu quan trọng hơn là rất dễ nhớ. Em có 1 suy nghĩ là tại sao thầy không viết 1 cuốn sách hay 1 ebook về VBA nhỉ. Em thấy với kiến thức cũng như kinh nghiệm qua các bài tập thực tế thầy đã giúp đỡ trên diễn đàn thì cuốn sách thầy viết sẽ dễ hiểu và dễ học hơn. Vài dòng suy nghĩ rất chân thành của em!
Câu hỏi này nhớ không lầm thì tôi đã hỏi cách đây 3 hay 4 năm trước thì phải! Và hình như Thầy trả lời là không có thời gian cũng như hơi ... làm biếng đầu tư cho việc viết sách này! Còn bây giờ hả ... còn bận hơn trước nữa! Giờ Thầy mình làm lãnh đạo òy!
 
Upvote 0
Câu hỏi này nhớ không lầm thì tôi đã hỏi cách đây 3 hay 4 năm trước thì phải! Và hình như Thầy trả lời là không có thời gian cũng như hơi ... làm biếng đầu tư cho việc viết sách này! Còn bây giờ hả ... còn bận hơn trước nữa! Giờ Thầy mình làm lãnh đạo òy!
Làm lãnh đạo rồi có khi thầy nhà mình lại có nhiều thời gian hơn đấy anh ạ!@$@!^% Mà nếu 1 ngày thầy viết 1, 2 trang sách thì chả bao lâu mà được 1 cuốn sách anh nhỉ. Vẫn hy vọng có 1 lúc nào đó thầy thay đổi quan điểm của mình về vấn đề này!
 
Upvote 0
Cứ hiểu thế này:
- Code trong Workbook hoặc WorkSheet là để chạy tự động các sự kiện. Chẳng hạn:
* Workbook_Open là sự kiện Open, sẽ chạy code khi Workbook vừa mở lên
* Worksheet_SelectionChange là sự kiện chọn cell, sẽ chạy code khi bạn chọn 1 cell nào đó
* Worksheet_Change là sự kiện thay đổi dữ liệu, sẽ chạy code khi bạn nhập liệu vào cell
vân vân... và... mây mây
Bạn không thể gọi "bằng tay" các code sự kiện này (tự nó sẽ chạy khi "nhìn thấy" sự kiện xảy ra "khớp" với nó thôi)
- Code trong Module: Cứ nằm đó "chơi" và chẳng làm gì cả. Đến khi bạn bấm Alt + F8 hoặc nhấn Button nào đó có Asign Macro đến nó thì nó sẽ chạy
Em xin cảm ơn bác ndu96081631 với cách giải thích rất dễ hiểu.
Và em cũng có cùng quan điểm với bạn Chuot0106:
Thầy giải thích rất dễ hiểu quan trọng hơn là rất dễ nhớ. Em có 1 suy nghĩ là tại sao thầy không viết 1 cuốn sách hay 1 ebook về VBA nhỉ. Em thấy với kiến thức cũng như kinh nghiệm qua các bài tập thực tế thầy đã giúp đỡ trên diễn đàn thì cuốn sách thầy viết sẽ dễ hiểu và dễ học hơn. Vài dòng suy nghĩ rất chân thành của em!
 
Upvote 0
Trong lập trình có cái gọi là phạm vi giới hạn (scope) của một nhân tố (entity). Mọi nhân tố đều có phạm vi của chúng.

Theo lý thuyết Lập Trình Hướng Đối Tượng áp dụng vào VBA thì một Project được coi là vùng cấp 1 (tôi tạm gọi là vùng để dễ diễn tả phạm vi, chính thức ra, tiếng nghề gọi vùng hoạt động là namespace).
Vùng cấp 1 chứa nhiều vùng cấp 2 (tức là Microsoft Excel Objects, và Modules)

Các nhân tố (định nghĩa, biến, hàm, thủ tục) mà bạn gọi là Modules nằm trong một vùng thuộc cấp 2.
Các nhân tố (định nghĩa, biến, hàm, thủ tục) mà bạn gọi là Workbook cũng nằm trong một vùng khác thuộc cấp 2.

Mỗi vùng lại có thể chia ra nhiều modules nhỏ, mỗi module nhỏ này lại có vùng riêng của chúng. Ví dụ trong Modules, chúng được mặc định là Module1, Module2, ... Nhưng nếu cần thiết, bạn vẫn có thể đặt lại tên khác cho chúng.

Luật pham vi:
Các module có tính chất riêng biệt với nhau. Mõi module là một vùng. Code của vùng được mặc định là chỉ làm việc với nhau.
Nếu code được chỉ định là private thì code ngoài vùng không thể "thấy" chúng. Ví dụ trong code Modules.Module1, bạn gọi Sub Worksheet_SelectionChange của Sheet1 thì sẽ thấy lỗi "Method or data member not found".

Nếu code (code gọi) của một vùng này muốn chỉ tới code (code được gọi) của một vùng khác thì phải thoả mãn 2 điều kiện:
1 - Điều kiện "public": code được gọi phải được khai báo là public. Từ khoá private "che" code, không cho bên ngoài vùng nhìn thấy.
2 - Điều kiện tên vùng ("namespace"): nếu có sự trùng tên thì code gọi phải cho biết mình gọi code của vùng nào, bằng cách lắp tên vùng đi trước code: tenVung.Code

Ví dụ: Code của vùng/module A muốn gọi hàm Ham1 của vùng/module B thì ghi B.Ham1, muốn nhắc tới biến Bien1 của B thì ghi B.Bien1. Và cả 2 Ham1 và Bien1 đều phải public

Như vậy, trong Module1 của Modules muốn gọi Worksheet_SelectionChange của Sheet1 thì dùng như sau:
Call Sheet1.Worksheet_SelectionChange (range gì đó)
Và phải vào Sheet1, sửa lại hàm Worksheet_SelectionChange thành public

Lưu ý: Các sự kiện của workbook, sheets, forms, ... được Excel mặc định cho gọi thẳng các hàm liên hệ. Sự kiện xảy ra trong vùng nào được coi như thuộc về vùng đó và xử lý trong vùng đó. Ví dụ selection change xảy ra ở Sheet2 thì được xử lý bằng Sheet2.Worksheet_SelectionChange. Nếu muốn nó xử lý Sheet1.Worksheet_SelectionChange thì đặt lệnh
Call Sheet1.Worksheet_SelectionChange (target)
bên trong Sheet2.Worksheet_SelectionChange
 
Upvote 0
Em xin cảm ơn bác ndu96081631 với cách giải thích rất dễ hiểu.
Cũng xin lưu ý rằng: Tôi chỉ nói ngắn gọn cho người mới học như bạn dễ hiểu và tiếp cận nhanh với vấn thôi chứ định nghĩa ấy chưa phải là chính xác (sau này khi đi sâu thì bạn sẽ tự cảm nhận)
Và em cũng có cùng quan điểm với bạn Chuot0106:
Tôi học cho chính tôi còn chưa xong thì... dạy ai? Nên chỉ dám chia sẻ kiến thức cò con cho ai cần đến thôi
Viết sách cho người ta chọi đá vào mặt... Ẹc... Ẹc...
 
Upvote 0
Cũng xin lưu ý rằng: Tôi chỉ nói ngắn gọn cho người mới học như bạn dễ hiểu và tiếp cận nhanh với vấn thôi chứ định nghĩa ấy chưa phải là chính xác (sau này khi đi sâu thì bạn sẽ tự cảm nhận)

Tôi học cho chính tôi còn chưa xong thì... dạy ai? Nên chỉ dám chia sẻ kiến thức cò con cho ai cần đến thôi
Viết sách cho người ta chọi đá vào mặt... Ẹc... Ẹc...
Em nghĩ bác quá kiêm tốn đấy thôi, vì với kiến thức về Excel uyên bác của bác đã được mọi người thừa nhận trên diễn đàn GPE này rồi. Em nghĩ có thể bác bận hoặc không thích viết thôi chứ với bác đó là chuyện nhỏ, hihii.
Em cũng biết ngoài bác ra thì trên diễn đàn này có rất nhiều người giỏi trong đó phải kể đến các bác đã có tuổinhư: Bác Bate, SA_DQ, ChanhTQ, Hyen17....Rồi lớp trẻ có: HoangTrongNghia, NghiaPhuc,leonguyenz, dhn46,hungppc1...
Và trong thời gian gần đây có 2 thành viên mới nổi đó là:phucbugis, chuot0106
Tất cả mọi người trên diễn đàn em đều yêu quý và mến mộ tài năng.
Cuối cùng em xin kính chúc bác cũng như các thành viên khác và gia đình dồi dào sức khỏe và bình an.
 
Upvote 0
Em nghĩ bác quá kiêm tốn đấy thôi, vì với kiến thức về Excel uyên bác của bác đã được mọi người thừa nhận trên diễn đàn GPE này rồi. Em nghĩ có thể bác bận hoặc không thích viết thôi chứ với bác đó là chuyện nhỏ, hihii.
Em cũng biết ngoài bác ra thì trên diễn đàn này có rất nhiều người giỏi trong đó phải kể đến các bác đã có tuổinhư: Bác Bate, SA_DQ, ChanhTQ, Hyen17....Rồi lớp trẻ có: HoangTrongNghia, NghiaPhuc,leonguyenz, dhn46,hungppc1...
Và trong thời gian gần đây có 2 thành viên mới nổi đó là:phucbugis, chuot0106
Tất cả mọi người trên diễn đàn em đều yêu quý và mến mộ tài năng.
Cuối cùng em xin kính chúc bác cũng như các thành viên khác và gia đình dồi dào sức khỏe và bình an.

Việc hiểu biết đưa ra nhiều giải pháp cũng như những giải thích cho các thành viên hiểu chưa phải là đã chuẩn mực để có thể đưa ra thành câu từ, định nghĩa một cách chuẩn mực trong sách bạn à (vì tin học vô cùng rộng, VBA chỉ là một ngôn ngữ diễn tả cách thức lập trình thôi, còn nhiều người họ không biết ngôn ngữ VBA nhưng trình độ tin của họ thuộc hàng khủng). Trường hợp khác, có những người viết sách nhưng kỹ năng lập trình cũng như tư duy thuật toán kém, chỉ biết copy của người khác rồi gom lại vào sách của mình thì trình độ lại rất bình thường.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom