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: 67
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
Mình góp vui nghe không biết có phải cách hay hơn không? nhưng trình độ mình chỉ vậy thôi.
Bạn sửa lại code trong Module như sau:
Mã:
Sub Test_Module1()
    Dim clsX As Class1
    Set clsX = New Class1
        clsX.Test_Class1
    Set clsX = Nothing
End Sub
 
Upvote 0
Class chỉ là cái mẫu khai báo. Muốn sử dụng nó, bạn phải dựng đối tuợng.

Lệnh New chính là lệnh dựng đối tuợng (xem bài #2)

Hoặc bạn cũng có thể làm thế này:
With New Class1
.Test_Class1 ' gọi phương thức của đối tượng không tên dựng ra trong block with
End With

Nếu không muốn dựng đối tượng thì dùng module thường.
 
Upvote 0
Class chỉ là cái mẫu khai báo. Muốn sử dụng nó, bạn phải dựng đối tuợng.

Lệnh New chính là lệnh dựng đối tuợng (xem bài #2)

Hoặc bạn cũng có thể làm thế này:
With New Class1
.Test_Class1 ' gọi phương thức của đối tượng không tên dựng ra trong block with
End With

Nếu không muốn dựng đối tượng thì dùng module thường.
Cảm ơn Bạn.... cách viết này rất ngắn gọn

Vậy trong trường hợp mình có nhiều Class thì có thể đặt nó vào một Function hay một Array("1","2","3"...") được không... để khi cần mình có thể goi nó mà không phải khai báo lại

(tên Sub trong các Class không Trùng)
 
Upvote 0
[h=2]Tôi chẳng biết Class Module là cái gì cả[/h]Nhưng chỉ biết khai báo cái gì bên đó thì tất cả các sub trong Module đều dùng được, không biết phải vậy không???????
 
Upvote 0
Nếu Bạn biết chỉ cho một tí đi ...--=0

Em ở gần QuangHai1969, sao không gặp em nó cho lẹ, còn anh chỉ có biết nhậu thôi, hôm nào em với QuangHai1969 qua Đồng Nai ghé nhà anh chơi (QuangHai biết nhà anh).

Nếu qua nhớ thông tin cho anh biết trước để thông tin cho các chiến hữu ở Đồng Nai biết mà ngênh chiến.
 
Upvote 0
Em ở gần QuangHai1969, sao không gặp em nó cho lẹ, còn anh chỉ có biết nhậu thôi, hôm nào em với QuangHai1969 qua Đồng Nai ghé nhà anh chơi (QuangHai biết nhà anh).

Nếu qua nhớ thông tin cho anh biết trước để thông tin cho các chiến hữu ở Đồng Nai biết mà ngênh chiến.
Ok Anh ... em qua đồng nai thường mà ...Em gặp Anh ở vườn cau Sinh nhật GPE năm 2014 rồi
 
Upvote 0
Ok Anh ... em qua đồng nai thường mà ...Em gặp Anh ở vườn cau Sinh nhật GPE năm 2014 rồi

Nhưng lúc đó anh chưa biết em, vậy bây giờ làm lại, hôm tháng trước các chiến hữu gặp nhau nhưng chưa biết em nên không gọi, lần sau anh sẽ gọi QuangHai1969 kêu em cùng tham gia cho vui.
 
Upvote 0
Ok Anh ... em qua đồng nai thường mà ...Em gặp Anh ở vườn cau Sinh nhật GPE năm 2014 rồi

Nhưng lúc đó anh chưa biết em, vậy bây giờ làm lại, hôm tháng trước các chiến hữu gặp nhau nhưng chưa biết em nên không gọi, lần sau anh sẽ gọi QuangHai1969 kêu em cùng tham gia cho vui.

Chắc xỉn hay sao ấy, nhấn nút trả lời mà lại ra 2 bài viết cùng 1 lúc.
 
Lần chỉnh sửa cuối:
Upvote 0
...

Vậy trong trường hợp mình có nhiều Class thì có thể đặt nó vào một Function hay một Array("1","2","3"...") được không... để khi cần mình có thể goi nó mà không phải khai báo lại

(tên Sub trong các Class không Trùng)

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
 
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
Test thử thấy nó báo lỗi Sub Thứ 2 Trong Class (Hình kèm theo)
Đã test lại OK ( Xin lỗi Bạn)
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    15.4 KB · Đọc: 124
Lần chỉnh sửa cuối:
Upvote 0
Bạn phải insert 3 cái Class chứ. sau bỏ chung vào 1 class được !
OK bạn đúng vậy....--=0--=0

cách viết bài #11 ok rồi đó nhưng để ứng dụng nó vào thực tế mình thấy khó
Ví dụ như mình có thể viết thành một Hàm tổng quát khi cần gọi một Sub nào trong Class là mình gọi thôi

VD: TenHam(Ten Sub Trong Class) ... như vậy ứng dụng nó sẽ dễ ràng hơn
 
Lần chỉnh sửa cuối:
Upvote 0
code trong Class
Mã:
Private hoten As String
Private Diemso As Double


Public Sub SETTT(Ten As String, diem As Double)
hoten = Ten
Diemso = diem
End Sub


Public Sub GETTT()
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?
 
Upvote 0
OK bạn đúng vậy....--=0--=0

cách viết bài #11 ok rồi đó nhưng để ứng dụng nó vào thực tế mình thấy khó
Ví dụ như mình có thể viết thành một Hàm tổng quát khi cần gọi một Sub nào trong Class là mình gọi thôi

VD: TenHam(Ten Sub Trong Class) ... như vậy ứng dụng nó sẽ dễ ràng hơn

Tôi đang thắc mắc 1 việc: Không biết bạn có biết lý do cần thiết phải dùng class là gì không? Hay vì bạn thấy class nó "lạ lạ" nên muốn "thử" chơi vậy thôi?
Một trong những việc mà class có thể làm là: TẠO RA SỰ KIỆN NGƯỜI DÙNG. Bạn đã xem qua bài này chưa:
http://www.giaiphapexcel.com/forum/showthread.php?37075-Dùng-Class-Module-để-tạo-sự-kiện-người-dùng
???
Nếu đã xem thì tôi nghĩ đó là bài viết dạng cơ bản nhất (mức thấp nhất) để tiếp cận với class rồi còn gì
 
Upvote 0
Tôi đang thắc mắc 1 việc: Không biết bạn có biết lý do cần thiết phải dùng class là gì không? Hay vì bạn thấy class nó "lạ lạ" nên muốn "thử" chơi vậy thôi?
Một trong những việc mà class có thể làm là: TẠO RA SỰ KIỆN NGƯỜI DÙNG. Bạn đã xem qua bài này chưa:
http://www.giaiphapexcel.com/forum/showthread.php?37075-Dùng-Class-Module-để-tạo-sự-kiện-người-dùng
???
Nếu đã xem thì tôi nghĩ đó là bài viết dạng cơ bản nhất (mức thấp nhất) để tiếp cận với class rồi còn gì
Em đọc rồi và em cũng muốn tìm hiểu thêm có giải pháp nào mới hơn không đó Anh...

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
vấn đề của Em đã giải quyết Ok rồi ...
Cuối cùng Em chọn cách ngắn gọn theo Bài #3
PHP:
Public Sub Test_MyClass()
With New MyClass ''MyClass = Ten ClassModule
    .Test_Class1 ''Test_Class1 = Ten Sub trong ClassModule
End With
End Sub
 
Upvote 0
code trong Class
Mã:
Private hoten As String
Private Diemso As Double


Public Sub SETTT(Ten As String, diem As Double)
hoten = Ten
Diemso = diem
End Sub


Public Sub GETTT()
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?
Ngắn gọn ứng dụng thực tế OK
Mình Xài chung dòng này Public OBJ As Object
 
Upvote 0
Class dùng làm vì vậy các anh? Ứng dụng cụ thể đi, chung chung thế này khó hiểu thật.
 
Upvote 0
Class dùng làm vì vậy các anh? Ứng dụng cụ thể đi, chung chung thế này khó hiểu thật.
Thì bạn Ngâm cứu từ bài #1 đến Bài #16 xong vào link Anh Ndu cho bài ở bài #16 đó ngâm cứu đi nha

Mình hỏi để ứng dụng lên Form trên File (*.dll - VB6) Bạn tải về quậy chơi nha

Chạy File Install_TestClass.bat để sử dung
 

File đính kèm

  • Test.rar
    29.9 KB · Đọc: 64
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom