Chia sẻ
"Giải thích chi tiết lỗi spill trong Excel: tại sao EOMONTH, EDATE, NETWORKDAYS không chịu tràn, thủ thuật dấu + để fix, danh sách hàm bị ảnh hưởng và cách xử lý #SPILL!."
Bạn dùng EOMONTH, EDATE hay NETWORKDAYS với dynamic array nhưng nhận #VALUE! thay vì kết quả tràn? Bài viết giải thích tại sao hàng chục hàm Excel "cứng đầu" không chịu spill — và cách fix chỉ bằng một dấu cộng.
Dynamic Array Và Cơ Chế Spill
Từ 2019, Microsoft giới thiệu Dynamic Array Formulas — công thức có thể xử lý nhiều giá trị cùng lúc và trả kết quả "tràn" (spill) ra nhiều ô. Các hàm mới như FILTER, SORT, UNIQUE được thiết kế để spill ngay từ đầu.
Lifting — Cơ Chế Tự Động Của Excel
Khi bạn truyền một range vào hàm không hỗ trợ array natively, Excel dùng cơ chế lifting — gọi hàm đó nhiều lần, mỗi lần cho một giá trị. Ví dụ hàm LEN:
=LEN({"apple";"banana";"pear"}) → {5;6;4}Lifting xảy ra tự động — bạn truyền range, nhận kết quả spill. Nhưng có một nhóm hàm "cứng đầu" từ chối cơ chế này.
Tại Sao Một Số Hàm Không Chịu Spill?
Hàm EOMONTH trả ngày cuối tháng. Khi truyền 1 ô, mọi thứ bình thường:
=EOMONTH(B5, 0) → 30/04/2025 ✅Nhưng khi truyền range 3 ô:
=EOMONTH(B5:B7, 0) → #VALUE! ❌Tương tự với EDATE, NETWORKDAYS, WORKDAY, YEARFRAC... Nguyên nhân: các hàm này thuộc nhóm Analysis ToolPak — được phát triển từ Excel 97 khi chưa có khái niệm dynamic array.
Giải Pháp: Dấu Cộng (+) Thần Kỳ
Fix cực kỳ đơn giản: thêm dấu + trước range. Dấu cộng ép Excel chuyển range thành array trước khi hàm chạy:
=EOMONTH(+B5:B7, 0) → Spill bình thường! ✅
=EDATE(+B5:B7, 1) → Spill bình thường! ✅
=NETWORKDAYS(+A2:A10, +B2:B10) → Spill! ✅Chỉ cần nhớ: truyền range vào hàm cũ mà bị lỗi → thêm dấu + trước range.
Tại Sao Dấu Cộng Lại Hoạt Động?
Thập niên 1980, phần mềm Lotus 1-2-3 cho phép bắt đầu công thức bằng + thay vì =. Excel thêm tương thích Lotus vào những năm 90, chấp nhận cú pháp này.
Trong Excel, dấu + là identity operator — không ảnh hưởng giá trị đơn lẻ, nhưng sẽ coerce (ép kiểu) range thành array. Điều này vượt qua hạn chế "chỉ nhận giá trị đơn" của các hàm cũ.
Danh Sách Đầy Đủ Các Hàm Bị Ảnh Hưởng
Tất cả đều xuất phát từ Analysis ToolPak, ban đầu là add-in riêng của Excel 97, sau tích hợp vào Excel 2007:
Hàm Ngày Tháng
EDATE— Cộng/trừ tháng từ ngàyEOMONTH— Ngày cuối thángNETWORKDAYS— Đếm ngày làm việcWEEKNUM— Số tuần trong nămWORKDAY— Ngày làm việc sau N ngàyYEARFRAC— Phần năm giữa 2 ngày
Hàm Toán Học
MROUND— Làm tròn đến bội sốRANDBETWEEN— Số ngẫu nhiên trong khoảngQUOTIENT— Phần nguyên phép chiaGCD— Ước chung lớn nhấtLCM— Bội chung nhỏ nhất
Hàm Logic
ISEVEN— Kiểm tra số chẵnISODD— Kiểm tra số lẻDELTA— So sánh 2 giá trị
Hàm Tài Chính (30+ hàm)
ACCRINT, ACCRINTM, COUPDAYBS, COUPDAYS, CUMIPMT, CUMPRINC, DISC, DURATION, EFFECT, NOMINAL, PMT (từ ToolPak), PRICE, XIRR, XNPV, YIELD...
Hàm Chuyển Đổi Hệ Số
BIN2DEC, BIN2HEX, DEC2BIN, DEC2HEX, HEX2BIN, HEX2DEC, OCT2BIN, OCT2DEC, CONVERT...
Lỗi #SPILL! Và Cách Xử Lý
Ngoài lỗi "hàm không chịu spill", còn có lỗi #SPILL! khi hàm muốn tràn nhưng không được:
1. Vùng tràn bị chặn
Có dữ liệu hoặc merged cells trong vùng mà kết quả cần tràn vào.
Fix: Xóa dữ liệu trong vùng tràn hoặc unmerge cells2. Bảng (Table) không hỗ trợ spill
Công thức spill bên trong Excel Table sẽ báo #SPILL!.
Fix: Chuyển Table thành Range (Table Design > Convert to Range)3. Kết quả quá lớn
Công thức trả về quá nhiều kết quả, vượt giới hạn worksheet.
Fix: Giới hạn kết quả bằng INDEX hoặc TAKE/DROPMẹo Thực Tế Khi Làm Việc Với Spill
Nhận dạng viền xanh: Vùng spill có viền xanh nhạt bao quanh. Nếu không thấy, kiểm tra lại công thức.
Tham chiếu spill range: Dùng dấu # để tham chiếu toàn bộ kết quả spill, ví dụ
=SUM(D2#).Thận trọng trong file chia sẻ: Người dùng Excel cũ (non-365) sẽ thấy #VALUE! khi mở file có spill formulas.
Luôn để trống vùng bên dưới: Spill cần vùng trống phía dưới (hoặc phải). Đừng đặt dữ liệu ngay dưới ô spill.
Kết hợp với @ cho single value: Nếu chỉ cần 1 giá trị từ spill, dùng
@(implicit intersection).
Tổng Kết
Dynamic array là bước tiến lớn của Excel, nhưng hàng chục hàm "di sản" từ Analysis ToolPak không tương thích. Chỉ cần nhớ quy tắc:
Hàm cũ + range = #VALUE! → thêm dấu + trước range
#SPILL! = vùng tràn bị chặn, merged cells, hoặc nằm trong Table
Dùng dấu # để tham chiếu toàn bộ spill range
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề
