2012-03-20 30 views
20

tôi đã xác định một biến với một loại riêng, nóiĐặt loại trong VBA thành không có gì?

Dim point As DataPoint 

Public Type DataPoint 
    list as Collection 
    name as String 
    number as Integer 
End Type 

và tôi muốn xóa tất cả các giá trị của biến point cùng một lúc. Nếu đó là một lớp học, tôi sẽ chỉ sử dụng Set point = New DataPoint hoặc đặt Set point = Nothing, nhưng làm cách nào tôi có thể tiếp tục nếu đó là một loại?

Trả lời

23

Cách tiêu chuẩn là đặt lại từng thành viên thành giá trị mặc định riêng lẻ. Đây là một hạn chế của các kiểu do người dùng định nghĩa so với các đối tượng.

Lúc nguy cơ nêu rõ ràng:

With point 
    Set .list = Nothing 
    .name = "" 
    .number = 0 
End With 

Ngoài ra, bạn có thể tạo một biến "trống" và gán nó vào biến của bạn mỗi khi bạn muốn "rõ ràng" nó.

Dim point As DataPoint 
Dim blank As DataPoint 

With point 
    Set .list = New Collection 
    .list.Add "carrots" 
    .name = "joe" 
    .number = 12 
End With 

point = blank 
' point members are now reset to default values 
+0

Ok, cảm ơn. Tôi hy vọng rằng sẽ có một giải pháp cho điều này, ngoài việc xác định cả lớp hoặc đặt lại tất cả các thành viên một cách riêng lẻ. Liên quan đến biến trống, đó là một ý tưởng hữu ích. Tôi sẽ xem xét sử dụng nó. – tyrex

+2

+1 Trên điểm dữ liệu trống –

+0

@FMan: Đây không phải là định nghĩa toàn bộ lớp ... Chỉ cần khai báo một biến. –

25

Bạn có thể hưởng lợi từ thực tế các hàm trong VB có biến ẩn giữ kết quả và chứa giá trị loại mặc định theo mặc định.

public function GetBlankPoint() as DataPoint 
end function 

Cách sử dụng:

point = GetBlankPoint() 
6

EDIT: Chết tiệt! Bị đánh đập bởi JFC: D

Đây là một thay thế cho đạt được điều đó trong 1 dòng;)

Dim point As DataPoint 
Dim emptyPoint As DataPoint 

Public Type DataPoint 
    list As Collection 
    name As String 
    number As Integer 
End Type 


Sub Sample() 
    '~~> Fill the point 
    Debug.Print ">"; point.name 
    Debug.Print ">"; point.number 
    point.name = "a" 
    point.number = 25 
    Debug.Print ">>"; point.name 
    Debug.Print ">>"; point.number 
    '~~> Empty the point 
    point = emptyPoint 
    Debug.Print ">>>"; point.name 
    Debug.Print ">>>"; point.number 
End Sub 

SNAPSHOT

enter image description here

2

Một lựa chọn khác là sử dụng các từ dành riêng "Empty "chẳng hạn như:

.number = Trống

Vấn đề duy nhất là bạn sẽ cần thay đổi số từ số nguyên thành biến thể.

0

Để sử dụng lớp, bạn có thể khai báo mô-đun lớp với tên loại, sau đó khai báo tất cả thành viên của bạn là công khai, sau đó tự động bạn có thể đặt thành không có gì và mới để tạo và xóa phiên bản.

cú pháp sẽ là somthing như thế này sau khi bạn tạo ra các mô-đun lớp và đặt tên như kiểu của bạn:

' 
Public List as Collection 
Public Name as String 
Public Number as Long 

Private Sub Class_Initialize() 

'Here you can assign default values for the public members that you created if you want 

End Sub 
+0

Tôi thường tạo các kiểu riêng trong các lớp để giữ tất cả các biến thành viên. Lợi ích là tôi có thể dễ dàng thực hiện phương thức "reset()" trên lớp để xóa tất cả các biến thành viên bằng cách đặt biến kiểu = biến trống mà không phải tạo lại một cá thể lớp. nó cũng làm cho việc thực hiện phương thức "Copy()" thực sự đơn giản thay vì phải sao chép tất cả các biến thành viên riêng lẻ, bạn chỉ cần sao chép một biến kiểu riêng. –

1

One-liner:

Function resetDataPoint() As DataPoint: End Function 

Cách sử dụng:

point = resetDataPoint() 
+0

Đã sao chép bản sao một lớp của bản phát hành ngày 20 tháng 3 '12 lúc 14:10 :) http://stackoverflow.com/a/9788459/6698332 – user6698332

2

Sử dụng các lớp trong VBA thường là một thực hành tốt trong trường hợp nó không phải là một giải pháp mục đích duy nhất hoặc lớp không chứa quá nhiều attr riêng ibutes bởi vì nếu bạn muốn tuân thủ các quy tắc OOP và giữ cho lớp của bạn an toàn, bạn nên khai báo tất cả các thuộc tính Let và Get cho tất cả các thuộc tính riêng của lớp. Đây là quá nhiều mã hóa trong trường hợp bạn có hơn 50 thuộc tính riêng.Một mặt tiêu cực khác của việc sử dụng các lớp trong excel là thực tế, rằng VBA không hỗ trợ đầy đủ OOP. Không có polymorfism, overloading, vv) Thậm chí bạn muốn sử dụng một thừa kế, bạn phải khai báo tất cả các thuộc tính và phương thức từ lớp gốc trong lớp kế thừa. Vì vậy, trong trường hợp này, tôi thích giải pháp được đề xuất bởi Jean-François Corbett hoặc GSeng, tức là gán một biến trống của cùng một UDT như biến bạn muốn xóa hoặc sử dụng hàm mà tôi có chút ít. giải pháp thanh lịch hơn vì nó sẽ không dự trữ bộ nhớ vĩnh viễn cho biến emtpy của loại UDT của bạn.

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