Sử dụng Type để khai báo biến tự lập

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,120
Được thích
24,279
Như các bạn đã biết, VB xây dựng nhiều kiểu biến để đáp ứng những công việc cụ thể. Tuy nhiên, bạn có thể tự tạo ra biến riêng cho mình mà không phụ thuộc vào biến sẵn có.
Bạn có thể sử dụng Type để khai báo biến cho riêng mình. Ví dụ biến của bạn lập là Thongtin. Trong Thongtin có thuộc tính Ten, Diachi, Tuoi, Quequan. Sau đó bạn khai báo như sau (nằm ngoài thủ tục, nằm ở trên):

Mã:
Type Thongtin
  Ten As String 
  Diachi As String
  Tuoi As Integer
  Quequan As String
End Type


Sau đó bạn xây dựng thủ tục chứa biến, bạn sẽ tạo ra một đối tượng Danhsach thuộc kiểu dữ liệu Thongtin:

Mã:
Dim Danhsach As Thongtin

Khi xây dựng thủ tục, đối tượng Danhsach sẽ được gán các thuộc tính tự động Ten, Diachi, Tuoi, Quequan (hình vẽ ...). Khi đó bạn dễ dàng thực hiện giống như các đối tượng sẵn có trong VBA.

Mã:
Sub Hienthongtin()
  Dim Danhsach As Thongtin
    For i = 1 To 1
      With Danhsach
         .Ten = InputBox("Ten nguoi thu " & i)
         .Diachi = InputBox("Dia chi cua " & .Ten)
         .Tuoi = InputBox("Tuoi cua " & .Ten)
         .Quequan = InputBox("Que quan cua " & .Ten)
           MsgBox ("Thong tin ve " & .Ten & Chr(10) & Chr(9) & _
"Dia chi: " & .Diachi & Chr(10) & Chr(9) & "Tuoi : " & _
.Tuoi & Chr(10) & Chr(9) & "Que quan: " & .Quequan)
      End With
    Next
End Sub

Type.jpg
 
Như các bạn đã biết, VB xây dựng nhiều kiểu biến để đáp ứng những công việc cụ thể. Tuy nhiên, bạn có thể tự tạo ra biến riêng cho mình mà không phụ thuộc vào biến sẵn có.
Bạn có thể sử dụng Type để khai báo biến cho riêng mình. Ví dụ biến của bạn lập là Thongtin. Trong Thongtin có thuộc tính Ten, Diachi, Tuoi, Quequan. Sau đó bạn khai báo như sau (nằm ngoài thủ tục, nằm ở trên):

Mã:
Type Thongtin
  Ten As String
  Diachi As String
  Tuoi As Integer
  Quequan As String
End Type


Sau đó bạn xây dựng thủ tục chứa biến, bạn sẽ tạo ra một đối tượng Danhsach thuộc kiểu dữ liệu Thongtin:

Mã:
Dim Danhsach As Thongtin

Khi xây dựng thủ tục, đối tượng Danhsach sẽ được gán các thuộc tính tự động Ten, Diachi, Tuoi, Quequan (hình vẽ ...). Khi đó bạn dễ dàng thực hiện giống như các đối tượng sẵn có trong VBA.

Mã:
Sub Hienthongtin()
  Dim Danhsach As Thongtin
    For i = 1 To 1
      With Danhsach
         .Ten = InputBox("Ten nguoi thu " & i)
         .Diachi = InputBox("Dia chi cua " & .Ten)
         .Tuoi = InputBox("Tuoi cua " & .Ten)
         .Quequan = InputBox("Que quan cua " & .Ten)
           MsgBox ("Thong tin ve " & .Ten & Chr(10) & Chr(9) & _
"Dia chi: " & .Diachi & Chr(10) & Chr(9) & "Tuoi : " & _
.Tuoi & Chr(10) & Chr(9) & "Que quan: " & .Quequan)
      End With
    Next
End Sub

Type.jpg
Mong anh Hướng và mọi người chỉ giúp: tôi làm đúng như trong bài này nhưng không được, loay hoay mãi mới phát hiện ra là phần khai báo trên đầu modul buộc phải dùng thêm từ khóa "Private" mới được. (Private Type Thongtin), nếu chỉ dung "Type thongtin" như hướng dẫn thì báo lỗi!
Tôi đang dùng Excel 2013 ạ. Mong được giải đáp ạ!
 
Mong anh Hướng và mọi người chỉ giúp: tôi làm đúng như trong bài này nhưng không được, loay hoay mãi mới phát hiện ra là phần khai báo trên đầu modul buộc phải dùng thêm từ khóa "Private" mới được. (Private Type Thongtin), nếu chỉ dung "Type thongtin" như hướng dẫn thì báo lỗi!
Tôi đang dùng Excel 2013 ạ. Mong được giải đáp ạ!
Bác đặt TypeThongTin tốt hơn
vì ThongTin sẽ trùng với một biến, hàm, hay một kiểu khác trùng với Type thongtin


Mã:
Public Type TypeThongTin
    a as String
    b as String
    c as String
End Type
Public Type TypThongTin
    a as String
    b as String
    c as String
End Type
Public Type TpThongTin
    a as String
    b as String
    c as String
End Type

Sub test()
   Dim ttt as TypeThongTin
   With ttt
      .a = "Hello"
   End with
   ttt.b = "Good bye"
End Sub

Bác cũng có thể tạo một Lớp - ClassModule, và sử dụng phương thức new. Cách này sẽ tốt hơn khai báo dạng Type, vì nó có thể được lưu trữ đa dạng hơn dạng Type

Code nằm trong Class module có tên clsThongTin
Mã:
Public  a as String
Public  b as String
Public  c as String
Public collec as VBA.Collection

Code nằm trong module
Mã:
Sub test2()
   Dim tt as clsThongTin
   Set  tt = new  clsThongTin
   With tt
      .a = "Hello"
   End with
   tt.b = "Good bye"
   Set tt = nothing
  ' Ta có thể mở rộng biến và lưu trữ bằng một Collection
   Set tt.collec  = New VBA.Collection
   tt.Add New clsThongTin
   tt.Add "See you again", "khóa của giá trị"
End Sub

Khai báo với Type thì dễ dàng clone hơn khai báo Lớp
Ví dụ: Dim tt as TypeThongTin
Dim tt2 as TypeThongTin
tt = tt2
Lúc này giá trị của biến tt thay đổi, nhưng trong tt2 thì không


Khai báo với Lớp lại dễ dàng lưu trữ hơn khai báo Type
Mặc dù clone một lớp khá phức tạp nhưng lớp vẫn được ưu tiên hơn Type, vì lớp năng động hơn Type
Ví dụ: Dim tt as clsThongTin
Dim tt2 as new clsThongTin
set tt = tt2
Lúc này giá trị của biến tt thay đổi, trong tt2 cũng thay đổi theo
Vì hai biến cùng trỏ đến cùng một vùng lưu trữ trong bộ nhớ
 
Mong anh Hướng và mọi người chỉ giúp: tôi làm đúng như trong bài này nhưng không được, loay hoay mãi mới phát hiện ra là phần khai báo trên đầu modul buộc phải dùng thêm từ khóa "Private" mới được. (Private Type Thongtin), nếu chỉ dung "Type thongtin" như hướng dẫn thì báo lỗi!
Tôi đang dùng Excel 2013 ạ. Mong được giải đáp ạ!
Lúc bạn copied cái code kia chắc chắn là có vấn đề.
Gõ lại rõ ràng xem sao? Nếu vẫn bị lỗi thì đưa file lên đây.

Từ khoá "Private" không hề bắt buộc.
Người ta vẫn hay dùng một Module chủ để khai báo các Types dưới dạng "Public" để có thể dùng cho tất cả các modules khác.

Chú thích: Type chỉ là một hình thức để VBA quản lý tầm vực của biến. Nói cách khác là nhóm các biến có liên hệ chặt chẽ với nhau.
 
Xin cảm ơn mọi người nhắc nhở chỉ giúp. Tôi đã làm được rồi ạ.
 
Web KT
Back
Top Bottom