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
 
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).

Ngay trong code của tác giả đã có công đoạn For.. Next gán giá trị vào STRUCT. Vậy thôi lúc đó ta gán luôn vào mảng 2 chiều đi để cuối cùng "đập" mảng xuống range
Làm chi mà lòng vòng thế không biết
Cho dù có cách nào đó "tránh" được vòng lập thì trong code cũng phải dùng ít nhất 1 vòng lập rồi, có khác gì với code dùng mảng thông thường đâu chứ
 
Upvote 0
Ngay trong code của tác giả đã có công đoạn For.. Next gán giá trị vào STRUCT. Vậy thôi lúc đó ta gán luôn vào mảng 2 chiều đi để cuối cùng "đập" mảng xuống range
Làm chi mà lòng vòng thế không biết
Cho dù có cách nào đó "tránh" được vòng lập thì trong code cũng phải dùng ít nhất 1 vòng lập rồi, có khác gì với code dùng mảng thông thường đâu chứ
dạ cảm ơn các anh đã quan tâm. nội dung chính của bài này là em muốn biết là các thuộc tính của range có gán được cho kiểu Struct không thôi. nói chung kỳ này cố học các kỹ năng về VBA để áp dụng cho công việc. một lần nữa xin chân thành cảm ơn các anh
 
Upvote 0
Tôi nghĩ là tác giả quen viết code LTHĐT (C++) cho nên có ý muốn đóng gói dữ liệu trong cơ cấu kiểu.
Tuy nhiên, đúng như Bác nói, lúc đổ dữ liệu vào struct thì cũng phải biết từng phần của nó. Cho nên rốt cuộc cũng chẳng gói kín được.
Ở đây có bạn siwtom chuyên về Delphi, có lẽ có ý kiến nào khác chăng?
 
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(1000) As NhanVien ''''''''''''khai bao 10000  nhan vien
Tôi post lên bài này các bạn tham khảo
 

File đính kèm

  • STRUCT.xlsm
    533.1 KB · Đọc: 5
  • STRUCT.xlsm
    533.1 KB · Đọc: 4
Upvote 0
Tôi post lên bài này các bạn tham khảo
Vấn đề này đã giải quyết lâu rồi.
1. Thớt khai báo Type bên trong Sub cho nên trình dịch không chấp nhận. Tầm vực type trong VBA là tầm vực Module, phải khai báo với toàn cục của module (không muốn lọt ra module khác thì khai private). Khác với cách khai struct trong các phiên bản mới của C/C++, có thể khai gói gọn trong một hàm mà các hàm khác không cần biết tới.
2. C/C++ cho phép chồng địa chỉ trong bộ nhớ. Vì vậy có thể dùng struct và union để ép kiểu theo phương pháp nạp dùng 2 biến a và b chỉ vào cùng bọ nhớ, sau đó nạp dữ liệu vào biến a và dùng biến b để trích lấy các phần nhỏ theo dạng khác (*1). Ý của thớt là muốn một cách đại khái như thế, và đaz đợc giải thích là làm vậy chỉ tốn công rườm rà chứ chả làm code dễ hiểu, dễ chỉnh sửa hơn.

Bài của bạn chả nói lên gì mới và chả giải thích gì thêm.

(*1) phương pháp chồng địa chỉ vùng nhớ là kỹ thuật rất xưa. Được dùng vì nó giảm thiểu bộ nhớ mà ngày xưa thì máy rất ít bộ nhớ (máy PDP-11 của DEC chỉ có 32K Words cho bộ nhớ, hệ thống vận hành chiếm tối thiểu 3K)
Điển hình FORTRAN IV dùng lệnh COMMON để đặt một phần common core. Và các Function/Subroutine diễn dịch phần bên trong ấy theo ý của mình.
Các phiên bản xưa của BASIC cũng có một số lệnh để chồng bộ nhớ cho loại kiểu String. Nhưng tôi khong thấy trong Visual Basic và VBA.
 
Upvote 0
Web KT

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

Back
Top Bottom