Tốt hơn hết là nên nghe theo bạn ở bài #2 mà học có cơ sở một chút.
Xin xác định rằng cũng có một số người ở đây học từng miếng một (tự nhận) mà vẫn rất giỏi (ít nhất là giỏi hơn tôi). Nhưng tôi có thể nói rằng những người này có bộ óc và khả năng đặc biệt. Nếu bạn cũng có khả năng siêu việt như vậy thì bạn đã mò được lý do rồi, không cần phải hỏi.
...
dim Rng()
Rng=sheet1.range("A1:C10).value
thì khác với cách khai báo như sau thế nào
dim Rng as range
set Rng = sheet1.range("A1A10")
...
Tôi trả lời theo lý thuyết:
Theo ngôn ngữ lập trình, "mảng" là array, được định nghĩa là một cách hoạch định vùng dữ liệu có tính chất giống nhau và kế liền nhau.
Riêng trong Excel, người ta còn dùng từ "mảng" để chỉ một loại cơ cấu khác, đó là một vùng Range của Excel worksheet.
Vì vậy đưa đến chỗ nhầm lần như trên của bạn.
Trong Excel VBA, toán tử gán (dấu =) có đặc tính ngầm chuyển dữ liệu, tức là nó có thể chuyển dữ liệu từ bên nguồn (source) sang bên đích (destination). Tuy nhiên, toán tử này không thể dùng trực tiếp cho dữ liệu loại object - mà Range là dữ liệu loại object.
Muốn sử dụng tính chất ngầm chuyển dữ liệu mà bên nguồn là range, bên đích phải là mảng.
Rng = Range("A1:A10").Value có nghĩa là chuyển tất cả giá trị từ range vào mảng. Mỗi phần tử của mảng copy lấy một giá trị của một cell trong range.
Nếu bên đích cũng là range thì toán tử gán không thể dùng trực tiếp. Toán tử này không có phần ngầm copy object. Ta chỉ có thể dùng gián tiếp bằng cách thêm từ khoá Set. Từ khoá này bảo lệnh gán "không copy dữ liệu, chỉ copy địa chỉ giữa hai bên mà thôi". Nói cách khác, sau khi lệnh này thực hiện xong, Rng không hề chứa dữ liệu trong Range, mà thực tế Rng chỉ trỏ vào vùng range được định nghĩa là nguồn thôi.
Giải thích thêm về lỗi:
Vì trong code thứ 2 của bạn, Rng là một Range chứ không phải là mảng dữ liệu cho nên bạn không thẻ dùng hàm UBound với nó.
(tuy nhiên, vì Range là một dạng nhóm/collection cho nên bạn có thể dùng for each để duyệt từng phần của nó)