Tìm kiếm chuỗi kí tự thỏa mãn điều kiện cho trước

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Nguyễn Đức Mão

Thành viên mới
Tham gia
15/4/20
Bài viết
5
Được thích
2
- Em xin chào các Anh chị, e có vấn đề này nhờ Anh chị xem giúp
- Ô H16 Range của em từ $I$16:$I$21 --> Thì dữ liệu không báo lỗi, nhưng sang ô H17 e tăng Range qua những Cell trống là không tìm kiếm được nữa. E xin hướng dẫn cách khắc phục lỗi này với ạ
1709976042862.png1709976050855.png
 

File đính kèm

  • TIM CHUOI KY TU.xlsx
    9.8 KB · Đọc: 13
Lần chỉnh sửa cuối:
- Em xin chào Các A/c, e có vấn đề này nhờ A/c xem giúp
- Ô H16 Range của em từ $I$16:$I$21 --> Thì dữ liệu k báo lỗi, nhưng sang ô H17 e tăng Range qua những Cell trống là không tìm kiếm được nữa. E xin hướng dẫn cách khắc phục lỗi này với ạ
View attachment 299483View attachment 299484
Bạn nên sửa những từ viết tắt đi. Muốn không báo lỗi thì thay $I$16:$I$21 bằng 1 hàm nào đó có thể chứa đúng vùng có dữ liệu cột I ấy. chẳng hạn hàm Offset coi
 
Lần chỉnh sửa cuối:
... Muốn không báo lỗi thì thay $I$16:$I$21 bằng 1 hàm nào đó có thể chứa đúng vùng có dữ liệu cột I ấy. chẳng hạn hàm Offset coi
Không phải do vùng chứa dữ liệu. Nó làm vậy là tại chưa đủ điều kiện, đưa đủ điều kiện thì nó sẽ ra đúng.
 
Bạn nên sửa những từ viết tắt đi. Muốn không báo lỗi thì thay $I$16:$I$21 bằng 1 hàm nào đó có thể chứa đúng vùng có dữ liệu cột I ấy. chẳng hạn hàm Offset coi
Cảm ơn bạn nhé. mình làm được rồi, tự dưng không nghĩ ra cách dùng Name
1710037045744.png
Bài đã được tự động gộp:

Không phải do vùng chứa dữ liệu. Nó làm vậy là tại chưa đủ điều kiện, đưa đủ điều kiện thì nó sẽ ra đúng.
A Có thể giúp em thêm điều kiện để công thức này ra đúng được k ạ. Trên kia e có dùng Name để được theo ý mình rùi, nhưng e mún học hỏi thêm về cách thêm điều kiện về công thức này
 
Cảm ơn bạn nhé. mình làm được rồi, tự dưng không nghĩ ra cách dùng Name
View attachment 299491
Bài đã được tự động gộp:


A Có thể giúp em thêm điều kiện để công thức này ra đúng được k ạ. Trên kia e có dùng Name để được theo ý mình rùi, nhưng e mún học hỏi thêm về cách thêm điều kiện về công thức này
Bạn cứ liệt kê điều kiện bạn muốn dò tìm.
1. Dải ô i16:i30 chứa dữ liệu ở ô bạn muốn dò tìm.
2. ...
Đưa hết các điều kiện vào hàm lookup là tìm được thôi.
 
Bạn cứ liệt kê điều kiện bạn muốn dò tìm.
1. Dải ô i16:i30 chứa dữ liệu ở ô bạn muốn dò tìm.
2. ...
Đưa hết các điều kiện vào hàm lookup là tìm được thôi.
Điều kiện không phải do có sẵn. Điều kiện tôi nói nó sinh ra bởi việc kéo dài thêm thành nhiều dòng. Công thức không được viết để đề phòng việc này.

Chú: tôi chỉ nói chuyện với bạn. Tôi từ chối việc tiếp xúc với người hay viết tắt.
 
...
1. Dải ô i16:i30 chứa dữ liệu ở ô bạn muốn dò tìm.
...
Tôi vẫn nói là người hay viết tắt thì cũng có tật hời hợt và cẩu thả.
Thớt không phải là người không giỏi Excel. Chỉ vì cái tội lười cho nên không chịu debug. Nếu debug thì đã biết mình bị vướng chỗ nào.

Nên nhớ rằng sử dụng hàm Lookup(2, 1/...., ...) là sử dụng một mẹo dựa vào tính chất bỏ qua lỗi và tính dò nhị phân của Lookup.
Biểu thức 1/... trả về một mảng chỉ có True (1/1) hoặc Error (1/0). Vì tính chất bỏ qua lỗi, Lookup sẽ chọn lấy điểm cuối cùng có trị số nhỏ hơn 2, tức là True ép kiểu sang Int.

Khi nới rộng vùng thì trị tìm bao gồm ô trống, tức là "". Hàm Find tìm "" trong bất cứ chuỗi nào cũng trả về 1.
Vì vậy, nếu bao gồm phần nới thêm thì các chỗ nới thêm sẽ trả về 1. Và như vậy, Lookup sẽ trả về trị ô trống, tức 0.

Giải pháp:
Vì nới rộng vùng sẽ cộng cả ô trống cho nên lúc dò phải tự mình thêm điều kiện <>"". (tôi nói điều kiện này không có từ đầu, mà do cách sử dụng Lookup của mình nảy sinh ra, phải không?)
Bây giờ thì bạn chỉ cần thêm điều kiện ô cần dò <>"".

Chú thích: vì thớt chơi láng, dùng hàm Lookup chứ bài này chỉ cần dùng VLookup, hiệu quả hơn. Phần nới rộng thì mới dùng Offset để nới.
VLookup("*"&$i16&"*", $E$16:$I$21, 3, 0)
 
Chú thích: vì thớt chơi láng, dùng hàm Lookup chứ bài này chỉ cần dùng VLookup, hiệu quả hơn. Phần nới rộng thì mới dùng Offset để nới.
VLookup("*"&$i16&"*", $E$16:$I$21, 5, 0)
Cái này hay đó anh! :)

Nên nhớ rằng sử dụng hàm Lookup(2, 1/...., ...) là sử dụng một mẹo dựa vào tính chất bỏ qua lỗi và tính dò nhị phân của Lookup....Hàm Find tìm "" trong bất cứ chuỗi nào cũng trả về 1.
Em chơi với! Thêm cách 'lấy mẹo trị mẹo'

=LOOKUP(2,1/(FIND($I$16:$I$300,":)"&E16)-1),$I$16:$I$300)

Em chả thèm tính bao nhiêu "trăm k", "hai ba xị" hoặc "vài chục chai" như cái tay gì đó ở bài #2 gợi ý, vì giá bèo (nhèo) quá! Hổng xứng "chất xám" bỏ ra. Chắc là "tiền nào của đó" quá!

Anh em mình mỗi người "lụm" 50 "vé" nha anh!


Khì khì khì
/-*+//-*+//-*+/
(Thói quen giờ xài "vé" lớn "vé" nhỏ không hà, nên bị liệu)
 
Lần chỉnh sửa cuối:
Tôi vẫn nói là người hay viết tắt thì cũng có tật hời hợt và cẩu thả.
Thớt không phải là người không giỏi Excel. Chỉ vì cái tội lười cho nên không chịu debug. Nếu debug thì đã biết mình bị vướng chỗ nào.
Chân thành cảm ơn anh. Em sẽ cẩn trọng hơn về cách dùng từ ngữ, đặc biệt là viết tắt.
Nên nhớ rằng sử dụng hàm Lookup(2, 1/...., ...) là sử dụng một mẹo dựa vào tính chất bỏ qua lỗi và tính dò nhị phân của Lookup.
Biểu thức 1/... trả về một mảng chỉ có True (1/1) hoặc Error (1/0). Vì tính chất bỏ qua lỗi, Lookup sẽ chọn lấy điểm cuối cùng có trị số nhỏ hơn 2, tức là True ép kiểu sang Int.

Khi nới rộng vùng thì trị tìm bao gồm ô trống, tức là "". Hàm Find tìm "" trong bất cứ chuỗi nào cũng trả về 1.
Vì vậy, nếu bao gồm phần nới thêm thì các chỗ nới thêm sẽ trả về 1. Và như vậy, Lookup sẽ trả về trị ô trống, tức 0.

Giải pháp:
Vì nới rộng vùng sẽ cộng cả ô trống cho nên lúc dò phải tự mình thêm điều kiện <>"". (tôi nói điều kiện này không có từ đầu, mà do cách sử dụng Lookup của mình nảy sinh ra, phải không?)
Bây giờ thì bạn chỉ cần thêm điều kiện ô cần dò <>"".
Trước đến giờ em dùng hàm Lookup kiểu theo bản năng, gọi là học vẹt theo các cao thủ trên diễn đàn nên chưa hiểu hết được bản chất của công thức này vì thế nên Debug không ra được.
Chú thích: vì thớt chơi láng, dùng hàm Lookup chứ bài này chỉ cần dùng VLookup, hiệu quả hơn. Phần nới rộng thì mới dùng Offset để nới.
VLookup("*"&$i16&"*", $E$16:$I$21, 3, 0)
Dữ liệu em bị ẩn nên thay đối số 3 thành 5 là ăn luôn. Nhiều lúc mình cứ đi tìm cái cao siêu ở đâu trong khi thực tế chỉ cần cái đơn giản trước mặt là giải quyết được vấn đề rồi. Chân thành cảm ơn anh nhiều ạ
Bài đã được tự động gộp:

Em chơi với! Thêm cách 'lấy mẹo trị mẹo'
=LOOKUP(2,1/(FIND($I$16:$I$300,":)"&E16)-1),$I$16:$I$300)
Bạn có thể giải thích giùm mình vì sao thêm bất kỳ 1 ký tự nào (Ví dụ: ":)" như của bạn chẳng hạn) trước đối số "Within Text" của hàm Find, thì nó lại ra được kết quả như mình mong muốn, còn bỏ đi là hàm báo N/A luôn :wallbash:
 
Lần chỉnh sửa cuối:
Bạn có thể giải thích giùm mình vì sao thêm bất kỳ 1 ký tự nào (Ví dụ: ":)" như của bạn chẳng hạn) trước đối số "Within Text" của hàm Find, thì nó lại ra được kết quả như mình mong muốn, còn bỏ đi là hàm báo N/A luôn :wallbash:
Bạn xem quá trình hình thành kết quả trong thức nha, vùng L34: O50 file kèm.

Thân
 

File đính kèm

  • TIM CHUOI KY TU.xlsx
    13.4 KB · Đọc: 7
Bạn có thể giải thích giùm mình vì sao thêm bất kỳ 1 ký tự nào (Ví dụ: ":)" như của bạn chẳng hạn) trước đối số "Within Text" của hàm Find, thì nó lại ra được kết quả như mình mong muốn, còn bỏ đi là hàm báo N/A luôn :wallbash:
Khi bạn dùng FIND($I$16:$I$300,E16)-1 không ghép 1 ký tự bất kỳ trước E16 công thức sẽ báo lỗi vì:

- Các tên thuốc "Vắc xin..." trong dữ liệu E16: E21 đều phát sinh ngay 'vị trí đầu tiên', nên Find() sẽ trả kết quả là 1. Giả sử, E16 như sau: "Tên thuốc: Vắc xin.....", Find() sẽ trả về vị trí phát hiện chuỗi "Vắc xin ..." là 12, vì trước nó là chuỗi "Tên thuốc: " có 11 ký tự (kể cả chuỗi trắng). Như vậy, với dữ liệu ban đầu của bạn các vị trí tên thuốc "Vắc xin...." đều là 1, khi bạn thêm ký tự bất kỳ trước nó, như: "@"&E16--> "@Vắc xin....", thì Find() sẽ trả về là 2.

- Như anh @VetMini hướng dẫn bài trên: Các dòng trống khi bạn kéo dài vùng dữ liệu I16: I30 (chẳng hạn), nó tương tự như lệnh Find( "", "@"&E16) và luôn cho kết quả là 1.

- Từ trên bạn sẽ thấy: các dòng nào tìm thấy tên thuốc thì kết quả là 2, không tìm thấy thì báo lỗi, còn các dòng trống là 1. Nếu không nối thêm ký tự bất kỳ trước E16, thì sau khi trừ 1 dòng thỏa hay dòng trống cũng đều bằng 0.

Vậy, đem kết quả có ký tự nối đó trừ 1 thành: dòng thỏa còn lại 1, không tìm thấy thì vẫn báo lỗi, dòng trống bằng 0. Dùng mảng này vào Lookup(2, 1/ "mảng kết quả" ,...) thì dòng trống do 1/0 sẽ báo lỗi #DIV/0!, và Lookup() sẽ chỉ tìm kết quả nào có giá trị thỏa.


Thân
 
Khi bạn dùng FIND($I$16:$I$300,E16)-1 không ghép 1 ký tự bất kỳ trước E16 công thức sẽ báo lỗi vì:

- Các tên thuốc "Vắc xin..." trong dữ liệu E16: E21 đều phát sinh ngay 'vị trí đầu tiên', nên Find() sẽ trả kết quả là 1. Giả sử, E16 như sau: "Tên thuốc: Vắc xin.....", Find() sẽ trả về vị trí phát hiện chuỗi "Vắc xin ..." là 12, vì trước nó là chuỗi "Tên thuốc: " có 11 ký tự (kể cả chuỗi trắng). Như vậy, với dữ liệu ban đầu của bạn các vị trí tên thuốc "Vắc xin...." đều là 1, khi bạn thêm ký tự bất kỳ trước nó, như: "@"&E16--> "@Vắc xin....", thì Find() sẽ trả về là 2.

- Như anh @VetMini hướng dẫn bài trên: Các dòng trống khi bạn kéo dài vùng dữ liệu I16: I30 (chẳng hạn), nó tương tự như lệnh Find( "", "@"&E16) và luôn cho kết quả là 1.

- Từ trên bạn sẽ thấy: các dòng nào tìm thấy tên thuốc thì kết quả là 2, không tìm thấy thì báo lỗi, còn các dòng trống là 1. Nếu không nối thêm ký tự bất kỳ trước E16, thì sau khi trừ 1 dòng thỏa hay dòng trống cũng đều bằng 0.

Vậy, đem kết quả có ký tự nối đó trừ 1 thành: dòng thỏa còn lại 1, không tìm thấy thì vẫn báo lỗi, dòng trống bằng 0. Dùng mảng này vào Lookup(2, 1/ "mảng kết quả" ,...) thì dòng trống do 1/0 sẽ báo lỗi #DIV/0!, và Lookup() sẽ chỉ tìm kết quả nào có giá trị thỏa.


Thân
Cảm ơn bạn rất nhiều nhé, chúc bạn ngày đầu tuần vui vẻ và năng lượng
Bạn xem quá trình hình thành kết quả trong thức nha, vùng L34: O50 file kèm.

Thân
Cảm ơn bạn rất nhiều nhé, chúc bạn ngày đầu tuần vui vẻ và năng lượng
 
Cái này hay đó anh! :)


Em chơi với! Thêm cách 'lấy mẹo trị mẹo'

=LOOKUP(2,1/(FIND($I$16:$I$300,":)"&E16)-1),$I$16:$I$300)

Em chả thèm tính bao nhiêu "trăm k", "hai ba xị" hoặc "vài chục chai" như cái tay gì đó ở bài #2 gợi ý, vì giá bèo (nhèo) quá! Hổng xứng "chất xám" bỏ ra. Chắc là "tiền nào của đó" quá!

Anh em mình mỗi người "lụm" 50 "vé" nha anh!


Khì khì khì
/-*+//-*+//-*+/
(Thói quen giờ xài "vé" lớn "vé" nhỏ không hà, nên bị liệu)
50 vé chỉ đủ ăn hai lần bánh mì bèo (vệ đường) với cà phê bắp rang (trên 50% đồ ri-sai-cô từ cà phê phin, cộng bắp rang khét)
Lên giá 60 vé thì hy vọng được 3 lần.
 
Web KT
Back
Top Bottom