2011-01-26 37 views
6

Tôi có một mô-đun lớp tùy chỉnh trong VBA (Access) được cho là xử lý một lượng lớn dữ liệu ngoài. Hiện tại tôi có hai hàm Read(name)Write(name, value) cho phép đọc và đặt thuộc tính động.Tên thuộc tính động trong VBA

Có cách nào để xác định một cách cú pháp hơn để đọc và ghi dữ liệu đó không? Tôi biết rằng một số đối tượng trong VBA có cách truy cập dữ liệu đặc biệt, ví dụ: RecordSet, cho phép đọc và đặt dữ liệu bằng cách sử dụng myRS!property_name. Có cách nào để làm chính xác như vậy cho các mô-đun lớp tùy chỉnh?

Trả lời

4

Được rồi, nhờ Alain và KyleNZ bây giờ tôi đã tìm ra cách làm việc để thực hiện điều này, mà không có một bộ sưu tập hoặc đối tượng đếm được dưới đây.

Về cơ bản, nhờ tên của! toán tử, tôi phát hiện ra rằng truy cập thông qua toán tử bang/pling tương đương với việc truy cập thành viên mặc định của một đối tượng. Nếu tài sản Value là thành viên mặc định của mô-đun lớp học của tôi, sau đó có ba tuyên bố tương đương để truy cập tài sản đó:

obj.Value("param") 
obj("param") 
obj!param 

Vì vậy, để thực hiện một cú pháp ngắn làm việc cho một mô-đun lớp tùy chỉnh, tất cả người ta phải làm là để xác định một thành viên mặc định.Ví dụ, bây giờ tôi sử dụng sau đây Value tài sản:

Property Get Value(name As String) As String 
    Value = SomeLookupInMyXMLDocument(name) 
End Property 

Property Let Value(name As String, val As String) As String 
    SetSomeNodeValueInMyXMLDocument(name, val) 
End Property 

Thông thường, bây giờ bạn có thể truy cập vào đó như thế này:

obj.Value("foo") = "New value" 
MsgBox obj.Value("foo") 

Bây giờ để làm cho tài sản đó các thành viên mặc định, bạn cần phải thêm một dòng định nghĩa tài sản:

Attribute Value.VB_UserMemId = 0 

Vì vậy, tôi kết thúc với điều này:

Property Get Value(name As String) As String 
Attribute Value.VB_UserMemId = 0 
    Value = SomeLookupInMyXMLDocument(name) 
End Property 

Property Let Value(name As String, val As String) As String 
Attribute Value.VB_UserMemId = 0 
    SetSomeNodeValueInMyXMLDocument(name, val) 
End Property 

Và sau đó, công trình này và tương đương với mã hiển thị ở trên:

obj("foo") = "New value" 
MsgBox obj("foo") 

' As well as 
obj!foo = "New value" 
MsgBox obj!foo 

' Or for more complex `name` entries (i.e. with invalid identifier symbols) 
obj![foo] = "New value" 
MsgBox obj![foo] 

Lưu ý rằng bạn phải thêm Attribute Value.VB_UserMemId = 0 trong một số biên tập viên khác hơn là trình soạn thảo VBA mà tàu với Microsoft Office, là một trong đó ẩn Attribute chỉ thị vì một số lý do .. Bạn có thể dễ dàng xuất mô-đun, mở nó trong notepad, thêm chỉ thị và nhập lại vào trình soạn thảo VBA. Miễn là bạn không thay đổi quá nhiều với thành viên mặc định, không nên xóa chỉ thị (chỉ cần đảm bảo bạn kiểm tra theo thời gian trong trình chỉnh sửa bên ngoài).

2

Xem câu hỏi này khác: Bang Notation and Dot Notation in VBA and MS-Access

Nhà điều hành nổ là viết tắt cho thành viên truy cập của một Bộ sưu tập hoặc đối tượng đếm được khác

Nếu bạn thực hiện lớp học của bạn kéo dài tuổi Collection (!) lớp trong VBA sau đó bạn sẽ có thể tận dụng lợi thế của những nhà khai thác. Trong những câu dưới đây là một ví dụ về một người dùng mở rộng các lớp học tập: Extend Collections Class VBA

6

Cú pháp dấu chấm than được sử dụng để truy cập vào các thành viên của một trường hợp Scripting.Dictionary (bạn sẽ cần phải thêm một tham chiếu đến Microsoft Scripting Runtime thông qua Tools> Tài liệu tham khảo Đầu tiên). Để sử dụng cú pháp này, bạn cần lưu trữ thông tin trong một từ điển.

Cách nhanh nhất để sử dụng nó trong một lớp học là để cho lớp học của bạn một biến đối tượng kiểu Scripting.Dictionary và thiết lập nó như sau:

Option Explicit 

Dim d As Scripting.Dictionary 

Private Sub Class_Initialize() 
    Set d = New Scripting.Dictionary 
End Sub 

Private Sub Class_Terminate() 
    Set d = Nothing 
End Sub 

Public Property Get IntData() As Scripting.Dictionary 
    Set IntData = d 
End Property 

tính Bây giờ bạn có thể truy cập bằng myinstance.IntData!MyProperty = 1 ... nhưng để đến nơi bạn muốn là bạn cần sử dụng Charlie Pearson's technique để làm cho IntData thành viên mặc định cho lớp học của bạn.

Khi đã xong, bạn có thể sử dụng cú pháp sau:

Dim m As MyClass 
Set m = New MyClass 

Debug.Print "Age = " & m!Age ' prints: Age = 
m!Age = 27 
Debug.Print "Age = " & m!Age ' prints: Age = 27 
Set m = Nothing 
+0

Được rồi, cảm ơn cho đến nay .. nhưng có cách nào để sử dụng tính năng này mà không cần có từ điển/bộ sưu tập cơ bản không? Dữ liệu của tôi xuất phát từ một tệp XML và khóa chỉ mục mà tôi muốn sử dụng một phần dựa trên đường dẫn. – poke

+0

Nếu thư viện XML của bạn hiển thị nội dung của các nút có liên quan dưới dạng từ điển, bạn có thể xác định thuộc tính trả về từ điển đó và đặt thuộc tính đó làm thành viên mặc định; nếu nó phức tạp hơn một chút, bạn có thể thử tạo một thuộc tính ánh xạ từ điển cho XPath cho các trường hợp cụ thể. Kỹ thuật này dựa hoàn toàn vào từ điển hoặc bộ sưu tập. – KyleNZ

Các vấn đề liên quan