...Lần đầu em tham gia diễn đàn, có gì còn thiếu sót hoặc hiểu lầm. Mong anh và mọi người thông cảm và bỏ qua cho em. Em sẽ cố gắng sửa đổi và học tập.
Cảm ơn.
Có những lý do khiến yêu cầu của bạn rất khó thực hiện. Những lý do ấy không phải do phần mềm thiếu sót. Mà là lý do thực tiễn, dân chuyên test phần mềm đều biết (xem thêm giải thích bên dưới)
...
Tôi đang định hỏi. Vả lại hình và bài của anh (Đã sửa xóa) không liên quan đến bài trích?
Trong hình đã xóa ở bài trên, tôi nhắc lại do người ấy một bài tôi đã từng giải thích gần đây, và có chút xíu liên quan. Chút xíu liên quan, nhưng nếu hiểu rõ thì sẽ dễ hiểu nổi khó khăn của công thức mảng.
Hai cái hình trong bài ấy, cho thấy cùng một bảng, cùng một công thức nhưng một cái ra kết quả và cái kia ra error. Đó là hiệu ứng của "implicit intersection" (tôi có dặn đi tìm học theo từ khóa này)
Trở lại, về mảng.
Trong Excel, chỉ có 4 hàm thực sự là hàm mảng: Index, Sumproduct, Lookup, và Aggregate. Frequency và MMult cũng là hàm mảng nhưng chúng hoạt động hơi khác.
Luật của Excel là
"hàm ghi tại một ô không thể chỉnh sửa ô khác. Muốn ghi qua ô khác thì phải chọn cả ô ấy"
Luật này dùng để bảo vệ dữ liệu sẵn có của bảng tính. Không bảo vệ sẽ gây đến việc mất dữ liệu bất ngờ.
Lưu ý: tôi nói "mất" có nghĩa là dữ liệu đáng lẽ độc lập với hàm trên thì bị ghi đè. Các ô tham chiếu là chuyện khác, chúng chỉ tự động chỉnh theo chứ không hề bị mất.
Biểu thức trong đề bài =A1:B5 vốn là biểu thức mảng. Nếu chỉ =A1:A1 (1 cột) thì nó có thể theo luật implicit intersection để chọn đúng dòng. Nhưng vì A1:B5 là nhiều hơn 1 cột cho nên implicit intersection không có cách nào để thỏa cả dòng và cột. Kết quả phải là error.
Muốn sử dụng thì phải nhập theo kiểu mảng (CTtrl_Shift+Enter). Kết quả sẽ là mảng { 1,6; 2,7; 3,8; 4,9; 5,10 }. Nhưng vì nó không phải là mảng động cho nên nó chỉ trả về kết quả trong các ô được chọn. Xem hình bên dưới, tôi chọn 3 ô thì nó trả về cho 3 ô (nếu tôi chỉ chọn 1 ô C1 thì kết quả sẽ là 1, tức A1). Lưu ý là luật bảo vệ vẫn ddowcj tôn trọng, lúc chọn ô bạn đã biết mình sẽ ghi đè những ô nào.
Phiên bản 365 và 2021 đưa ra một loại mảng mới là mảng động. Loại mảng này có tính chất "rải/spill" tức là nó sẽ có một cái mốc (ô mà ta ghi thức) và mảng kết quả tự rải vào các ô còn lại.
Lưu ý là luật bảo vệ sự đồng nhất của bảng tính vẫn được tôn trọng. Nếu rải nhằm ô đã có dữ liệu thì nó sẽ báo động.
Loại mảng động này khá phức tạp. Đại khái là nhóm mảng thực ra chỉ có một ô mốc (anchor) và chỗ còn lại chỉ đặt chỗ ô thôi (nghĩ đến khách sạn: bạn có thể đặt/chiếm phòng những không ở)
Vì sự phức tạp của nó cho nên từ MS không muốn viết Cải Chỉnh/Service Pack phiên bản 2019 trở xuống. Và việc viết VBA để bắt chước/emulate khá khó khăn.
Hàm UDF tự căn bản được MS giới hạn buộc phải tuân theo luật bảo vệ dữ liệu. Nói cách khác, cũng như hàm trên bảng tính, UDF không thể thay đổi dữ liệu ngoài những ô nó chọn.
Có một vài cách đi vòng qua luật này. Nhưng chúng rất phức tạp. Tôi không muốn đi xa hơn nữa ở đây.
Lời thật mất lòng. Theo tôi thì với trình độ của bạn cũng không cần tìm hiểu kỹ thuật này làm gì, chỉ tổ vác một cái code mà bạn không thể làm chủ nó thôi. Nếu bạn đủ sức học kỹ thuật đi vòng giới hạn của MS thì bạn đã không mở câu hỏi chủ đề này.
.