Cách Gọi Sub Và Sử Dụng Class Module Trong Lập Trình VBA

Liên hệ QC

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,421
Được thích
4,032
Giới tính
Nam
Mình đang tập nghiên cứu Class Module trong VBA mà chưa biết bắt đầu từ đâu ... cách thức và phương thức như thế nào ....Nói chung đang Tịt từ ABC...

Vậy mình xin lập đề tài này để cùng các Bạn trao đổi thảo luận về cách lập trình VBA trong Class Module...

Nếu Bạn nào có thắc mắc hay muốn hỏi gì về các sự kiện liên quan Tới Class Module thì ta cũng Úp bài lên đây gom lại một nơi để sau này có thành viên nào cần nghiên cứu và tham khảo thì vào đây coi cho nó tiện.. và nếu Bạn nào có sáng kiến hay muốn chia sẻ thì xin úp lên cho mọi người cùng nghiên cứu ....

Mình tập viết một Sub trên Module sau khi Sub này chạy xong thì gọi Sub tiếp theo Trong Class module mà lỗi code trong Class Module ....

Một cái rất đơn giản mà chưa biết cách xử lý vậy nhờ các Bạn Trợ Giúp....
Xin cảm ơn các Bạn

Code trong Module
PHP:
Sub Test_Module1()
    MsgBox "Day la code tren Module", 64, "OK"
    Call Test_Class1 ''Loi cai nay va cach xu ly de goi no chay
End Sub

Code trong Class Module
PHP:
Sub Test_Class1()
    MsgBox "Day la code tren Class1", 64, "OK"
End Sub
 

File đính kèm

  • Test.xlsb
    14.7 KB · Đọc: 65
Rất tiếc, tôi không có thói quen hack thế, và có gì trong đó đáng giá đâu mà hack thậm chí cả kho GPE này còn chẳng có gì đáng giá, huống hồ thử....
Vấn đề ở đây không phải đáng giá hay không đáng giá ... mà khi ta viết một ứng dụng nào đó cần bảo mật thì cách tốt nhất ta đem nó ra thử sức ...

VD chương trình diệt virus thì phải mang ra diệt virus xem khả năng của nó tới đâu thôi chư cứ nói diệt tốt mà chạy thấy virus bỏ qua thì làm gì nữa

Vấn đề này nên hiểu đơn giản là mang ra thử lửa vậy thôi .....còn những gì không liên quan đến đề tài này xin các bạn không Bàn luận...
xin cảm ơn
 
Upvote 0
...
Tại vì Em viết trên VB6 thấy một cái Class Có nhiều code quá khó kiểm soát nên em chia ra nhiều Class trong mỗi Class lại có một sub hoặc 2 .. giống nhau ...vì nó trùng thừa nên Em mới tìm hiểu cách gọi Sub với các Class với nhau và từ Module sang Class ....để xóa bớt Sub trùng
...

Tôi không rõ bạn muốn làm gì. Nhưng làm như thế này là đi ngược lại nguyên tắc lập trình hướng đối tượng.
Theo đúng luật, bạn không cần kiểm soát code của class. Tức là không cần biết nó được viết ra sao. Chỉ cần biết nó làm gì, dựa vào cái giao diện của nó (các thuộc tính/hàm/phương thức public) mà dựng đối tượng sử dụng nó.

code trong Class
Mã:
Private hoten As String
Private Diemso As Double


Public Sub [COLOR=#FF0000]SETTT[/COLOR](Ten As String, diem As Double)
hoten = Ten
Diemso = diem
End Sub


Public Sub [COLOR=#FF0000]GETTT[/COLOR]()
MsgBox hoten
MsgBox Diemso
End Sub

code trong Module
Mã:
Sub TEST()
Dim OBJ As Object
   Set OBJ = New Class2
   Call OBJ.SETTT("Ho Ngoc Phi", 10)
   Call OBJ.GETTT
End Sub
thử code này xem sao, xem có sáng kiến nào không?

Sáng kiến thì khong dám. Chỉ thấy bạn dùng GET/SET nên nghĩ có lẽ bạn muốn dùng accessors. Nếu vậy thì VBA có cách cổ điển của nó là dùng Property Get và Property Let.
Nếu cả Get (read/truy) và Let (write/gán) đều là public thì property (thuộc tính) ấy read-write, nếu Let private thì thuộc tính ReadOnly, nếu Get private thì thuộc tính WriteOnly
 
Lần chỉnh sửa cuối:
Upvote 0
Qua cái File *dll đó nếu Bạn nào muốn bảo mật Excel thì nên ta nên Viết trên *dll và tạo Form đăng ký luôn trong *dll như mình đã từng úp trên GPE .... nếu trong đó có quá nhiều code ta chia ra nhiều Class hay Module và thực hiện gọi sub giữa các Class với nhau và Module như vậy rất tiện

Cơ bản chống háck là kỷ thuật và thuật toán của từng Bạn .... mình đã từng Bị Bạn hau1978 Pacth thành công File *dll ...khi đó kỷ thuật viết code của mình còn kém ....

Muốn không cho dùng Auly Debug.Print từng dòng code là viết code hàm hay sub truyền các tham số cho nhau và không dùng If ... Elseif ... nếu có dùng thì If then ....cho những đoạn code quan trọng ... như vậy nó sẻ không chặn được từng dòng code mà nhảy tới dòng kế tiếp...

Xin chia sẻ vài ý với các Bạn vậy....

Nghe có vẻ cao siêu quá nhỉ. Tôi không biết hack nhưng có bảo mật bằng DLL, bạn thử hack file ở đây xem có được không.
http://www.giaiphapexcel.com/forum/...ể-thức-đấu-loại-trực-tiếp&p=690696#post690696
 
Upvote 0
Nghe có vẻ cao siêu quá nhỉ. Tôi không biết hack nhưng có bảo mật bằng DLL, bạn thử hack file ở đây xem có được không.
http://www.giaiphapexcel.com/forum/...ể-thức-đấu-loại-trực-tiếp&p=690696#post690696
Cách viết của Bạn mã hóa sợ quá ...mở File Excel lên coi code thấy là hết hồn rồi...-\\/.
1/ đầu tiên chạy File Giai dau moi.xlsm nó sẽ kiểm tra xem

trong "C:\Windows\System32\LTD_TT.dll" có File LTD_TT.dll Chưa nếu chưa Có thì In ra một File RegDLL.bat copy File LTD_TT.dll Vào C:\Windows\System32\LTD_TT.dll và đăng ký nó xong Kill RegDLL.bat

2/ Trong LTD_TT.dll Bạn xài một cái Form tên Fm_Registration dùng làm Form đăng Ký...

3/ Xài một hàm lấy CPUID máy tính Và Environ("COMPUTERNAME")

X
ong dùng công Cụ CreateObject("VBScript.RegExp", 0)

Mã hóa Chuỗi Len("hOFsoejfdgNaWxrP7Z8UJG5w9qvuCRY3lp6nI4bcLm0QK2i1TBHkAEMVStyDXz")

xong Ghép Hai chuỗi sau lại
"zpxXVC35rNiZaROKFJvhTGb4o8Bjk1s" & StrReverse("Q9PMHL2mc0wIlDEqfndYU7eygAtSWu6")
..................
..................
.................... Nói chung đau đầu Chịu Thua +-+-+-+.........Trình độ viết code của Bạn Quá cao ....}}}}}
 
Lần chỉnh sửa cuối:
Upvote 0
Cách viết của Bạn mã hóa sợ quá ...mở File Excel lên coi code thấy là hết hồn rồi...-\\/.
1/ đầu tiên chạy File Giai dau moi.xlsm nó sẽ kiểm tra xem

trong "C:\Windows\System32\LTD_TT.dll" có File LTD_TT.dll Chưa nếu chưa Có thì In ra một File RegDLL.bat copy File LTD_TT.dll Vào C:\Windows\System32\LTD_TT.dll và đăng ký nó xong Kill RegDLL.bat

2/ Trong LTD_TT.dll Bạn xài một cái Form tên Fm_Registration dùng làm Form đăng Ký...

3/ Xài một hàm lấy CPUID máy tính Và Environ("COMPUTERNAME")

X
ong dùng công Cụ CreateObject("VBScript.RegExp", 0)

Mã hóa Chuỗi Len("hOFsoejfdgNaWxrP7Z8UJG5w9qvuCRY3lp6nI4bcLm0QK2i1TBHkAEMVStyDXz")

xong Ghép Hai chuỗi sau lại
"zpxXVC35rNiZaROKFJvhTGb4o8Bjk1s" & StrReverse("Q9PMHL2mc0wIlDEqfndYU7eygAtSWu6")
..................
..................
.................... Nói chung đau đầu Chịu Thua +-+-+-+.........Trình độ viết code của Bạn Quá cao ....}}}}}
Ghê thiệt, biên dịch thành DLL rồi mà vẫn đọc được.
Rút kinh nghiệm lần sau mã hóa code file DLL giống như Excel luôn.
 
Upvote 0
Code trong file excel nhìn cũng "bá đạo".
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    79.5 KB · Đọc: 111
Upvote 0
Tôi không rõ bạn muốn làm gì. Nhưng làm như thế này là đi ngược lại nguyên tắc lập trình hướng đối tượng.
Theo đúng luật, bạn không cần kiểm soát code của class. Tức là không cần biết nó được viết ra sao. Chỉ cần biết nó làm gì, dựa vào cái giao diện của nó (các thuộc tính/hàm/phương thức public) mà dựng đối tượng sử dụng nó.



Sáng kiến thì khong dám. Chỉ thấy bạn dùng GET/SET nên nghĩ có lẽ bạn muốn dùng accessors. Nếu vậy thì VBA có cách cổ điển của nó là dùng Property Get và Property Let.
Nếu cả Get (read/truy) và Let (write/gán) đều là public thì property (thuộc tính) ấy read-write, nếu Let private thì thuộc tính ReadOnly, nếu Get private thì thuộc tính WriteOnly
Quay lại với đề tài này..
Mình có được học hành lập trình trường lớp nào đâu lên GPE tải file về quậy chơi diết rồi ngộ ra code thôi mà...Nhưng mình viết như vậy thấy nó vẫn chạy tốt và giúp mình xóa bớt mấy sub trùng đi cho nó gọn mà ....không biết nó có ảnh hưởng gì chung trong tổng thể code ....+-+-+-++-+-+-+
Cảm ơn Bạn
 
Upvote 0
Quay lại với đề tài này..
Mình có được học hành lập trình trường lớp nào đâu lên GPE tải file về quậy chơi diết rồi ngộ ra code thôi mà...Nhưng mình viết như vậy thấy nó vẫn chạy tốt và giúp mình xóa bớt mấy sub trùng đi cho nó gọn mà ....không biết nó có ảnh hưởng gì chung trong tổng thể code ....+-+-+-++-+-+-+
Cảm ơn Bạn
Lập trình hướng đối tượng cứ hiểu nôn na như thế này, người ta viết ra 1 đối tượng nào, người ta muốn che dấu tất cả các các thuộc tính và phương thức, mình chỉ biết xài thôi, ví dụ rõ nhất trong vba
đối tượng Range, mình đâu biết bên trong nó làm cái gì đâu nè, mà mình vẫn xài được, Range("").phương thức, Range("").thuộc tính, Kiều mạnh thử dùng công cụ nào đó mổ sẻ ra coi thằng đối tượng Range nó có những cái gì?
 
Upvote 0
Lập trình hướng đối tượng cứ hiểu nôn na như thế này, người ta viết ra 1 đối tượng nào, người ta muốn che dấu tất cả các các thuộc tính và phương thức, mình chỉ biết xài thôi, ví dụ rõ nhất trong vba
đối tượng Range, mình đâu biết bên trong nó làm cái gì đâu nè, mà mình vẫn xài được, Range("").phương thức, Range("").thuộc tính, Kiều mạnh thử dùng công cụ nào đó mổ sẻ ra coi thằng đối tượng Range nó có những cái gì?

Quan trọng là: lập trình hướng đối tượng là thay đổi hoàn toàn phương pháp tư duy lập trình (về vĩ mô) khi giải quyết vấn đề thực tế.
 
Upvote 0
Lập trình hướng đối tượng cứ hiểu nôn na như thế này, người ta viết ra 1 đối tượng nào, người ta muốn che dấu tất cả các các thuộc tính và phương thức, mình chỉ biết xài thôi, ví dụ rõ nhất trong vba
đối tượng Range, mình đâu biết bên trong nó làm cái gì đâu nè, mà mình vẫn xài được, Range("").phương thức, Range("").thuộc tính, Kiều mạnh thử dùng công cụ nào đó mổ sẻ ra coi thằng đối tượng Range nó có những cái gì?

Cái chỗ đỏ đỏ nó không hẳn đúng.
Người viết không che dấu. Chỉ chính cái class nó che lại.
Theo nguyên tắc, các phần Public là phần class đưa ra cho sử dụng, các phần Private là các phần nó không đưa ra. Từ "che giấu" có nghĩa là các code khác ngoài class không chạm vào được (không thể truy cập, gọi được).

Khi bạn mua một cái máy tính, hãng sản xuất có cho biết rõ chi tiết hầu hết các cơ phận. Đó không phải là một ví dụ tốt của class.
Ví dụ tốt hơn là cái TV. Nhà sản xuất TV chỉ bảo đảm một số điều, chỗ còn lại bạn không cần biết tới. Bạn vẫn có quyền mở ra xem các cơ phận. Hãng sản xuất chỉ không bảo đảm là chúng luôn như thế. Khi bạn phàn nàn tại sao cùng một kiểu TV mà cái biến thế của bạn không cùng thương hiệu với cái của anh X thì họ sẽ trả lời:
- Theo đúng điều lệ quảng cáo, chúng tôi chỉ bảo đảm những cái bạn thấy và sử dụng thôi. Phần thiết kế bên trong, chúng tôi có toàn quyền thay đổi.

Chỗ màu xanh chỉ đúng đối với các phần mềm bản quyền. Đối với phần mềm mã nguồn mở, bạn vẫn có thể xem và sửa bên trong chúng.
 
Upvote 0
Tên sub trùng hay khong trùng chả thành vấn đề. Một trong những mục đích của class là để tách rời code khi áp dụng. Nếu trùng tên mà có thành vấn đề thì chả lẽ phải viết lại class?

Bạn ghi 3 cái class modules này:

Class module Test1:
Public Sub MethodA()
MsgBox "MethodA trong Test_1"
End Sub

Class module Test2:
Public Sub MethodA()
MsgBox "MethodA trong Test_2"
End Sub

Class module Test3:
Private x As String
Sub MethodA()
MsgBox "tri cua x: " & x
End Sub
Sub GanTriX(ByVal tri As String)
x = tri
End Sub

Xong, ghi cái này vào Module1:

Sub t()

' test 1 variables, 2 objects of different classes
' 1 biến, khởi đầu là 1 class, sau đó đổi thành class khác
Dim obj As Object
Set obj = New Test1
obj.MethodA
Set obj = New Test2
obj.MethodA

' test two variables, two objects of same class
' 2 biến khác nhau, cùng 1 class
Dim obj1 As Object, obj2 As Object
Set obj1 = New Test3
Set obj2 = New Test3 ' same class, different object
obj1.GanTriX "The First"
obj2.GanTriX "The Second"
obj1.MethodA
obj2.MethodA

' array elements
' mảng 2 phần tử, mỗi phần tử là 1 đối tượng, cùng class
Dim objA(1 To 2) As Object
For i = 1 To 2
Set objA(i) = New Test3
objA(i).GanTriX "Element number " & i
Next

For i = 1 To 2
objA(i).MethodA
Next

End Sub
Anh ơi cho e hỏi là dòng
"Sub GanTriX(ByVal tri As String)
x = tri
End Sub"
thì chữ "GanTriX" nó là tên sub hay là biến ạ..
vì e thử tạo trong module sub này thì nhấn f5 ko chạy... nhưng khi thông qua dòng sub này trong module:
Dim obj1 As Object, obj2 As Object
Set obj1 = New Test3
Set obj2 = New Test3 ' same class, different object
obj1.GanTriX "The First"
obj2.GanTriX "The Second"
thì GanTriX lại chạy như 1 sub ( ý là theo từng bước : đầu tiên là nhận giá trị "The first" sau đó thì cho nó và biến "x")
và 1 điều nữa tại sao mọi sub trong class module lại ko cho chạy mà chỉ cho gọi đc từ module thông qua 1 object ạ.. hay chỉ là do mặc định vba đã vậy rồi ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi cho e hỏi là dòng
"Sub GanTriX(ByVal tri As String)
x = tri
End Sub"
thì chữ "GanTriX" nó là tên sub hay là biến ạ..
vì e thử tạo trong module sub này thì nhấn f5 ko chạy... nhưng khi thông qua dòng sub này trong module:
Dim obj1 As Object, obj2 As Object
Set obj1 = New Test3
Set obj2 = New Test3 ' same class, different object
obj1.GanTriX "The First"
obj2.GanTriX "The Second"
thì GanTriX lại chạy như 1 sub ( ý là theo từng bước : đầu tiên là nhận giá trị "The first" sau đó thì cho nó và biến "x")
và 1 điều nữa tại sao mọi sub trong class module lại ko cho chạy mà chỉ cho gọi đc từ module thông qua 1 object ạ.. hay chỉ là do mặc định vba đã vậy rồi ạ

Theo như câu hỏi của bạn thì bạn đừng nên rớ vô mấy cái class này, coi chừng "tẩu hoả nhập ma"... :) .
Học và hiểu cách tạo các thủ tục (Sub) và hàm (Function) trong standard module trước cho rành rồi hẳn nhảy vô ngâm cứu class.
 
Upvote 0
Theo như câu hỏi của bạn thì bạn đừng nên rớ vô mấy cái class này, coi chừng "tẩu hoả nhập ma"... :) .
Học và hiểu cách tạo các thủ tục (Sub) và hàm (Function) trong standard module trước cho rành rồi hẳn nhảy vô ngâm cứu class.
bạn ơi bạn có link để học thêm các cách viết sub với hàm ko.. vì trong sách vba chỉ có cách viết cơ bản thôi!
cảm ơn :)
 
Upvote 0
bạn ơi bạn có link để học thêm các cách viết sub với hàm ko.. vì trong sách vba chỉ có cách viết cơ bản thôi!
cảm ơn :)
Sách nào? Nếu là sách phổ biến của diễn đàn này thì có tên tác giả ấy, cứ hỏi thẳng tác giả thôi.

Muốn học trên cách viết cơ bản chỉ có 2 cách:
1. thực tập rất rất là nhiều. Mỗi lần vướng víu thì chịu khó bỏ ra 4 tiếng đồng hồ tự debug và tìm hiểu. Nếu sau thới gian ấy mà vẫn bí thì lên đây hỏi.
2. học căn bản lập trình. Trong môn căn bản lập trình sẽ dạy rất kỹ lưỡng về cấu trúc các chương trình con, tức là Sub và Function.
 
Upvote 0
bạn ơi bạn có link để học thêm các cách viết sub với hàm ko.. vì trong sách vba chỉ có cách viết cơ bản thôi!
cảm ơn :)

Tôi nhớ là có bạn Hesanbi có chia sẽ thêm mấy tài liệu về VBA đó, bạn kiếm lại đi. Đính kèm là một trong các tài liệu ấy.
Cách tôi học VBA là tôi tự đưa ra một cái ứng dụng liên quan đến công việc mình làm và bắt đầu tìm hiểu, viết code cho từng nghiệp vụ cụ thể đó. Khi đó bạn đã có mục tiêu thì việc học sẽ dễ hơn chứ không lang mang, mông lung.
 

File đính kèm

  • vba.pdf
    2.8 MB · Đọc: 33
Upvote 0
Sách nào? Nếu là sách phổ biến của diễn đàn này thì có tên tác giả ấy, cứ hỏi thẳng tác giả thôi.

Muốn học trên cách viết cơ bản chỉ có 2 cách:
1. thực tập rất rất là nhiều. Mỗi lần vướng víu thì chịu khó bỏ ra 4 tiếng đồng hồ tự debug và tìm hiểu. Nếu sau thới gian ấy mà vẫn bí thì lên đây hỏi.
2. học căn bản lập trình. Trong môn căn bản lập trình sẽ dạy rất kỹ lưỡng về cấu trúc các chương trình con, tức là Sub và Function.
Tôi nhớ là có bạn Hesanbi có chia sẽ thêm mấy tài liệu về VBA đó, bạn kiếm lại đi. Đính kèm là một trong các tài liệu ấy.
Cách tôi học VBA là tôi tự đưa ra một cái ứng dụng liên quan đến công việc mình làm và bắt đầu tìm hiểu, viết code cho từng nghiệp vụ cụ thể đó. Khi đó bạn đã có mục tiêu thì việc học sẽ dễ hơn chứ không lang mang, mông lung.
cảm ơn bạn rất nhiều !trước đó thì mình cũng dự tính vậy .. mà sau khi xem sách phần cơ bản( vì chưa thấy phần nâng cao.) thì thấy trình còn yếu quá nên lên diễn đàn thông qua đó học hỏi và rèn luyện code cho nhớ .. rồi xem các thắc mắc của các ban đăng lên rồi vào xem coi giải quyết đc ko.. đồng thời coi cách các bạn khác viết code luôn :) .. Nói chung qua diễn đàn mình học hỏi đc rất nhiều
 
Upvote 0
Web KT
Back
Top Bottom