Thách đố về cách lọc tìm dữ liệu (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tại sao lại phụ thuộc vào số lũy thừa cơ số 100, chỉ phụ thuộc vào chiều dài ký tự tên (xét sort)
Đương nhiên phải thế rồi! Vì phải ưu tiên ký tự đầu ---> Ký tự thứ 2 ---> ... cho đến ký tự cuối
Mà muốn ưu tiên thế thì mình phải làm sao convert để ký tự đầu có giá trị lớn nhất
Giống cách tạo ra 1 hệ đếm mà: Có 10 số 0, 1, 2.... ,8 , 9 ráp lại thành số này, số nọ, có phân biệt số lớn, số nhỏ ---> Đây là hệ đếm thập phân
Bài trên gần như tạo ra 1 hệ đếm cơ số 100
Hỏng biết nói thế nào nữa
-----------------
Chưa hiểu ý Tigertiger lắm ---> Loc d/k là lọc cái gì?
Tôi xin lưu ý: Bài này là giãi câu thách đố thứ 2 của bạn hoangdanh282vn, bài số 24
 
Lần chỉnh sửa cuối:
Tôi cảm thấy không hài lòng lắm về yêu cầu của bài toán này. Nếu chỉ sort với 2 ký tự thì đó không thể gọi là sort. Xin mạn phép nâng độ khó của bài toán lên 1 cấp: Sort với tất cả khả năng có thể của Excel
c) Tổng cộng có đến 94 ký tự trong bảng mã nên buộc phải dùng lũy thừa cơ số 100. Điều này là đương nhiên và cách làm này tương tự như việc xây dựng 1 hệ đếm mới. Từ đó đã dẩn đến tình trạng số quá lớn trong quá trình tính toán ---> không thể tính toán và sort trên 6 ký tự
NDU

Vậy thì ta nâng cấp thêm độ khó nha : sort 6 ký tự của chuỗi tên, nếu trùng thì sẽ ưu tiên dòng trên (cái này coi như sort 7 ký tự rồi đó)
Mời các bác cùng tham gia. 2 chầu cafe cho ai giải được
 
Tôi cảm thấy không hài lòng lắm về yêu cầu của bài toán này. Nếu chỉ sort với 2 ký tự thì đó không thể gọi là sort. Xin mạn phép nâng độ khó của bài toán lên 1 cấp: Sort với tất cả khả năng có thể của Excel
Các anh chị tham khảo qua file này nhé
Giới thiệu sơ lược về khả năng của công thức lọc trong file:
Đây là những gì mà file này làm được và chưa làm được. Xin các anh chị góp ý thêm!
Một chi tiết cần các anh chị xem lại giúp: không biết trật tự trong bảng Alphabet tôi sắp như vậy đã đúng chưa? Nếu có sai sót, nhờ anh chị sửa lại
NDU
=" aáàảãạăắằẳẵặâấầẩẫậbcdđeéèẻẽẹêếềểễệfghiíìỉĩịjklmnoóòỏõọôốồổỗộơớờởỡợpqrstuúùủũụưứừửữựvwxyýỳỷỹỵz"
Công nhận cách làm rất hay, sao mình không nghĩ ra search mà cứ phải match.
Cám ơn Bạn nhiều lắm.
Cơ bản là cách giải thôi chớ không ai dám ứng dụng cả. Chỉ làm vài chục record thôi.
Cụ thể như file lọc xếp hạng thì không GV nào dám vận dụng cả.
 
Cơ bản là cách giải thôi chớ không ai dám ứng dụng cả. Chỉ làm vài chục record thôi.
Cụ thể như file lọc xếp hạng thì không GV nào dám vận dụng cả.

Sao vậy Bác. Do quá nhiều Name phức tạp hay do máy chạy chậm.
File em làm có vài trăm dòng vẫn chạy ào ào mà.

Và mình xin được gửi lên câu thách đố thứ 3 (có lẽ là khó nhất) :

Có một danh sách học sinh ở cột A, cột B là xếp loại, cột C là lớp.
Yêu cầu :
1-Trích lọc ra danh sách học sinh theo lớp.
2-Sắp xếp xếp loại theo thứ tự ưu như sau : theo xếp loại giảm dần (giỏi, khá, TB, yếu, kém).
3- Sau khi sắp xếp xếp loại xong thì những tên có cùng xếp loại sort theo tên (5 ký tự).
4- Nếu có tên trùng nhau thì ưu tiên dòng trên.
 

File đính kèm

Lần chỉnh sửa cuối:
Chuyển sang đề tài nào mới hơn thôi
Bài này không khó nhưng thực chất để đạt được mục đích của yêu cầu bài toán thì chẳng ai dại gì dùng công thức ---> Advanced Filter and Sort (kết hợp Text to Column nếu muốn sort theo tên)
Bạn có chủ đề nào khác mới lạ thì đưa lên chứ làm hoài mấy cái này ---> Lười quá
Bạn nói rằng:
File em làm có vài trăm dòng vẫn chạy ào ào mà.
Vậy xin đưa lên 1 file với vài trăm dòng cho mọi người tham khảo với!
Cảm ơn!
NDU
 
Lần chỉnh sửa cuối:
Mình xin gửi câu trả lời cho câu hỏi thứ nhất :
Sort tên với 6 ký tự,nếu trùng thì ưu tiên dòng trên, dữ liệu tối đa 999 dòng.
Test thử với 300 dòng, Máy P4 1G, Ram 512 mất 30s
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu không dùng F9 thì Calculate mệt thôi.
 
Không phủ nhận thành quả của bạn Hoangdanh nhưng phải xem lại cái vụ "chạy ào ào" ! Máy tớ cũng P4 3.0 GHz-1Gb Ram mà cũng đuối quá, có lẽ chỉ là đố cách vận dụng hàm chứ thực tế sử dụng thì e rằng...khó xơi !
 
Mình xin gửi câu trả lời cho câu hỏi thứ nhất :
Sort tên với 6 ký tự,nếu trùng thì ưu tiên dòng trên, dữ liệu tối đa 999 dòng.
Test thử với 300 dòng, Máy P4, Ram 512 mất 30s

Mèn ơi
máy của em hàng đồng bộ
Intel Pentium III prossesor
866 MHz
256 MB of RAM
Không phủ nhận thành quả của bạn Hoangdanh nhưng phải xem lại cái vụ "chạy ào ào" ! Máy tớ cũng P4 3.0 GHz-1Gb Ram mà cũng đuối quá, có lẽ chỉ là đố cách vận dụng hàm chứ thực tế sử dụng thì e rằng...khó xơi !
  1. Khi em mở file và thay đổi điều kiện xếp loại thì thanh Taskbar hiện thêm 1 biểu tượng Excel, mất khoảng hơn 2 phút đơ máy(suýt nữa thì động thủ vào nút Reset)
  2. Ai có máy cà tàng như của em thì hãy cẩn thận
 
Lần chỉnh sửa cuối:
Gửi các bạn file trả lời câu hỏi thứ 2
 

File đính kèm

Bạn hoangdanh282vn có thể diễn giải ý nghĩa và từng Name và thuật toán chi tiết được không? Mình đọc hoài về Name nhưng đầu óc ngu muội chưa hiểu hết được. Thấy các bạn và các anh làm hay quá, còn mình thì ...+-+-+-+
 
Bạn hoangdanh282vn có thể diễn giải ý nghĩa và từng Name và thuật toán chi tiết được không? Mình đọc hoài về Name nhưng đầu óc ngu muội chưa hiểu hết được. Thấy các bạn và các anh làm hay quá, còn mình thì ...+-+-+-+

Tối về mình sẽ viết diễn giải các name trong 3 câu trả lời, mai sẽ gửi lên

Mình xin gửi câu trả lời cho câu hỏi thứ 3
 

File đính kèm

Bởi vậy mới nói câu đố này chỉ là dợt chơi về thuật toán, thật sự không hiệu quả tí nào ---> Chậm lắm
Nếu mà bảo giáo viên dùng cái này để sort tên thì chả ai dám
Theo sự đánh giá của cá nhân tôi: Bài toán này không hay!
Việc convert từ ký tự ra số cứ việc bảo đãm nguyên tắc: Số không được vượt quá 15 ký tự (gần tương đương với 7 ký tự) là ổn
 
Lần chỉnh sửa cuối:
Bởi vậy mới nói câu đố này chỉ là dợt chơi về thuật toán, thật sự không hiệu quả tí nào ---> Chậm lắm
Nếu mà bảo giáo viên dùng cái này để sort tên thì chả ai dám
Theo sự đánh giá của cá nhân tôi: Bài toán này không hay!
Việc convert từ ký tự ra số cứ việc bảo đãm nguyên tắc: Số không được vượt quá 15 ký tự (gần tương đương với 7 ký tự) là ổn


ĐÚng là quá chậm, ứng dụng rất hạn chế

Công cụ sort đã có sẵn trong Excel - thao tác giản đơn hiệu quả và nhanh

Tuy nhiên loạt bài này cũng giúp ng dùng hiểu thêm về khả năng của NAME, và cách vận dụng đặt NAME khéo léo
.
 
Bạn hoangdanh282vn có thể diễn giải ý nghĩa và từng Name và thuật toán chi tiết được không? Mình đọc hoài về Name nhưng đầu óc ngu muội chưa hiểu hết được. Thấy các bạn và các anh làm hay quá, còn mình thì ...+-+-+-+

Gửi Anh phần diễn giải các Name và thuật toán của file gải đáp câu hỏi 1.
Hy vọng giúp được anh.

dk='loc sort'!$E$1
dk là ô chứa điều kiện xếp loại cần lọc

dl=OFFSET('loc sort'!$A$2,,,COUNTA('loc sort'!$A$2:$A$999),1)
dl là số vùng chứa tên học sinh

xl=OFFSET('loc sort'!$A$2,,1,COUNTA('loc sort'!$A$2:$A$999),1)
xl là vùng chứa xếp loại tương ứng với vùng chứa tên hs

ten=TRIM(RIGHT(SUBSTITUTE(TRIM(dl)," "," "),10))&" "
ten là mảng chứa tên các học sinh sau khi đã tách lấy tên và chèn thêm 6 khoảng trắng vào sau tên mới được tách.

ma=" aáàảãạăắằẳẵặâấầẩẫậbcdđeéèẻẽẹêếềểễệfghiíìỉĩịjklmnoóòỏõọôốồổỗộơớờởỡợpqrstuúùủũụưứừửữựvwxyýỳỷỹỵz"
ma là chuỗi text chứa các ký tự sắp sếp theo thứ tự tăng dần từ ký tự khoảng trắng đến ký tự z

soss=SEARCH(LEFT(ten,1),ma)+SEARCH(MID(ten,2,1),ma)/100+SEARCH(MID(ten,3,1),ma)/10^4+SEARCH(MID(ten,4,1),ma)/10^6+SEARCH(MID(ten,5,1),ma)/10^8+SEARCH(MID(ten,6,1),ma)/10^10+ROW(dl)/10^13
soss là số dùng để so sánh thứ tự của các ký tự có trong chuỗi tên của từng học sinh.

SEARCH(LEFT(ten,1),ma) : tìm vị trí của ký tự đầu tiên của chuỗi tên trong chuỗi text (ma) chứa mã các ký tự. Ta tạm gọi là số 1
SEARCH(MID(ten,2,1),ma)/100 : tìm vị trí của ký tự thứ hai của chuỗi tên trong chuỗi text ma, sau đó dem chia cho 100. Mục đích nhằm tạo ra một số >0 và <1. Ta tạm gọi là số 2. Nếu trong khi dò tìm mà có hai số 1 bằng nhau thì ta sẽ xét đến số 2 này. Do số 1 có giá trị lớn nhất là 94 nên ta phải lấy vị trí của ký tự thứ hai chia cho 100
SEARCH(MID(ten,3,1),ma)/10^4 : tìm vị trí của ký tự thứ ba của chuỗi tên trong chuỗi text ma, sau đó dem chia cho 10,000. Mục đích nhằm tạo ra một số >0 và <0.01. Ta tạm gọi là số 3. Nếu trong khi dò tìm mà có hai số 1 bằng nhau, hai số 2 bằng nhau thì ta sẽ xét đến số 3 này.
…..ROW(dl)/10^13 : lấy vị trí dòng chứa tên của mỗi học sinh chia cho 10^13. Sau khi dò tìm mà có sự trùng lắp từ ký tự thứ nhất đến ký tư thứ 6 thì sẽ so sánh đến số này.

row=MAX((SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss))*ROW(dl))
row là số chỉ dòng của dữ liệu dò tìm nếu thỏa mãn điều kiện dò tìm (xếp loại) và có số soss bé thứ Row()-1 trong tất cả các dòng thỏa mãn điều kiện dò tìm.
(xl=dk) : là mảng TRUE FALE có các phần tử tương ứng với các phần tử có trong mảng xl, nếu phần tử nào bằng với điều kiện thì trả về TRUE, ngược lại trả về FALSE.
(xl=dk)*(soss) : là mảng các phần tử số tương ứng với mảng soss, nếu phấn tử số nào trong mảng soss tương ứng với phần tử TRUE trong mảng (xl=dk) thì sẽ trả về giá trị của phần tử số đó, ngược lại trả vế 0.
(xl=dk)=FALSE : là mảng TRUE FALE có các phần tử tương ứng với các phần tử cá trong mảng (xl=dk), nếu phần tử nào trong mảng (xl=dk) bằng FALSE thì trả về TRUE, ngược lại trả về FALSE.
((xl=dk)=FALSE)*1 : là mảng gồm các phần tử 0 và 1, nếu phần tử nào trong mảng (xl=dk)=FALSE là TRUE thì trả về 1, ngược lại trả về 0.
SUM(((xl=dk)=FALSE)*1) : tính tổng của mảng (xl=dk)=FALSE)*1, mục đích là đếm xem có bao nhiêu dòng trong vùng xl không thỏa mãn điều kiên dọ tìm.
SUM(((xl=dk)=FALSE)*1)+ROW()-1 : tìm vị trí của dòng bé thứ ROW()-1 thỏa mãn điều kiện dò tìm.
SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1) : tìm phần tử bé thứ SUM(((xl=dk)=FALSE)*1)+ROW()-1 trong mảng ((xl=dk)*(soss))
(SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss)) : so sánh mảng SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1) với mảng (soss), sẽ trả về một mãng TRUE FALSE (một TRUE và nhiều FALSE)
(SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss))*ROW(dl) : tạo ra một mảng chứa các phần tử là vị trí dòng có trong mảng dl, nếu là TRUE thì trả về vị trí dòng, ngược lại trả về 0 (chỉ có 1 phần tử >0, còn lại đều là 0).
MAX((SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss))*ROW(dl)) : tìm ra phần từ >0 duy nhất, là vị trí của dòng dữ liệu cần tìm.

Và cuối cùng là công thức dò tìm dựa vào chỉ số dòng cột
=TRIM(IF(ISERR(INDEX(dl,row-1,1)),"",INDEX(dl,row-1,1)))
 
Lần chỉnh sửa cuối:
nhờ mọi người chỉ giáo...

nhờ mọi người giúp đỡ hàm tìm dữ liệu để dò ra ??? . TKs nhieu...(co file dinh kem)
 

File đính kèm

Lần chỉnh sửa cuối:
Tớ thì nhìn đã sợ rồi, cả 1 rừng name thế kia cơ mà.
Trong khi đó nếu dùng VBA thì chỉ 1 hàm là xong.

Không biết các bác định thử sức với công thức hay định giải quyết 1 vấn đề nào đó ???

Thân!
Mình tán đồng ý kiến này. Nhìn vào rừng đó để hiểu sợ hơi lâu.
Hy vọng được xem đáp án có giải pháp đơn giản và dễ hiểu.
 
Bài này nếu làm bình thường theo thứ tự thì rất dễ. nhưng không hiểu ý bạn " ra đề " nhằm mục đfích gì ? Hay là thi học sinh " gỏi" đây
 
Cho mình hỏi bạn Cao Mạnh Sơn nhé!
Mình thấy cách lọc dữ liệu của bạn rất hay và đơn giản.
Nhưng mình chưa hiểu lắm về cách tạo các địa chỉ như "loai" hay "ds".
Có thể giải thích rõ hơn không?
Cảm ơn nhìu!
 
Web KT

Bài viết mới nhất

Back
Top Bottom