2012-06-18 34 views
5

Tôi vừa giải quyết được vấn đề tôi đã đặt từ khóa "Đặt" vào một dòng định nghĩa nhưng điều tôi muốn biết là "tại sao"?Sự khác biệt trong loại giữa việc sử dụng và không sử dụng Đặt từ khóa

Về cơ bản, tôi đang làm điều này:

Dim startCell, iCell as Range 
For Each iCell in Range(whatever) 
    If iCell.value <>"" Then 
     Set startCell = Cells(iCell.Row + 1, iCell.Column) 
    End If 
Next iCell 

Nếu tôi bỏ qua "Set" keyword mã vẫn biên dịch tốt, nhưng trong cửa sổ biến địa phương tôi thấy rằng loại thay đổi để "String" thay vì "Biến thể/Đối tượng/Phạm vi". Tại sao điều đó lại xảy ra?

+1

startCell không thuộc loại Phạm vi ở đây ... – Qbik

Trả lời

14

Đây là lý do tại sao. Khi bạn nói điều này:

Dim startCell, iCell As Range 

bạn nghĩ bạn đã làm điều này:

Dim startCell As Range, iCell As Range 

nhưng những gì bạn đã thực sự thực hiện là:

Dim startCell 'As Variant, by default 
Dim iCell As Range 

Đây là một lỗi VBA cổ điển. Hầu hết các lập trình viên của VBA đã tạo ra nó, và đó là lý do tại sao hầu hết các lập trình viên của VBA trở lại khai báo chỉ một biến cho mỗi câu lệnh Dim (tức là một biến trên mỗi dòng). Nếu không thì đó là cách quá dễ dàng để làm cho sai lầm đó, và khó khăn để phát hiện nó sau đó.

Vì vậy, với Dim startCell bạn đã khai báo hoàn toàn biến của mình dưới dạng Loại biến thể (tương đương với Dim startCell As Variant).

Khi bạn sau đó nói điều này:

Set startCell = Cells(iCell.Row + 1, iCell.Column) 

các biến thể mua lại các loại điều ở phía bên tay phải của sự phân công tham khảo (Range). Tuy nhiên, khi bạn nói điều này:

startCell = Cells(iCell.Row + 1, iCell.Column) 

mà không có từ khóa Set, bạn không gán một tham chiếu, nhưng một giá trị vào biến startCell, mà bây giờ mua lại các loại giá trị ở phía bên tay phải. Loại đó là gì? Vâng, thuộc tính mặc định của đối tượng Phạm vi là Value, vì vậy bạn sẽ nhận được loại Cells(iCell.Row + 1, iCell.Column).Value. Nếu ô đó chứa một chuỗi, thì bạn sẽ nhận được một chuỗi.

1

Bạn phải sử dụng các từ khóa Đặt khi chỉ định đối tượng cho biến. Cells(iCell.Row + 1, iCell.Column) đang trả về một đối tượng Phạm vi, do đó Đặt phải được sử dụng, nếu không bạn sẽ gặp lỗi VBA yêu thích của mọi người: 91: Object variable or With block variable not set.

Chỉnh sửa:

Đối tượng dải cũng có thuộc tính trả về mặc định là thuộc tính 'Giá trị'. Nếu bạn chỉ tham chiếu Phạm vi ("A1"), nó sẽ lấy phạm vi 'Giá trị' đó làm mặc định cho một biến thể. Đây là lý do tại sao bạn nên tránh sử dụng các biến thể khi kiểu dữ liệu được biết trước.

+0

... nhưng, như anh ấy đã nói trong câu hỏi, anh ấy không nhận được lỗi đó. Tại sao? Đó là những gì làm cho câu hỏi này thú vị. –

3

Set được sử dụng để gán một tham chiếu đến một đối tượng, Let (hoặc phân công đơn giản) để gán giá trị của một đối tượng (nếu có)

Dim a As Variant 
    Set a = ActiveSheet.Cells(1) 
    'TypeName(a) = Range, a now contains reference to the cell's range 
    a = ActiveSheet.Cells(1) 
    'TypeName(a) = Double or String, whatever is in the Cell, a contains the cell's value 
Các vấn đề liên quan