Kiểu dữ liệu có cấu trúc trong VBA

Liên hệ QC

phihndhsp

Thành viên gạo cội
Tham gia
26/12/09
Bài viết
3,363
Được thích
2,488
Giới tính
Nam
Nghề nghiệp
Giáo Viên
Kiểu dữ liệu có cấu trúc
trên diễn đàn GPE mình chỉ thấy dữ liệu có cấu trúc toàn là mảng không? nhưng trong thực tế thì 1 đối tuợng có thể có nhiều giá trị có từng dữ liệu khác nhau. tôi mới nghĩ đến Struct trong C++
nhưng khi thao tác trên VBA thì nó lại báo lỗi. xin được chỉ giáo tại sao nó lại lỗi. Xin cảm ơn

''''''''''''''''Khai báo kiểu nhân viên có 7 trường dữ liệu
Mã:
Type NhanVien
       Dim STT As Integer  ''''''''truong so thu tu toi da la 10000
         MA_NV As String ''''''''''ma nhan vien kieu chuoi
         Ten_NV As String '''''''''''ten nhan  vien kieu chuoi
         CV_NV As String '''''''''''''''' cong viec kieu chuoi
         Ngay_Lam As Date ''''''''''''''''ngay vao lam kieu datetime
         Thang As Byte ''''''''''''''''''thang toi da la 12 nen cho kieu du lieu la byte
         Luong As Long '''''''''''''''''''tien luong kieu du lieu la long
End Type
'''''''''khai báo mảng 1000 nhân viên 
Dim ArrNV(1000) As NhanVien ''''''''''''khai bao 10000  nhan vien
 
Kiểu dữ liệu có cấu trúc
trên diễn đàn GPE mình chỉ thấy dữ liệu có cấu trúc toàn là mảng không? nhưng trong thực tế thì 1 đối tuợng có thể có nhiều giá trị có từng dữ liệu khác nhau. tôi mới nghĩ đến Struct trong C++
nhưng khi thao tác trên VBA thì nó lại báo lỗi. xin được chỉ giáo tại sao nó lại lỗi. Xin cảm ơn

''''''''''''''''Khai báo kiểu nhân viên có 7 trường dữ liệu
Mã:
Type NhanVien
       [COLOR=#ff0000]Dim [/COLOR]STT As Integer  ''''''''truong so thu tu toi da la 10000
         MA_NV As String ''''''''''ma nhan vien kieu chuoi
         Ten_NV As String '''''''''''ten nhan  vien kieu chuoi
         CV_NV As String '''''''''''''''' cong viec kieu chuoi
         Ngay_Lam As Date ''''''''''''''''ngay vao lam kieu datetime
         Thang As Byte ''''''''''''''''''thang toi da la 12 nen cho kieu du lieu la byte
         Luong As Long '''''''''''''''''''tien luong kieu du lieu la long
End Type
'''''''''khai báo mảng 1000 nhân viên 
Dim ArrNV(1000) As NhanVien ''''''''''''khai bao 10000  nhan vien
Bỏ chữ "Dim" màu đỏ thử xem
 
Upvote 0
nó vẫn báo lỗi. lúc đầu có DIM hết cũng báo lỗi sau đó xoá hết nó cũng báo lỗi.
 
Upvote 0
Kiểu dữ liệu có cấu trúc
trên diễn đàn GPE mình chỉ thấy dữ liệu có cấu trúc toàn là mảng không? nhưng trong thực tế thì 1 đối tuợng có thể có nhiều giá trị có từng dữ liệu khác nhau. tôi mới nghĩ đến Struct trong C++
nhưng khi thao tác trên VBA thì nó lại báo lỗi. xin được chỉ giáo tại sao nó lại lỗi. Xin cảm ơn

''''''''''''''''Khai báo kiểu nhân viên có 7 trường dữ liệu
Mã:
Type NhanVien
       Dim STT As Integer  ''''''''truong so thu tu toi da la 10000
         MA_NV As String ''''''''''ma nhan vien kieu chuoi
         Ten_NV As String '''''''''''ten nhan  vien kieu chuoi
         CV_NV As String '''''''''''''''' cong viec kieu chuoi
         Ngay_Lam As Date ''''''''''''''''ngay vao lam kieu datetime
         Thang As Byte ''''''''''''''''''thang toi da la 12 nen cho kieu du lieu la byte
         Luong As Long '''''''''''''''''''tien luong kieu du lieu la long
End Type
'''''''''khai báo mảng 1000 nhân viên 
Dim ArrNV([COLOR=#ff0000][B]1000[/B][/COLOR]) As NhanVien ''''''''''''khai bao [COLOR=#ff0000][B]10000  [/B][/COLOR]nhan vien
Mảng khai báo 1000 mà số nhân viên lên đến gấp 10 lần, xem lại nhé!
 
Upvote 0
vẫn bị sai khi khai báo 2 nhân viên
nhưng cái này khai báo 1000 NV cũng không vấn đề gì?
lỗi của nó là như vầy xin các anh xem dùm
Picture1.jpg
 
Upvote 0
vẫn bị sai khi khai báo 2 nhân viên
nhưng cái này khai báo 1000 NV cũng không vấn đề gì?
lỗi của nó là như vầy xin các anh xem dùm
View attachment 111061

Bạn nhìn code nhé:

Mã:
[COLOR=#0000ff][B]Public [/B][/COLOR]Type NhanVien
    STT As Integer  ''''''''truong so thu tu toi da la 10000
    MA_NV As String ''''''''''ma nhan vien kieu chuoi
    Ten_NV As String '''''''''''ten nhan  vien kieu chuoi
    CV_NV As String '''''''''''''''' cong viec kieu chuoi
    Ngay_Lam As Date ''''''''''''''''ngay vao lam kieu datetime
    Thang As Byte ''''''''''''''''''thang toi da la 12 nen cho kieu du lieu la byte
    Luong As Long '''''''''''''''''''tien luong kieu du lieu la long
End Type


[COLOR=#ff0000][B]Public [/B][/COLOR]NV_Array(10) As NhanVien

Cái màu xanh ở trên có thể có có thể không (nếu ở cùng Module, khác module phải là Public), nhưng màu đỏ thì hoặc là Private hoặc là Public (không nên dùng Dim).
 
Lần chỉnh sửa cuối:
Upvote 0
nó vẫn báo lỗi anh nghĩa ơi.
 
Upvote 0
nó vẫn báo lỗi anh nghĩa ơi.
Gì kỳ vậy? bạn làm như thế nào mà nó báo lỗi?

Ôi trời ơi, tôi nhìn lại cái hình, tôi thấy rồi, làm ơn bỏ những cái thủ tục tôi vừa làm ở ngoài và đặt chúng trên cùng module dùm cái! Bạn đi bỏ nó vào trong cái Public Sub TRICHLOC_STRUCT() gì gì đó thì lỗi là phải rồi!
 
Lần chỉnh sửa cuối:
Upvote 0
Gì kỳ vậy? bạn làm như thế nào mà nó báo lỗi?

Ôi trời ời, tôi nhìn lại cái hình, tôi thấy rồi, làm ơn bỏ những cái thủ tục tôi vừa làm ở ngoài và trên cùng module dùm cái! Bạn đi bỏ nó vào trong cái Public Sub TRICHLOC gì gì đó thì lỗi là phải rồi!
anh có thể xem file em làm
em định làm 1 cái trích lọc dạng mảng
1 cái trích lọc dạng struct. mục đích làm muốn chuyển đổi ngôn ngữ sang VBA
 

File đính kèm

  • STRUCT.rar
    73.4 KB · Đọc: 22
Upvote 0
anh có thể xem file em làm
em định làm 1 cái trích lọc dạng mảng
1 cái trích lọc dạng struct. mục đích làm muốn chuyển đổi ngôn ngữ sang VBA

Tôi đã bổ sung phần này rồi còn gì?

Ôi trời ơi, tôi nhìn lại cái hình, tôi thấy rồi, làm ơn bỏ những cái thủ tục tôi vừa làm ở ngoài và đặt chúng trên cùng module dùm cái! Bạn đi bỏ nó vào trong cái Public Sub TRICHLOC_STRUCT() gì gì đó thì lỗi là phải rồi!

Nhìn thử nhé, xem còn lỗi nữa không!

Mã:
Public Type NhanVien
     STT As Integer ''''''''truong so thu tu toi da la 10000
     MA_NV As String ''''''''''ma nhan vien kieu chuoi
     Ten_NV As String '''''''''''ten nhan  vien kieu chuoi
     CV_NV As String '''''''''''''''' cong viec kieu chuoi
     Ngay_Lam As Date ''''''''''''''''ngay vao lam kieu datetime
     Thang As Byte ''''''''''''''''''thang toi da la 12 nen cho kieu du lieu la byte
     Luong As Long '''''''''''''''''''tien luong kieu du lieu la long
End Type


Public ArrNV(1000) As NhanVien   ''''''''''''khai bao 10000  nhan vien




Public Sub TRICHLOC_STRUCT()
'''''''''''''''''''''''dinh nghia kieu du lieu nhan vien
Dim Rngs(), Arr(), I As Long, k As Long, y As Long
'On Error Resume Next
With Sheet1
    Rngs = .Range(.[A3], .[A7000].End(xlUp)).Resize(, 7).Value
End With
        For I = 1 To UBound(Rngs, 1)
            If (Rngs(I, 6) = Sheet2.Range("C2").Value) Then
                    k = k + 1
                    [COLOR=#ff0000]ArrNV[/COLOR](I).STT = Rngs(I, 1)
                    [COLOR=#ff0000]ArrNV[/COLOR](I).MA_NV = Rngs(I, 2)
                    [COLOR=#ff0000]ArrNV[/COLOR](I).Ten_NV = Rngs(I, 3)
                    [COLOR=#ff0000]ArrNV[/COLOR](I).CV_NV = Rngs(I, 4)
                    [COLOR=#ff0000]ArrNV[/COLOR](I).Ngay_Lam = Rngs(I, 5)
                    [COLOR=#ff0000]ArrNV[/COLOR](I).Thang = Rngs(I, 6)
                    [COLOR=#ff0000]ArrNV[/COLOR](I).Luong = Rngs(I, 7)
            End If
        Next I
Sheet2.Range("A10:G6000").ClearContents
Sheet2.Range("A10").Resize(k, 7).Value = ArrNV
  Call DINHDANG(k)
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hiểu rồi. cảm ơn anh nghĩa và các anh trên diễn đàn nhiều
 
Upvote 0
nó vẫn báo lỗi. lúc đầu có DIM hết cũng báo lỗi sau đó xoá hết nó cũng báo lỗi.

Lỗi nghĩa là bạn làm sai chổ nào đó? Ai mà biết được khi bạn không cho file lên
Tôi thì test chẳng lỗi gì cả
Ví dụ:
Mã:
Type NhanVien
  STT As Integer  ''''''''truong so thu tu toi da la 10000
  MA_NV As String ''''''''''ma nhan vien kieu chuoi
  Ten_NV As String '''''''''''ten nhan  vien kieu chuoi
  CV_NV As String '''''''''''''''' cong viec kieu chuoi
  Ngay_Lam As Date ''''''''''''''''ngay vao lam kieu datetime
  Thang As Byte ''''''''''''''''''thang toi da la 12 nen cho kieu du lieu la byte
  Luong As Long '''''''''''''''''''tien luong kieu du lieu la long
End Type
'''''''''khai báo ma?ng 1000 nhân viên
Dim ArrNV(1000) As NhanVien ''''''''''''khai bao 10000  nhan vien
Sub Test()
  ArrNV(0).STT = 1
  ArrNV(0).MA_NV = "Ma001"
  ArrNV(0).Ten_NV = "Tên 001"
  ArrNV(0).CV_NV = "Công viec 001"
  ArrNV(0).Ngay_Lam = #1/1/2000#
  ArrNV(0).Thang = 1
  ArrNV(0).Luong = 1000000
  ArrNV(1).STT = 2
  ArrNV(1).MA_NV = "Ma002"
  ArrNV(1).Ten_NV = "Tên 002"
  ArrNV(1).CV_NV = "Công viec 002"
  ArrNV(1).Ngay_Lam = #1/2/2000#
  ArrNV(1).Thang = 2
  ArrNV(1).Luong = 2000000
  '------------------------------------
  MsgBox ArrNV(0).STT & vbLf & _
         ArrNV(0).MA_NV & vbLf & _
         ArrNV(0).Ten_NV & vbLf & _
         ArrNV(0).CV_NV & vbLf & _
         ArrNV(0).Ngay_Lam & vbLf & _
         ArrNV(0).Thang & vbLf & _
         ArrNV(0).Luong
  MsgBox ArrNV(1).STT & vbLf & _
         ArrNV(1).MA_NV & vbLf & _
         ArrNV(1).Ten_NV & vbLf & _
         ArrNV(1).CV_NV & vbLf & _
         ArrNV(1).Ngay_Lam & vbLf & _
         ArrNV(1).Thang & vbLf & _
         ArrNV(1).Luong
End Sub
Nguyên xi code của bạn đó nha (chỉ bỏ mỗi chữ "Dim" thôi)
 
Lần chỉnh sửa cuối:
Upvote 0
Đã giải quyết xong bước 1
Bài này em có 2 module trích lọc. 1 cái dùng mảng 2 chiều. một cái dùng Struct. (code trích lọc dựa theo Anh BATE)
bây giờ em muốn hỏi là trong module 2
có cách nào gán dữ liệu ở vào sheet2 giống như gán vào modul 1

Mã:
Mã:
[B]Sheet2.Range("A10").Resize(k, 7).Value = Arr[/B]
còn module 2 muốn gán giống như vậy thì làm sao? xin cảm ơn
 

File đính kèm

  • STRUCT.rar
    74.2 KB · Đọc: 30
Upvote 0
Mã:
 Sheet2.Range("A10").Resize(k, 7).Value = [COLOR=#ff0000][B]ArrNV[/B][/COLOR]
code trên thay cho code dưới thì bị lỗi tại ArrNV
Mã:
For I = 1 To k
                     Range("A" & 9 + I).Value = ArrNV(I).STT
                     Range("B" & 9 + I).Value = ArrNV(I).MA_NV
                     Range("C" & 9 + I).Value = ArrNV(I).Ten_NV
                     Range("D" & 9 + I).Value = ArrNV(I).CV_NV
                     Range("E" & 9 + I).Value = ArrNV(I).Ngay_Lam
                     Range("F" & 9 + I).Value = ArrNV(I).Thang
                     Range("G" & 9 + I).Value = ArrNV(I).Luong
 
Upvote 0
Mã:
 Sheet2.Range("A10").Resize(k, 7).Value = [COLOR=#ff0000][B]ArrNV[/B][/COLOR]
code trên thay cho code dưới thì bị lỗi tại ArrNV
Mã:
For I = 1 To k
                     Range("A" & 9 + I).Value = ArrNV(I).STT
                     Range("B" & 9 + I).Value = ArrNV(I).MA_NV
                     Range("C" & 9 + I).Value = ArrNV(I).Ten_NV
                     Range("D" & 9 + I).Value = ArrNV(I).CV_NV
                     Range("E" & 9 + I).Value = ArrNV(I).Ngay_Lam
                     Range("F" & 9 + I).Value = ArrNV(I).Thang
                     Range("G" & 9 + I).Value = ArrNV(I).Luong
Tại sao lại For I=1 ?
Bạn khai báo ArNV(1000) nghĩa là chỉ số đầu của mảng là 0 cơ mà
 
Upvote 0
ý em muốn là thay thế toàn bộ dòng for thành 1 dòng
Sheet2.Range("A10").Resize(k, 7).Value = ArrNV
như vậy có được không anh?
 
Lần chỉnh sửa cuối:
Upvote 0
Trong C/C++, array được điều khiển bởi một con trỏ trong khi struct là một hình thức nhẹ của class. Muốn chuyển các thành phần của một struct ra thành array mà không tìm được công cụ nào trong STL thì bạn làm ra sao? Tôi chưa làm bao giờ nhưng tôi nghĩ tối thiểu cũng phải ép kiểu con trỏ rồi tính sao thì tính.

Bên VBA có nhiều công cụ đặc thù hơn. Hàm Resize của VBA có chuyển được struct ra thành 1 chiều của array không? Tôi chỉ gợi ý thôi chứ các công việc đặc thù ít dùng tới như thế này tôi lười nghiên cứu lắm cho nên cũng không biết rõ.
 
Upvote 0
\ Hàm Resize của VBA có chuyển được struct ra thành 1 chiều của array không? Tôi chỉ gợi ý thôi chứ các công việc đặc thù ít dùng tới như thế này tôi lười nghiên cứu lắm cho nên cũng không biết rõ.

Resize trong Excel VBA là 1 thuộc tính (không phải hàm), và nó chỉ hoạt động trên Range, không dùng được cho Array
Nói chung, với bài này, tôi không nghĩ ra có HÀM nào đó làm được 1 lần mà không dùng đến vòng lập
 
Upvote 0
Tôi cũng nghĩ không có hàm hay cách nào để làm thẳng như vậy.

Tuy nhiên tôi cho rằng bạn ấy không những chỉ muốn tránh vòng lặp mà còn muốn tránh phải truy cứu đến từng phần tử của struct.
Vì bạn ấy có nói mình chuyên dùng C++ cho nên tôi gợi ý rằng NẾU làm như bạn ấy là mặc nhiên bảo trình dịch phải sử dụng phép ngầm ép kiểu để đưa mảng ArrNV vào Range. Giả sử bạn ấy cho rằng ArrNV là một chiều, thì phép ngầm ép kiểu này (nếu có) cần phải ép struct ra thành chiều còn lại (mỗi phần tử của struct là một phần tử của chiều kia).
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom