Phần 1, chỉ dẫn cách giải quyết vấn đề:
Range là một đối tượng.
1. Điều căn bản của LT HĐT:
Đối tượng thì có thuộc tính. - vấn đề là thuộc tính ấy public thì bạn thấy, private thì bạn không thể thấy hoặc động vào
Thuộc tính thì có hàm Get và hàm Set. - tương tự như trên, tùy theo nó là public hay private mà bạn có thấy chúng hay không.
2. Điều cản bản 2 của LT HĐT:
Đối tượng có thể chứa nhiều thuộc tính khác nhau nhưng thực sự chỉ vào cùng một ngăn data trong bộ nhớ của đối tượng.
Ví dụ Range có thuộc tính Value và Value2, hai thằng này cùng chỉ vào dữ liệu chứa trong range. Nhưng lúc ta gọi ra xem thì Get của thằng Value trả về dữ liệu như thấy trên bảng tính, trong khi đó Get của thằng Value2 trả về dữ liệu thật sự chứa trong range.
Đến đây quý vị nào đã đoán ra được cách giải chưa?
Range cũng có hai thuộc tính Formula với hai hàm Sets hoạt động hơi khác nhau. Muốn Excel chỉnh sửa cho hợp với bảng tính thì dùng Formula. Muốn "bảo gì ghi nấy, không có lộn xộn" thì dùng Formula2.
Hết.
Phần 2, giải thích vấn đề:
Excel 365 khác với các phiên bản trước nó ở chỗ mảng động và mảng tĩnh.
Range.Formula mặc định là mảng tĩnh cho nên tất cả các công thức giao cho nó sẽ được chỉnh lại theo chiều hướng mảng tĩnh. Nói cách khác là nếu công thức dựa vào mảng thì nó sẽ chỉnh lại thành ô bằng phép giao ngầm (implicit intersection). Trong 365 việc ép phép giao ngầm này dựa vào dấu @.
Dưới đây là công thức mảng động. Kết quả là một mảng:
Dưới đây là công thức mảng tĩnh. Kết quả là một ô.
Lưu ý: nếu bạn đặt @ trước Vlookup thì 365 vẫn nhận, nhưng nó sẽ cảnh báo bạn rằng cách ấy không xài được với các phiên bản thấp hơn.
@ đặt trước range A1:A5 mặc định dùng phép giao ngầm như Excel các phiên bản trước vẫn dùng cho các table (@ có nghĩa là ở vị trí dòng/cột ấy)
Chú thích:
Quý vị ở GPE này chưa hề làm việc với phép giao ngầm bao giờ cho nên thấy nó lạ.
Trên thực tế, cũng có nhiều nơi người ta quen với cách này lắm.