Bạn đã quen thuộc với hàm INDIRECT
trong Excel, ví dụ như =INDIRECT("A1")
trả về giá trị của ô A1. Nhưng khi sử dụng INDIRECT
với mảng, chẳng hạn =INDIRECT({"A1";"A2"})
, lại gặp lỗi #VALUE!
. Liệu INDIRECT
có thực sự “bất lực” trước mảng? Bài viết này sẽ giúp bạn khám phá sự thật thú vị đằng sau hàm INDIRECT
và cách nó tương tác với mảng trong Excel.
Hàm INDIRECT trả về lỗi #VALUE! khi làm việc với mảng
Khám Phá Hàm INDIRECT với Mảng
Hình trên minh họa lỗi #VALUE!
khi sử dụng INDIRECT
với mảng. Tuy nhiên, nếu kết hợp với hàm CELL
, ví dụ =CELL("address",INDIRECT({"A1";"A2"}))
, ta lại nhận được kết quả chính xác.
Hàm CELL kết hợp với INDIRECT trả về địa chỉ ô
Vậy tại sao CELL
lại “giải cứu” được INDIRECT
? Câu trả lời nằm ở cách Excel xử lý mảng và bản chất của hàm INDIRECT
.
Khi gặp mảng {"A1";"A2"}
, Excel tính toán từng phần tử trong mảng với hàm INDIRECT
. Trong Excel 365 với Dynamic Array, kết quả tự động mở rộng xuống các ô bên dưới, chứng tỏ INDIRECT("A1")
và INDIRECT("A2")
đều được thực thi.
Tuy nhiên, INDIRECT
không trả về giá trị mà trả về tham chiếu đến ô. Việc hiển thị giá trị là do Excel tự động thực hiện. Tương tự, hàm OFFSET
cũng trả về tham chiếu đến vùng dữ liệu.
Minh họa cách Excel xử lý mảng trong hàm INDIRECT
Mảng Đối Tượng – Bí Mật Đằng Sau
Vì Excel không phải mã nguồn mở, ta không thể biết chính xác cấu trúc dữ liệu trả về. Tuy nhiên, nếu hiểu về lập trình, ta có thể hình dung mỗi ô Excel như một đối tượng (object). Kết quả của =INDIRECT({"A1";"A2"})
có thể được biểu diễn là một mảng các đối tượng:
{[object_1];[object_2]}
Mỗi đối tượng chứa các thuộc tính và giá trị tương ứng:
{
"address":$A$1,
"contents":1,
"row_num":1,
"row_height":3,
...
}
Excel chỉ hiển thị giá trị khi gặp mảng giá trị hai chiều, không hiển thị trực tiếp đối tượng. Hàm CELL
có khả năng đọc thuộc tính của đối tượng, tương tự như hàm ROW
và COLUMN
.
Ví dụ về hàm ROW và COLUMN
Áp dụng với OFFSET
, ta cũng có thể tạo mảng các vùng và hiển thị thông tin bằng hàm CELL
.
Ví dụ về hàm OFFSET kết hợp với CELL
Kết Luận
INDIRECT
hoàn toàn có thể làm việc với mảng, chỉ là Excel không hiển thị kết quả như ta mong đợi. Việc kết hợp với các hàm như CELL
, ROW
, COLUMN
giúp ta khai thác sức mạnh của INDIRECT
với mảng một cách hiệu quả.
Discussion about this post