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

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,017
Được thích
2,795
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
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
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
9,526
Được thích
11,415
Điểm
1,560
...
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:

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,531
Được thích
8,688
Điểm
860
Nơi ở
TP.HCM
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
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,017
Được thích
2,795
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
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:

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,531
Được thích
8,688
Điểm
860
Nơi ở
TP.HCM
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.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,017
Được thích
2,795
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
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
 

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,320
Được thích
2,414
Điểm
860
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ì?
 

lightd

Thành viên chính thức
Tham gia ngày
12 Tháng mười 2011
Bài viết
63
Được thích
12
Điểm
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ế.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
9,526
Được thích
11,415
Điểm
1,560
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.
 

1convit789

Thành viên chính thức
Tham gia ngày
16 Tháng mười 2013
Bài viết
94
Được thích
43
Điểm
370
Tuổi
27
Nơi ở
Nha Trang - Việt Nam
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:

ongke0711

Thành viên tiêu biểu
Tham gia ngày
7 Tháng chín 2006
Bài viết
651
Được thích
726
Điểm
860
Nơi ở
HCM
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.
 

1convit789

Thành viên chính thức
Tham gia ngày
16 Tháng mười 2013
Bài viết
94
Được thích
43
Điểm
370
Tuổi
27
Nơi ở
Nha Trang - Việt Nam
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 :)
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
9,526
Được thích
11,415
Điểm
1,560
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.
 

ongke0711

Thành viên tiêu biểu
Tham gia ngày
7 Tháng chín 2006
Bài viết
651
Được thích
726
Điểm
860
Nơi ở
HCM
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

1convit789

Thành viên chính thức
Tham gia ngày
16 Tháng mười 2013
Bài viết
94
Được thích
43
Điểm
370
Tuổi
27
Nơi ở
Nha Trang - Việt Nam
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
 
Top Bottom