Mình có trường hợp tính định mức cho các xe. Mình kết hợp hàm vookup và if nhưng sao vẫn bị báo lổi NAME.
Mong các bạn giúp. Cảm ơn rất nhiều.
Mình có trường hợp tính định mức cho các xe. Mình kết hợp hàm vookup và if nhưng sao vẫn bị báo lổi NAME.
Mong các bạn giúp. Cảm ơn rất nhiều.
=LOOKUP(2,1/($N$2:$N$10=A2)/($O$2:$O$10=D2)/($P$2:$P$10=E2),$Q$2:$Q$10)
Báo lỗi NAME thì bạn phải nghĩ ngay đến việc mình GÕ SAI TÊN
trong Excel có hàm nào tên là VOOKUP không bạn ?
Mà dù sửa lại cho đúng thì công thức của bạn cũng sai luôn.. vì đây là bài toán dò tìm nhiều điều kiện, không thể VLOOKUP được. Phải vầy:
Mã:=LOOKUP(2,1/($N$2:$N$10=A2)/($O$2:$O$10=D2)/($P$2:$P$10=E2),$Q$2:$Q$10)
Mình gõ nhầm. Chính xác cái em cần. Nhưng khi số xe không có ở bảng định mức thì cho nó bằng 0 thì sao Anh ?
=[COLOR=#ff0000]IF(COUNTIF($N$2:$N$10,A2)[/COLOR],LOOKUP(2,1/($N$2:$N$10=A2)/($O$2:$O$10=D2)/($P$2:$P$10=E2),$Q$2:$Q$10)[COLOR=#ff0000],0)[/COLOR]
Thì dùng COUNTIF để kiểm tra:
Mã:=[COLOR=#ff0000]IF(COUNTIF($N$2:$N$10,A2)[/COLOR],LOOKUP(2,1/($N$2:$N$10=A2)/($O$2:$O$10=D2)/($P$2:$P$10=E2),$Q$2:$Q$10)[COLOR=#ff0000],0)[/COLOR]
Thì dùng COUNTIF để kiểm tra:
Mã:=[COLOR=#ff0000]IF(COUNTIF($N$2:$N$10,A2)[/COLOR],LOOKUP(2,1/($N$2:$N$10=A2)/($O$2:$O$10=D2)/($P$2:$P$10=E2),$Q$2:$Q$10)[COLOR=#ff0000],0)[/COLOR]
=[COLOR=#0000ff]IFERROR([/COLOR]LOOKUP(2,1/($N$2:$N$10=A2)/($O$2:$O$10=D2)/($P$2:$P$10=E2),$Q$2:$Q$10)[COLOR=#0000ff],0)[/COLOR]
Với Excel 2007 thì dùng IFERROR vào các trường hợp này là được mà Thầy! Như thế sẽ gọn hơn.
Mã:=[COLOR=#0000ff]IFERROR([/COLOR]LOOKUP(2,1/($N$2:$N$10=A2)/($O$2:$O$10=D2)/($P$2:$P$10=E2),$Q$2:$Q$10)[COLOR=#0000ff],0)[/COLOR]
Cá nhân tôi chẳng bao giờ thích bẫy lỗi kiểu này (cả trong VBA và công thức).... Đương nhiên vẫn loại trừ trường hợp bất khả kháng
TRUY TÌM TẬN GỐC những lỗi có thể xảy ra để triệt tiêu mới là điều nên làm
(Cái thằng IFERROR ấy chẳng qua là hàm rút gọn của IF(ISERROR(....) nó sẽ gọi LOOKUP 2 lần đấy nhé!)
Em lại nghĩ khác, trong cơ chế hàm của Excel nó không gọi hàm đến 2 lần đâu mà nó replace chuỗi lỗi ra giá trị nếu lỗi.
Ví như: =IFERROR(XXX,"LỖI")
Thay vì kết quả là #N/A, #Value, #D/0 v.v... thì nếu Err.Number > 0 nó thay những chuỗi báo lỗi đó bằng "LỖI" vậy thôi.
Hổng gọi hàm lên thì Nghĩa nghĩ bằng cách nào nó biết hàm ấy đang bị lỗi?
Logic vấn đề quá đơn giản, ví dụ đối với VLOOKUP nhé: IFERROR(VLOOKUP(....):
- Đầu tiên phải chạy VLOOKUP
- Nếu lỗi thì trả về giá trị 1
- Nếu không lỗi thì lấy ngay VLOOKUP
Vậy đường nào nó cũng phải VLOOKUP, có phải là thừa không?
Ở đây đang nói VLOOKUP còn đở (vì hàm này tương đối nhẹ) chứ còn LOOKUP như bài số 6 thì đó là 1 công thức mảng, lần nào cũng phải gọi lên có phải là kém hiệu quả không?
Tôi nói thế vì thấy nhiều trường hợp người dùng xài ISERROR hoặc IFERROR quá thừa. Ví dụ chỉ cần bẫy lỗi cell <> rổng thế này:
=IF(A1="", "", VLOOKUP(A1, bảng dỏ, 2,0))
Hồi trước ta chưa có hàm IFERROR nên ta phải cho nó chạy trước 1 lần để xét lỗi, nếu không lỗi thì mới cho chạy thật 1 lần nữa. Nay có hàm IFERROR thì không phải như cơ chế ta làm nữa mà nó duyệt tại chỗ luôn!
Nó hoạt động như sau:
Hàm VLOOKUP chạy từ đầu Table_Array đến cuối, nếu tìm đúng thì nó cho kết quả, nếu tìm không ra, tức là lỗi (#N/A). Nếu không dùng IFERROR thì nó sẽ có lỗi như thế, nhưng nếu dùng IFERROR thì khi hàm báo lỗi, thì nó chuyển mã lỗi đó thành giá trị mà ta đặt nếu bị lỗi mà không cần phải gọi hàm VLOOKUP đến 2 lần.
Function IfError2k3([B]Value[/B] As Variant, Value_if_Error As Variant) As Variant
IfError2k3 = IIf(IsError(Value), Value_if_Error, Value)
End Function
Trường hợp tính tấn của sản phẩm theo bảng danh mục thì dùng sao Anh?
Chổ màu gạch cột K đó anh.
Chổ màu gạch cột K đó anh. Nó tham chiếu ở O1419.
Nó sẽ là :
K2=4600
K3=3200
K4=8000
K5=5500
=SUMPRODUCT(SUMIF($O$15:$O$19,$F$1:$J$1,$P$15:$P$19)*$F2:$J2)
Đoán đại, thử phương án này xem sao
tại K2
=SUM($F2:$J2/1000*TRANSPOSE($P$15:$P$19))
copy công thức trên và bấm Ctrl+Shift+Enter để kết thúc công thức
copy cho cho K3,K4,...
tính theo tấn chắc vậy
Dùng cái này xem:
Mã:=SUMPRODUCT(SUMIF($O$15:$O$19,$F$1:$J$1,$P$15:$P$19)*$F2:$J2)
Nếu không đổi ra tấn, và có kết quả như bài #18 thì sửa lại công thức cho bài #19 như sau
tại K2
=SUM($F2:$J2*TRANSPOSE($P$15:$P$19))
copy công thức trên và bấm Ctrl+Shift+Enter để kết thúc công thức
lưu ý: thứ tự các SP ở vùng F:J PHẢI GIỐNG như vùng O15:O19
Minh họa bằng bài toán thực tế:
Cách 1:
- Kiểm tra xem có vé hay không
- Có vé: Cho lên tàu
- Không có vé: không cho lên tàu
Cách 2:
- Cho tất cả lên tàu:
- Kiểm tra có vé: Ở lại
- Kiểm tra không có vé: đuổi xuống
===> Cách nào hay hơn nhỉ?
Tôi nói thế vì thấy nhiều trường hợp người dùng xài ISERROR hoặc IFERROR quá thừa. Ví dụ chỉ cần bẫy lỗi cell <> rổng thế này:
=IF(A1="", "", VLOOKUP(A1, bảng dỏ, 2,0))
Nếu chỉ là bẫy A1="" thôi thì Thầy lại quá chủ quan, giả sử A1 có giá trị mà giá trị đó lại không có trong bảng dò tìm thì cũng sẽ bị lỗi #N/A.
Như em nói ở bài trước:
Nếu như Thầy nói:
Thì:
Thực tế cho thấy, theo minh họa về Vé của Thầy, nếu người có vé thì lên, không vé thì biến, nhưng nếu có vé nhưng vé dỏm thì cũng biến, nhưng Thầy lại không bẫy được cái vụ vé dỏm.
Nôm na như thế này:
=VLOOKUP(A2,$N$2:$O$10,2,0)
Nếu cách cũ ta làm như sau:
=IF(ISNA(VLOOKUP(A2,$N$2:$O$10,2,0)),"LỖI",VLOOKUP(A2,$N$2:$O$10,2,0))
Như cách này thì nó phải "quét" 2 lần bảng dò tìm.
Nhưng với IFERROR thì em nghĩ rằng cơ chế nó sẽ không lặp lại hàm VLOOKUP mà nó cứ thực thi theo kiểu:
=SUBSTITUTE(VLOOKUP(A2,$N$2:$O$10,2,0),"#N/A","LỖI")
Đại khái là thế, mặc dù trong sheet mà ta làm như thế thì không được vì tham chiếu là lỗi thì kết quả sẽ lỗi, nhưng với Anh Bill thì cái lỗi này sẽ replace được.
Function IFERROR(value, value_if_error)
IF value là #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? hoặc #NULL! then
IFERROR = value_if_error
else
IFERROR = value
end if
End Function
1. Tính giá trị của thông số thứ nhất: a = gì_đó
2. Tính giá trị của công thức: = IFERROR(a,"lỗi")
1. a = VLOOKUP(A1, bảng dỏ, 2,0)
2. giá trị của công thức: = IFERROR(a,"")
=IF(A1=0;"";gì_đó)
=IFERROR(gì_đó;"")
Cơ chế của nó đây:
Tức đàng nào cũng phải gọi hàm chính, tức là biến Value (để biết có lỗi hay không)Mã:Function IfError2k3([B]Value[/B] As Variant, Value_if_Error As Variant) As Variant IfError2k3 = IIf(IsError(Value), Value_if_Error, Value) End Function
Trong khi đôi lúc chí cần động tác nhỏ (IF(A1="", "", VLOOKUP(...))) là giải quyết nhanh gọn
Vậy cái nào hiệu quả hơn?
Function VLOOKUP_TEST(ByVal Lookup_Value As String, ByVal Table_Array As Variant, ByVal Col_Index_Num As Long) As Variant
On Error GoTo ErrorHandler
Dim TabArr As Variant, c As Long, r As Long, lbd As Long, ubd As Long
TabArr = Table_Array
If IsArray(TabArr) Then
lbd = LBound(TabArr)
ubd = UBound(TabArr)
For r = lbd To ubd
If TabArr(r, lbd) = Lookup_Value Then
VLOOKUP_TEST = TabArr(r, Col_Index_Num)
Exit Function
End If
Next
If r > ubd Then
ErrorHandler:
VLOOKUP_TEST = [B][COLOR=#ff0000]"N/A"[/COLOR][/B]
End If
End If
End Function
[COLOR=#008000]'Chi dung rieng cho ham VLOOKUP_TEST[/COLOR]
Function IFERROR_TEST(ByVal VLOOKUP_TEST_Result As Variant, Value_If_Error As Variant) As Variant
If VLOOKUP_TEST_Result = [COLOR=#ff0000][B]"N/A" [/B][/COLOR]Then
IFERROR_TEST = Value_If_Error
Else
IFERROR_TEST = VLOOKUP_TEST_Result
End If
End Function
Tất nhiên không ai biết mã nguồn của Excel nên chỉ đoán thôi.
Tôi thử hình dung code của hàm IFERROR như thế nào. Tất nhiên cái dưới đây chỉ là để cho dễ hiểu ý thôi.
Mã:Function IFERROR(value, value_if_error) IF value là #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? hoặc #NULL! then IFERROR = value_if_error else IFERROR = value end if End Function
Function IFERROR_TEST(ByVal Value As Variant, Value_If_Error As Variant) As Variant
[COLOR=#ff0000][B]If IsError(Value) Then[/B][/COLOR]
IFERROR_TEST = Value_If_Error
Else
IFERROR_TEST = Value
End If
End Function
Như thế em đã chứng minh được rằng hàm IFERROR không dùng đến 2 lần hàm VLOOKUP trong một công thức xử lý lỗi.
Tôi chỉ ví dụ thôi mà... Lỗi gì thì ta cố mà tìm. Trường hợp như trong file, cùng lắm tôi dùng COUNTIF để kiểm tra vẫn rất nhẹ nhàngNếu Thầy chỉ bẫy lỗi IF(A1="", "", VLOOKUP(...)) thì vẫn còn tiềm ẩn những lỗi khác đấy
.
Tôi chỉ ví dụ thôi mà... Lỗi gì thì ta cố mà tìm. Trường hợp như trong file, cùng lắm tôi dùng COUNTIF để kiểm tra vẫn rất nhẹ nhàng
Như trường hợp lỗi 2 ở file của em là lỗi #REF! thì cho dù dùng COUNTIF vẫn gặp lỗi này. Cho nên khi đã bẫy lỗi thì ngại chi phải xét tới bao nhiêu trường hợp lỗi mà bẫy cho hợp lý? Chỉ cần quy chung là lỗi thì bẫy lỗi mà thôi.
Cũng nói rộng hơn là nếu ô A1 tính toán với cái gì đó ra một giá trị, sau khi có giá trị thì ta tra giá trị đó bằng VLOOKUP. Nếu giá trị đó thõa điều kiện thì OK, nhưng nếu A1 nó tính toán làm sao đó mà ra một trong những lỗi {#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? hoặc #NULL!} thì làm sao?
Vì thế, ta không thể lường trước mọi việc mà lỗi phát sinh được, cho nên ta dùng hàm IFERROR là một chuyện rất bình thường.
Không thế nói vậy được! Tại sao? Vì dữ liệu là của ta, dữ liệu phải có cấu trúc nhất định và chỉ có loại dữ liệu tào lao mới không thể lường trước đó là lỗi gì
Ngoài ra, cái ví dụ về lỗi #REF! trong file của Nghĩa thì đó là sự CỐ TÌNH
=VLOOKUP(A8,$L$2:$M$7,3,0)
Và nếu đây không phải là CỐ TÌNH thì chỉ có thể nói là: Nghỉ xài Excel, mời chuyển sang "nghề" khác đi cho rồi (vì anh chẳng biết gì về Excel cả)
(Đừng nói Nghĩa "thường" xài công thức loại này nha)
Khi đi học, ông Thầy ổng bắt xử lý lỗi các hàm, ổng đưa ra dữ liệu và công thức có chứa lỗi, bắt phải xử lý lỗi, như thế thì bắt buộc phải xử lý chứ không nói là Thầy đưa ra hàm sai, cấu trúc "kỳ cục" v.v...
Cái vụ "ông Thầy" gì đó tôi không biết. Giờ hỏi Nghĩa câu này: Nếu có thành viên nào trên GPE nhờ xử lý lỗi công thức VLOOKUP(A8,$L$2:$M$7,3,0) thí Nghĩa sẽ khuyên họ làm gì:
- Lồng IFERROR vào?
- Bảo rằng người ta đã gõ sai, nên sửa con số 3 thành số 2?
Nếu Nghĩa khuyên người ta lòng IFERROR vào thì đúng là tôi không còn gì để nói nữa
Nhưng cái quan trọng là ở ô A8 nó chứa các lỗi {#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? hoặc #NULL!} thì cũng phải dùng IFERROR thôi, chứ không thể bẫy lỗi kiểu =IF(A8="","",xxxx) được!
Thế sao không "trị" ô A8?
TRỊ NGUYÊN NHÂN chứ không TRỊ HẬU QUẢ (tức không dùng IFERROR)
Ví như không dùng cột phụ để tính là ô A8, mà công thức tính trực tiếp thế này:
Công thức như thế này: =VLOOKUP(VLOOKUP(A8,$L$2:$M$7,3,0),$R$2:$X$7,3,0)
Thì phải làm sao để tránh được lỗi #N/A được chứ Thầy?
Trời đất!
- Thứ nhất: Công thức viết sai ---> Mời học lại Excel
- Thứ hai: Sửa lại =VLOOKUP(VLOOKUP(A8,$L$2:$M$7,2,0),$R$2:$X$7,3,0)
- Thứ ba: Bẫy lỗi cho VLOOKUP --> Chuyện quá thường: 2 thằng VLOOKUP thì 2 thằng COUNTIF
2 công thức cái nào rườm rà hơn? Mới bẫy lỗi VLOOKUP ở trong đó, rồi làm sao bẫy được cái VLOOKUP ngoài bằng COUNTIF nữa ta? Hay phải lặp lại công thức bên trong lần nữa?
------------------------------------------------------------------------
P/s: Mà em nghĩ do mỗi môi trường, mỗi CSDL của mỗi công việc mà có hướng bẫy lỗi khác nhau, nên chỉ bàn tới đây, ai cũng biết mình phải làm gì với file của mình.
Trân trọng.