Đâ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.
startCell không thuộc loại Phạm vi ở đây ... – Qbik