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

Liên hệ QC

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

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,902
Được thích
5,306
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Mình có một thách đố về việc lọc tìm dữ liệu như sau :
Mình có một list danh sách họ và tên học sinh ở cột A, Cột B chứa xếp loại của từng học sinh.
Yêu cầu là lọc ra một list danh sách các em có xếp loại thỏa mãn theo điều kiện chứa trong ô E1 (giỏi, khá, trung bình, yếu ) và sắp xếp list này theo thứ tự A,B,C...
 

File đính kèm

chài ai khó thía!
cho E hỏi làm bài này bằng cách chi? E tạo thêm vài bảng phụ được không?
Phùng Tiến Đạt và Phạm Tiến Đạt ai sắp trước? Nhân và Nhan, ai sắp trước?
 
Giải thích rõ hơn tí đồng chí ơi!
Lộc bằng công thức hay bằng VBA hay là gì?
 
Và còn thiếu một số thứ nữa: Thời gian làm bài, giải thưởng ...
 
Mình có một thách đố về việc lọc tìm dữ liệu như sau :
Mình có một list danh sách họ và tên học sinh ở cột A, Cột B chứa xếp loại của từng học sinh.
Yêu cầu là lọc ra một list danh sách các em có xếp loại thỏa mãn theo điều kiện chứa trong ô E1 (giỏi, khá, trung bình, yếu ) và sắp xếp list này theo thứ tự A,B,C...
  1. Hoàn toàn có thể làm bằng công thức (có điều phải thêm rất nhiều cột phụ)
    1. Lọc ra danh sách thoa mãn điều kiện
    2. Tách lấy phần TÊN
    3. Dùng hàm Tách TÊN thành các nguyên âm, phụ âm
    4. Lấy mã của các nguyên âm, phụ âm để làm dữ liệu SORT theo A B C
    5. Lấy danh sách sau khi đã SORT
  2. Dùng VBA thì đơn giản hơn nhiều (nhưng mà em lại mù tịt)
 
Lần chỉnh sửa cuối:
Thực ra cái này chỉ khó 1 tí là sắp xếp tên tiếng Việt theo trật tự ABC thôi. Còn cái khác thì đơn giản. Tuy nhiên có 1 có cách rất đơn giản thế này: Bạn cài bộ Viet Key Office2000 (thực chất là 1 macro) trong đó có phần sắp xếp danh sách tiếng Việt. Sau đó dùng Auto Filter rồi chọn điều kiện lọc là xong. Ko cần phải dùng hàm nào khác. Chúc vui
 
Thực ra cái này chỉ khó 1 tí là sắp xếp tên tiếng Việt theo trật tự ABC thôi. Còn cái khác thì đơn giản. Tuy nhiên có 1 có cách rất đơn giản thế này: Bạn cài bộ Viet Key Office2000 (thực chất là 1 macro) trong đó có phần sắp xếp danh sách tiếng Việt. Sau đó dùng Auto Filter rồi chọn điều kiện lọc là xong. Ko cần phải dùng hàm nào khác. Chúc vui
Chắc không phải vậy chứ,tác giả của bài toán này không đưa ra đơn giản như vậy.Nếu chỉ soft,lọc bằng auto filter thì đơn giản rồi nhưng không lẽ danh sách đảo lộn hết cả sao. Mình mới chỉ lọc danh sách ra theo yêu cầu từng loại nhưng soft thì chưa nghĩ ra,mình sẽ nghĩ tiếp nhưng đưa thử file lên mọi người tham khảo
 

File đính kèm

Cho mình giải thích thêm vì hôm qua gấp quá nên chưa giải thích rõ.
Thứ nhất là không dùng VBA.
Thứ hai là không dùng cột phụ (có chức công thức) để phụ giúp thao tác.
Thứ ba là sort theo 2 ký tự đầu của tên (càng nhiều ký tự càng phức tạp nên chỉ lấy 2). Nếu trùng nhau thì ưu tiên lấy thứ tự hàng nhỏ nhất.
Bài này có thể áp dụng cho nhiều điều kiện trích lọc chứ không riêng gì xếp loại không. Nhưng bài trên chỉ lấy 1 điều kiện.
Ngoài ra, các Bác VBA hay các bạn có thể dùng cột phụ để tìm ra giải pháp về tốc độ
Thân!

Và còn thiếu một số thứ nữa: Thời gian làm bài, giải thưởng ...

Thời gian cuối là trước 3 ngày sinh nhật GPE
Giải thường là một chầu Cafe để giao lưu thân tình.
Thân
 
Chỉnh sửa lần cuối bởi điều hành viên:
Giải pháp thế này sẽ đơn giản
  1. Tách lấy phần tên rồi lại tách lấy 2 ký tự đầu của tên
  2. Sort data gốc trước dựa trên 2 ký tự đầu tiên
  3. Dùng công thức lọc ra danh sách thỏa mãn điều kiện
 
Giải pháp thế này sẽ đơn giản
  1. Tách lấy phần tên rồi lại tách lấy 2 ký tự đầu của tên
  2. Sort data gốc trước dựa trên 2 ký tự đầu tiên
  3. Dùng công thức lọc ra danh sách thỏa mãn điều kiện
Không được động và database mới Pro. VBA thì anh Chibi đã làm rồi, công thức mới là vấn đề để nói.
 
E dùng cột phụ, sort được hết toàn bộ , ưu tiên: tên ---> họ ---> chử lót
 

File đính kèm

E dùng cột phụ, sort được hết toàn bộ , ưu tiên: tên ---> họ ---> chử lót
bạn ơi xem lại yêu cầu đi
Thứ nhất là không dùng VBA.
Thứ hai là không dùng cột phụ (có chức công thức) để phụ giúp thao tác.
Thứ ba là sort theo 2 ký tự đầu của tên (càng nhiều ký tự càng phức tạp nên chỉ lấy 2). Nếu trùng nhau thì ưu tiên lấy thứ tự hàng nhỏ nhất.
chà,khó quá,mình vẫn chưa giải quyết được
 
E dùng cột phụ, sort được hết toàn bộ , ưu tiên: tên ---> họ ---> chử lót

Một cách làm hay

I- Chưa đúng yêu cầu đề bài
hoangdanh282vn đã viết:
  1. Thứ nhất là không dùng VBA.
  2. Thứ hai là không dùng cột phụ (có chứa công thức) để phụ giúp thao tác.
  3. Thứ ba là sort theo 2 ký tự đầu của tên (càng nhiều ký tự càng phức tạp nên chỉ lấy 2). Nếu trùng nhau thì ưu tiên lấy thứ tự hàng nhỏ nhất.

II- Hãy xem lại
  1. Khi lọc Xếp loại: G các cặp STT: (9; 10); (44; 45); (53; 54) có tên trùng nhau
  2. Khi lọc Xếp loại: K các cặp STT (43; 44) có tên trùng nhau
 
Gửi Danh: tôi thấy trong cột họ và tên ở bảng dữ liệu, đa số các dòng đều có tên cách họ lót 2 khoảng trắng nhưng có một số dòng có tên lại cách họ lót 1 khoảng trắng. Vậy có thể chỉnh sửa dữ liệu cho thống nhất không?????
 
Khi lọc Xếp loại: G các cặp STT: (9; 10); (44; 45); (53; 54) có tên trùng nhau​
  1. Khi lọc Xếp loại: K các cặp STT (43; 44) có tên trùng nhau
Cách làm không sai, nhưng vì excel không thể tính toán được với số quá lớn ---> khi đổi nguyễn minh hoàng và võ viết hoàng ra number thì có sai lệch, nhưng excel lại làm tròn và cho là chúng = nhau
----> bài toán này khó mà thực hiện được
 
Lần chỉnh sửa cuối:
Cách làm không sai, nhưng vì excel không thể tính toán được với số quá lớn ---> khi đổi nguyễn minh hoàng và võ viết hoàng ra number thì có sai lệch, nhưng excel lại làm tròn và cho là chúng = nhau
----> bài toán này khó mà thực hiện được

xem file, mình hiểu cách làm của bạn rồi, nhưng có thể khắc phục số lớn bằng cách ghép các con số thành dạng text
VD: chữ boyxin
match("b",Ma,0)= 20
match("o",Ma,0)= 48
match("y",Ma,0)= 85
match("x",Ma,0)= 84
match("i",Ma,0)= 38
match("n",Ma,0)= 47
thay vì tạo ra số 204885843847 thì ta tạo thành dạng text 204885843847
Bạn thử xem có được không?
 
xem file, mình hiểu cách làm của bạn rồi, nhưng có thể khắc phục số lớn bằng cách ghép các con số thành dạng text

Bạn thử xem có được không?
Đã thử ---> Không được!
Tạm thời sửa lại:
Chia cột phụ cho 10^12 để giãm nhỏ số ---> cộng mổi cell với ROW()/10000 ---> giãi quyết được tình trạng tên gần trùng ---> Excel hiểu là trùng
Vẩn CP, nếu không thì bó hand.
Dù gì vẩn phải có bảng mã chứ
!!!
 

File đính kèm

Lần chỉnh sửa cuối:
Vậy thì các bác nào thích VBA thì hãy thi về tốc độ và sự đơn giản nhưng tiện lợi vậy. !!!!!!!!???????????
(Bằng UDF, bằng Sub . . )


Thân!
 
Đúng là thách đố. Tôi sẽ chờ kết quả xem nó là cái gì? Ứng dụng vào đâu?
 
Đúng là thách đố. Tôi sẽ chờ kết quả xem nó là cái gì? Ứng dụng vào đâu?

he he he, sao giống ý tui vậy
(cho dùng 1 cột phụ chứa công thức thì công làm được)
tất nhiên là còn cần thêm 1 cột không chứa công thức đó là cột chứa thứ tự các chữ cần sắp xếp theo tiêu chuẩn săp xếp A, B, C​
 
Đã thử ---> Không được!
Tạm thời sửa lại:
Chia cột phụ cho 10^12 để giãm nhỏ số ---> cộng mổi cell với ROW()/10000 ---> giãi quyết được tình trạng tên gần trùng ---> Excel hiểu là trùng
Vẩn CP, nếu không thì bó hand.
Dù gì vẩn phải có bảng mã chứ
!!!


rất hay,

NHƯNG bạn có thể bỏ cột phụ C ở sheet1 đi

còn cột phụ ở Sheet2 chấp nhận được coi như là DL --> TUY NHIÊN múôn bỏ cũng được bằng cách định nghĩa thành mảng TT character trong NAME,

cố lên nhé, bạn

tôi nghĩ là có thể làm --> bạn nhận giải thưởng,

NHƯNG quan trọng là ứng dụng thì cũng khá hẹp và có cần phải phức tạp hóa vấn đề thế không nhỉ - cái này đợi tác giả đặt câu hỏi giải thích....
 
Lần chỉnh sửa cuối:
Gửi Danh: tôi thấy trong cột họ và tên ở bảng dữ liệu, đa số các dòng đều có tên cách họ lót 2 khoảng trắng nhưng có một số dòng có tên lại cách họ lót 1 khoảng trắng. Vậy có thể chỉnh sửa dữ liệu cho thống nhất không?????

Đúng là dữ liệu có nhiều chổ dư nhiều khoảng trắng, đây cũng là yêu cầu của câu hỏi để tạo sự đa dạng. Dữ liệu trả về sẽ không còn nữa.
Mình nói thêm, chỉ dùng 1 cột phụ để lưu danh sách các từ như Boyxinh đã nêu (vì độ lớn của Name có giới hạn là 255 ký tự nên mượn tạm cột phụ, còn nếu tách thành 2 Name thì làm cho công thức trở nên nặng nề hơn, máy chạy chậm hơn)
 
NHƯNG quan trọng là ứng dụng thì cũng khá hẹp và có cần phải phức tạp hóa vấn đề thế không nhỉ - cái này đợi tác giả đặt câu hỏi giải thích....

Như em nói ở tựa Topic là thách đố, để chúng ta suy nghĩ và ôn lại các công thức.
Còn ứng dụng thì còn tùy thuộc vào mỗi người, mỗi trường hợp mà ta lồng ghép công thức vào.
và đây là một ứng dụng nho nhỏ :

Câu hỏi thách đố thứ 2 :

ta có một list danh sách các mặt hàng xuất hiện nhiều lần trong NKBH (cột A). ở cột C làm sao sử dụng được Validation với danh sách được trích ra trong cột A là duy nhất và đã được sắp xếp theo thứ tự ABC.. (cho dễ tìm)
Ghi chú là không sử dụng bất kỳ cột phụ nào để trích lọc ra danh sách duy nhất ở Cột B
 

File đính kèm

Lần chỉnh sửa cuối:
Không khả thi vì như đã nói, Excel không tính toán được với số quá lớn!
Bảng mã có 90 ký tự, vậy phải dùng lủy thừa của 100 ---> số quá lớn
Có khả năng Excel sẽ nhầm ở Đầu máy VCD và Đầu máy DVD
 
Không khả thi vì như đã nói, Excel không tính toán được với số quá lớn!
Bảng mã có 90 ký tự, vậy phải dùng lủy thừa của 100 ---> số quá lớn
Có khả năng Excel sẽ nhầm ở Đầu máy VCD và Đầu máy DVD

Như mình đã nói, để sort thì chỉ cần 2 ký tự đầu, nếu trùng nhau thì ưu tiên nằm ở dòng trên.
Muốn sort mấy ký tự cũng được tất, nhưng ở đây không cần thiết phải như thế. Càng so sánh nhiều ký tự, file càng nặng và chạy càng chậm.
Các bạn cố lên. Có nhiều cách khác mà, đâu nhất thiết phải lũy thừa
 
Như mình đã nói, để sort thì chỉ cần 2 ký tự đầu, nếu trùng nhau thì ưu tiên nằm ở dòng trên.
Muốn sort mấy ký tự cũng được tất, nhưng ở đây không cần thiết phải như thế. Càng so sánh nhiều ký tự, file càng nặng và chạy càng chậm.
Các bạn cố lên. Có nhiều cách khác mà, đâu nhất thiết phải lũy thừa
Thế thì quá dể, nhưng đó hỏng phải là sort mà là làm khó!
Không hay ---> Sort đúng như chức năng sort của Excel mới hay!
 
Thế thì quá dể, nhưng đó hỏng phải là sort mà là làm khó!
Không hay ---> Sort đúng như chức năng sort của Excel mới hay!

Ch­ưa hiểu ý bạn lắm.
Sort có sẵn của excel thì sort cho toàn bột các ký tự trong chuỗi. Còn ở câu đố này chỉ cần sort cho 2 ký tự đầu tiên thôi là ok.
Bạn gửi file cho mọi người xem thử cách của bạn nha.
 
lạc đề rồi, nếu làm văn mà tư tưởng thế này thì được mấy điểm nhỉ?


+ Oh, lại cho điểm trên Diễn đàn ah?, VBA là gợi ý thôi

+ Ý tưởng ndu96081631 tuy còn nhiều đến chưa tối ưu nhưng khá HAY,

+ ndu96081631 bạn có thể phát triển tiếp: Nên là Tên 3 (hoặc 2) ký tự Họ như thế có tính ứng dụng cao và // hay hơn nữa thì Tên & Họ (không có điệm) -- vậy là giải quyết được

+ Cuối cùng nếu rinh giải, nhơ tách cafe cho tigertiger nhé
.
 
Sort có sẵn của excel thì sort cho toàn bột các ký tự trong chuỗi. Còn ở câu đố này chỉ cần sort cho 2 ký tự đầu tiên thôi là ok.
Tôi vận dụng file của ndu96081631 làm lại thử, chưa biết có đúng ý không. Chỉ còn 1 cột phụ, hình như bỏ cột phụ này anhtuan1066 đã làm rồi.
Có vận dụng file của kimdong80 về tách tên.
Làm thử theo 3 ký tự của tên vì "ngh" + ... ít xảy ra.
 

File đính kèm

Tôi vận dụng file của ndu96081631 làm lại thử, chưa biết có đúng ý không. Chỉ còn 1 cột phụ, hình như bỏ cột phụ này anhtuan1066 đã làm rồi.
Có vận dụng file của kimdong80 về tách tên.
Làm thử theo 3 ký tự của tên vì "ngh" + ... ít xảy ra.
Em dùng 2 name này để tìm hiểu xem các bác làm thế nào
PHP:
 CTName=GET.NAME('[Rank_n_Sort-TN.xls]KQ'!RC7)
PHP:
List=NAMES(,3,)
Được kết quả: Nhìn đội ngũ name thế này thì em làm khán giả cổ vũ cho các bác nhận thưởng thôi
PHP:
_FilterDatabase='[Rank_n_Sort-TN.xls]KQ'!R1C1:R65C1
Chuoi1={"a";"á";"à";"ả";"ã";"ạ";"ă";"ắ";"ằ";"ẳ";"ẵ";"ặ";"â";"ấ";"ầ";"ẩ";"ẫ";"ậ";"b";"c";"d";"đ";"e";"é";"è";"ẻ";"ẽ";"ẹ";"ê";"ế";"ề";"ể";"ễ";"ệ";"g";"h";"i";"í";"ì";"ỉ";"ĩ";"ị";"k";"l";"m";"n";"o";"ó";"ò";"ỏ"}
Chuoi2={"õ";"ọ";"ô";"ố";"ồ";"ổ";"ỗ";"ộ";"ơ";"ớ";"ờ";"ở";"ỡ";"ợ";"p";"q";"r";"s";"t";"u";"ú";"ù";"ủ";"ũ";"ụ";"ư";"ứ";"ừ";"ử";"ữ";"ự";"v";"x";"y";"ý";"ỳ";"ỷ";"ỹ";"ỵ"}
Code=OFFSET('[Rank_n_Sort-TN.xls]KQ'!DS,,2)
Count1=IF(ISNA(MATCH(FChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi1,0)),MATCH(FChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi2,0)+46,MATCH(FChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi1,0))
Count2=IF(sChar="",0,IF(ISNA(MATCH(sChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi1,0)),MATCH(sChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi2,0)+46,MATCH(sChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi1,0)))
Count3=IF(tChar="",0,IF(ISNA(MATCH(tChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi1,0)),MATCH(tChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi2,0)+46,MATCH(tChar,'[Rank_n_Sort-TN.xls]KQ'!Chuoi1,0)))
CTName=GET.NAME('[Rank_n_Sort-TN.xls]KQ'!RC7)
DS=OFFSET('[Rank_n_Sort-TN.xls]KQ'!R2C1,,,COUNTA('[Rank_n_Sort-TN.xls]KQ'!R2C1:R1000C1),)
FChar=LOWER(LEFT(Name,1))
List=NAMES(,3,)
Name=IF(ISERROR(FIND(" ",TRIM('[Rank_n_Sort-TN.xls]KQ'!RC1))),TRIM('[Rank_n_Sort-TN.xls]KQ'!RC1),TRIM(RIGHT(SUBSTITUTE(TRIM('[Rank_n_Sort-TN.xls]KQ'!RC1)," ",REPT(" ",10)),10)))
sChar=LOWER(MID(Name,2,1))
tChar=LOWER(MID(Name,3,1))
XL=OFFSET('[Rank_n_Sort-TN.xls]KQ'!DS,,1)

các bác cố lên nhé
 
Tôi xin chú thích name nhé:
1/Name:
=IF(ISERROR(FIND(" ",TRIM(KQ!$A2))),TRIM(KQ!$A2),TRIM(RIGHT(SUBSTITUTE(TRIM(KQ!$A2)," ",REPT(" ",10)),10))) ie nếu không tìm thấy " " thì name là tên, nếu không thì nhân " " thành 10 lần và lấy trim(right(...,10)) = name vì tên VN không thể có độ dài > 10 (kimdong80)
2/ FChar, sChar, tChar:=LOWER(LEFT(Name,1)) Ký tự 1, 2, 3 của name (tên)
3/Chuoi1, chuoi2: mục đích là tìm thứ tự của FChar, sChar, tChar ={"a";"á";"à";"ả";"ã";"ạ";"ă";"ắ";"ằ";"ẳ";"ẵ";"ặ";"â";"ấ";"ầ";"ẩ";"ẫ";"ậ";"b";"c";"d";"đ";"e";"é";"è";"ẻ";"ẽ";"ẹ";"ê";"ế";"ề";"ể";"ễ";"ệ";"g";"h";"i";"í";"ì";"ỉ";"ĩ";"ị";"k";"l";"m";"n";"o";"ó";"ò";"ỏ"}
...
Tại sao có chuoi1, chuoi2 vì độ dài name không > nên phải tách 2 name
Chuoi1 có 46 ký tự
4/Count1:
=IF(ISNA(MATCH(FChar,KQ!Chuoi1,0)),MATCH(FChar,KQ!Chuoi2,0)+46,MATCH(FChar,KQ!Chuoi1,0))
Tương tự Count1, 2, 3
5/ Xếp hạng:
Count1*10000+IF(Count2=0,100,Count2*100)+IF(Count3=0,10,Count3*10)+ROW(),"")
ie
Khi trùng ký tự 1, xét đến 2, nếu trùng, ->3, nếu trùng thì + Row(), trên sẽ ưu tiên. Thuật toán này hơi giống với xếp hạng theo Lọai, ĐTB, HK ..., hay là xếp hạng bóng đá...
Mạn phép các bạn giải thích như thế!

Match(....,chuoi,0) => vị trí,
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi vận dụng file của ndu96081631 làm lại thử, chưa biết có đúng ý không. Chỉ còn 1 cột phụ, hình như bỏ cột phụ này anhtuan1066 đã làm rồi.
Có vận dụng file của kimdong80 về tách tên.
Làm thử theo 3 ký tự của tên vì "ngh" + ... ít xảy ra.

+ Sao anh không làm theo ý tưởng em (tigertiger) đề xuất trên nhỉ??? tên + 3 ký tự họ sẽ hay hơn

+ Cột phụ ở sheet họ tên khó bỏ - vì chúng ta xét thành mảng 2 chiều rùi (theo chiều ký tự của họ và 1 chiều theo DS

.
 
Lần chỉnh sửa cuối:
Tôi vận dụng file của ndu96081631 làm lại thử, chưa biết có đúng ý không. Chỉ còn 1 cột phụ, hình như bỏ cột phụ này anhtuan1066 đã làm rồi.
Có vận dụng file của kimdong80 về tách tên.
Làm thử theo 3 ký tự của tên vì "ngh" + ... ít xảy ra.

Bác làm hay lắm. Nhưng còn cột phụ thì vẫn chưa ok.
Bác làm xong thì làm luôn câu thứ 2 nha. Mình sắp ra câu đố thứ 3 cũng gần như thế nhưng khó hơn tí,.
Các bác hãy cố lên.
 
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!
 
  1. Cho mình giải thích thêm vì hôm qua gấp quá nên chưa giải thích rõ.
    • Thứ nhất là không dùng VBA.
    • Thứ hai là không dùng cột phụ (có chứa công thức) để phụ giúp thao tác.
    • Thứ ba là sort theo 2 ký tự đầu của tên (càng nhiều ký tự càng phức tạp nên chỉ lấy Nếu trùng nhau thì ưu tiên lấy thứ tự hàng nhỏ nhất.
  2. Bài này có thể áp dụng cho nhiều điều kiện trích lọc chứ không riêng gì xếp loại không. Nhưng bài trên chỉ lấy 1 điều kiện.
  3. Ngoài ra, các Bác VBA hay các bạn có thể dùng cột phụ để tìm ra giải pháp về tốc độ
Thời gian cuối là trước 3 ngày sinh nhật GPE
Giải thường là một chầu Cafe để giao lưu thân tình.
Thân

Với 3 yêu cầu như trên
  1. boyxin hoàn thành xuất sắc yêu cầu 1 (không dùng VBA)
  2. boyxin hoàn thành trên cả xuất sắc về yêu cầu 3 (không chỉ là sort 2 ký tự đầu mà sort full tên luôn)
  3. boyxin xin nhận 0 điểm về yêu cầu 2 (đang nghĩ mà chưa xong)
------------------------------------------------------------------
Để làm được bài này boyxin nhờ vào rất nhiều bài của các bác đã đăng trên GPE, đặc biệt là bài
xls.gif
Rank_n_Sort.xls
tại đây của
ndu96081631
user_offline.gif

Excel Member
gold.gif

-------------------------------------------------------------------------------------------
boyxin tập làm thôi, không giám mơ tưởng đến giải thưởng đâu, chỗ nào chưa hay mong nhận được sự góp ý chân thành
 

File đính kèm

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:
1- ƯU ĐIỂM:
a) Có khả năng lọc được 1 danh sách không liên tục
b) Loại bỏ được khoảng trắng thừa trong chuỗi do sai sót trong quá trình nhập liệu
c) Sort được đến 5 ký tự (Maximum khả năng tính toán của Excel)
d) Không có bất cứ cột phụ nào
2- NHƯỢC ĐIỂM:
a) Không lọc được các ký tự đặc biệt hoặc các ký tự không có trong bảng mã (nếu có nhu cầu riêng có thể thêm vào bảng mã)
b) Vì không thể dùng hàm CODE để tính toán với các ký tự tiếng Việt có dấu nên buộc phải xây dựng 1 bảng mã riêng (Name Alp)
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ự
d) Công thức mãng khá nặng nên cũng ảnh hưởng nhiều đến tốc độ tính toán nhất là khi làm việc với dử liệu lớn ---> Giãi pháp chỉ là giãi pháp, trên thực tế sẽ không hiệu quả bằng chức năng sort sẳn có của Excel
Đâ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
 

File đính kèm

Thế là bạn Rinh Giải rùi - CHúc mừng , chức mừng

1- ƯU ĐIỂM:a) Có khả năng lọc được 1 danh sách không liên tục
b) Loại bỏ được khoảng trắng thừa trong chuỗi do sai sót trong quá trình nhập liệu
c) Sort được đến 5 ký tự (Maximum khả năng tính toán của Excel)
d) Không có bất cứ cột phụ nào
Nếu có cột phụ thì ta có thể số ký tự dài hơn,

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)

Theo tigertiger thì NÊN sd 1 cột phụ và sắp xếp tên+HỌ, đã thử độ lớn của số nằm trong phạm vi chấp nhận được,
.

Và Ví dụ bạn đưa lên -> chưa lọc đ/k nhỉ
 
Lần chỉnh sửa cuối:
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!
 
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:

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
Đúng vậy! Vì phải gò vào công thức nên phức tạp thêm nhiều. Ở đây chúng ta được kế thừa công sức bao người trên diễn đàn cơ mà, mọi người hiến nhau miễn phí cả. Tôi thấy nếu dùng mấy cái Addin xếp tiếng Việt trước sau đó lọc thì chưa biết cái nào nhanh hơn. Mạo muội vậy các bạn thông cảm.
 
Cho mình hỏi bạn Cao Mạnh Sơn nhé.
Mình không hiểu cách tạo các địa chỉ như "loai" hay "Ds". Bạn có thể giải thích cho mình được không?
Cảm ơn nhìu!
 
Sao chưa thấy công bố giải thưởng và đáp án nhỉ?
 

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

Back
Top Bottom