Sự nguy hiểm của Iferror()

Liên hệ QC

vu_tuan_manh_linh

linhvtm84@gmail.com
Tham gia
27/2/10
Bài viết
2,625
Được thích
1,893
Giới tính
Nam
Nghề nghiệp
Kỹ sư Kinh tế Xây dựng
Chào diễn đàn!

Nay tôi chia sẻ một sự cố liên quan đến hàm iferror() mong mọi người lưu tâm. Sự thể là tôi có làm dự toán, dùng vlookup() để truy xuất đơn giá vật tư từ 1 bảng chi tiết vật tư. Do đặt hàm đồng loạt nên những chỗ không nhập mã vật tư hàm trả về #N/A. Thấy không ổn, tôi liền chọn giải pháp nhanh là dùng iferror() để bỏ lập tức lỗi này. Lỗi này không sao nếu không có mã vật tư. Nhọ 1 cái, khi mã vật tư đã được nhập nhưng lỡ tay xóa mất mã vật tư bên bảng chi tiết vật tư, hàm không trả về lỗi gì cả mà trả về số 0 theo hàm tôi đặt. và trong cả 1 ma trận hàng nghìn dòng, tìm ra 1 vài chỗ có số 0 quả là 1 việc không dễ. Vậy nên sai lầm này đã trả 1 cái giá khá chát, gần 1 tỷ đồng. Nếu ngay từ đầu tôi dùng if() và đặt điều kiện kiểm tra mã vật tư, có mã thì cho dùng hàm vlookup() thì đã không xảy ra cơ sự này. Tư duy sai 1 cái, đi cả đống tiền!

ACE nào có sự cố gì tương tự liên quan đến việc dùng hàm, xin chia sẻ để mọi người cùng lưu tâm, tránh sai sót đáng tiếc như tôi!
 
Chào diễn đàn!

Nay tôi chia sẻ một sự cố liên quan đến hàm iferror() mong mọi người lưu tâm. Sự thể là tôi có làm dự toán, dùng vlookup() để truy xuất đơn giá vật tư từ 1 bảng chi tiết vật tư. Do đặt hàm đồng loạt nên những chỗ không nhập mã vật tư hàm trả về #N/A. Thấy không ổn, tôi liền chọn giải pháp nhanh là dùng iferror() để bỏ lập tức lỗi này. Lỗi này không sao nếu không có mã vật tư. Nhọ 1 cái, khi mã vật tư đã được nhập nhưng lỡ tay xóa mất mã vật tư bên bảng chi tiết vật tư, hàm không trả về lỗi gì cả mà trả về số 0 theo hàm tôi đặt. và trong cả 1 ma trận hàng nghìn dòng, tìm ra 1 vài chỗ có số 0 quả là 1 việc không dễ. Vậy nên sai lầm này đã trả 1 cái giá khá chát, gần 1 tỷ đồng. Nếu ngay từ đầu tôi dùng if() và đặt điều kiện kiểm tra mã vật tư, có mã thì cho dùng hàm vlookup() thì đã không xảy ra cơ sự này. Tư duy sai 1 cái, đi cả đống tiền!

ACE nào có sự cố gì tương tự liên quan đến việc dùng hàm, xin chia sẻ để mọi người cùng lưu tâm, tránh sai sót đáng tiếc như tôi!
Do cách đặt hàm thôi, iferror khác với if(iserror. Có lẽ do thớt đặt iferror chưa đúng chỗ.
 
Do cách đặt hàm thôi, iferror khác với if(iserror. Có lẽ do thớt đặt iferror chưa đúng chỗ.
Đương nhiên là chưa đúng chỗ nên mới xảy ra cơ sự này, vậy nên mới chia sẻ để mọi người cẩn trọng khi dùng các hàm bẫy lỗi!
 
Chia buồn cùng bạn. Một bài học xương máu.
Tuy nhiên dùng IFERROR để bỏ qua ô trống là quá cẩu thả. Chưa nói đến việc lỡ tay xóa mà ngay cả chuyện sai mã cũng không kiểm soát được.
 
Chào diễn đàn!

Nay tôi chia sẻ một sự cố liên quan đến hàm iferror() mong mọi người lưu tâm. Sự thể là tôi có làm dự toán, dùng vlookup() để truy xuất đơn giá vật tư từ 1 bảng chi tiết vật tư. Do đặt hàm đồng loạt nên những chỗ không nhập mã vật tư hàm trả về #N/A. Thấy không ổn, tôi liền chọn giải pháp nhanh là dùng iferror() để bỏ lập tức lỗi này. Lỗi này không sao nếu không có mã vật tư. Nhọ 1 cái, khi mã vật tư đã được nhập nhưng lỡ tay xóa mất mã vật tư bên bảng chi tiết vật tư, hàm không trả về lỗi gì cả mà trả về số 0 theo hàm tôi đặt. và trong cả 1 ma trận hàng nghìn dòng, tìm ra 1 vài chỗ có số 0 quả là 1 việc không dễ. Vậy nên sai lầm này đã trả 1 cái giá khá chát, gần 1 tỷ đồng. Nếu ngay từ đầu tôi dùng if() và đặt điều kiện kiểm tra mã vật tư, có mã thì cho dùng hàm vlookup() thì đã không xảy ra cơ sự này. Tư duy sai 1 cái, đi cả đống tiền!

ACE nào có sự cố gì tương tự liên quan đến việc dùng hàm, xin chia sẻ để mọi người cùng lưu tâm, tránh sai sót đáng tiếc như tôi!
Anh có thể chia sẻ file để em xem tình huống cụ thể được không a
 
Trên nguyên tắc, bẫy lỗi chỉ dùng để "lướt qua" những trường hợp bất đắc dĩ.
Dữ liệu cuối cùng để dựa vào mà phán xét thì bắt buộc phải là dữ liệu đã chuẩn hoá. (*)
Hàng tỷ đồng dựa trên một cái CSDL không được bảo đảm là chuẩn thì bạn quả là người có máu phiêu lưu.

Nguyên tắc thứ hai mà bạn vi phạm ở đây là bảng tra ở mức quan trọng đó thì phải khoá nó lại. Ngừoi thêm xoá sử đổi phải mở khoá và sửa. Tức là người ta phải ý thức được mình làm gì; khong thể có chuyện "lỡ tay". (**)

Bạn còn được ngồi đấy để chỉ than thở "1 cái giá khá chát" thì cũng xứng đáng cái máu phiêu lưu. Người khác thì bán nhà bán cửa; nói theo tiếng xưa là bán vợ đợ con.

(*) Tôi ở diễn đàn này chỉ mấy năm. Nhưng từ đầu tôi nhìn cách làm việc với bảng của quý vị đã la lên "đi đêm có ngày gặp ma", "quả bom nổ chậm",...
Từ đầu, tôi vẫn khuyên nếu ra #N/A thì cứ để cho nó ra vậy. Nhìn thì nhận ra ngay.
Điều này xảy ra nhiều nhất ở VBA khi quý vị dùng On Error Resume... Điển hình là code duyệt folder; tôi để ý thấy nhiều tay viết code kinh nghiệm cả chục năm mà vẫn dùng cái này để "lướt qua" các files có vấn đề. Trên nguyên tắc làm việc nói chung và nguyên tắc lập trình nói riêng, những code tự động thì phải có một bản log để ghi lại những vấn đề nó gặp. Người chạy code phải đọc bảng log để biết là những files nào đã được làm việc và những files nào bị vấn đề.

(**) Ở nhiều chỗ tôi làm, những bảng quan trọng thì mỗi khi thay đổi đếu có ghi chú rõ lại từng phiên bản.
 
Thành thật chia buồn sự việc đã xảy ra!
Kinh nghiệm mình sử dụng IFERROR rất ít khi trả về 0 hoặc rỗng khi đối số thứ nhất báo lỗi, thường là trả về giá trị/chuỗi cần kiểm tra, ví dụ IFERROR(công thức,"Cảnh báo gì đó"). Khi đã gọi là cảnh báo thì cần ưu tiên kiểm tra.
 
Cảm ơn bạn rất nhiều vì đã chia sẻ, tuy rằng mình chả biết xài hàm là bao nhiêu!
 
Suy rộng ra trong cuộc sống: Lừa người khác 1 lần, 2 lần, nhiều lần ... sẽ có ngày nhận được quả đắng từ chính cú lừa của mình!
 
Bạn chia sẻ kinh nghiệm không thừa nhưng tôi có chút tư vấn thêm về lợi ích dùng IFERROR mà vẫn an toàn:
Khi chưa có IFERROR thường người ta sẽ làm là
=IF(IsNA(Vlookup("A",...)), "Lỗi tim A", Vlookup("A",...))

Công thức trên đúng và khi lỗi xảy ra bạn vẫn biết lỗi do không thấy "A". TUy nhiên cách làm này (do Office cũ) làm Excel chạy chậm. Hà Vlookup bị chạy 2 lần trong công thức.

Cách dùng IFERROR()
=IFERROR(Vlookup("A",...), "Lỗi tim A")
Công thức trên đúng và khi lỗi xảy ra bạn vẫn biết lỗi do không thấy "A". Nhưng hàm Vlookup chỉ chạy 1 lần trong công thức.

Vì thế cách làm IFERROR giúp bảng tính Excel cảu bạn chạy nhanh hơn rất nhiều. Vấn đề quan trọng ta nên biết chặn lỗi và thông báo như thế nào cho an toàn mà thôi.
 
Chào diễn đàn!

Nay tôi chia sẻ một sự cố liên quan đến hàm iferror() mong mọi người lưu tâm. Sự thể là tôi có làm dự toán, dùng vlookup() để truy xuất đơn giá vật tư từ 1 bảng chi tiết vật tư. Do đặt hàm đồng loạt nên những chỗ không nhập mã vật tư hàm trả về #N/A. Thấy không ổn, tôi liền chọn giải pháp nhanh là dùng iferror() để bỏ lập tức lỗi này. Lỗi này không sao nếu không có mã vật tư. Nhọ 1 cái, khi mã vật tư đã được nhập nhưng lỡ tay xóa mất mã vật tư bên bảng chi tiết vật tư, hàm không trả về lỗi gì cả mà trả về số 0 theo hàm tôi đặt. và trong cả 1 ma trận hàng nghìn dòng, tìm ra 1 vài chỗ có số 0 quả là 1 việc không dễ. Vậy nên sai lầm này đã trả 1 cái giá khá chát, gần 1 tỷ đồng. Nếu ngay từ đầu tôi dùng if() và đặt điều kiện kiểm tra mã vật tư, có mã thì cho dùng hàm vlookup() thì đã không xảy ra cơ sự này. Tư duy sai 1 cái, đi cả đống tiền!

ACE nào có sự cố gì tương tự liên quan đến việc dùng hàm, xin chia sẻ để mọi người cùng lưu tâm, tránh sai sót đáng tiếc như tôi!
Theo bạn mô tả, thì có thể
Do công thức sai, không phải do IFERROR
khi xóa (mã) IFERROR vẫn trả về giá trị value_if_error (do người đặt công thức gán vào)
Nếu khác thì bạn nên mô tả lại, và có công thức, ví dụ cụ thể
 
Web KT
Back
Top Bottom