Hỏi về Hàm RANK

Liên hệ QC

tanthutptpn

Thành viên mới
Tham gia
22/9/09
Bài viết
10
Được thích
1
Nghề nghiệp
Giáo viên
Mình muốn sắp xếp thứ hạng với điều kiện: nếu hai người có cùng thứ hạng thì so sánh dữ liệu (Ví dụ điểm toán của ai cao hơn) thì sẽ xếp hạng cao hơn.
Mình làm hoài chẳng được, các bạn chỉ giúp mình với!
Cảm ơn nhiều!
 
Mình muốn sắp xếp thứ hạng với điều kiện: nếu hai người có cùng thứ hạng thì so sánh dữ liệu (Ví dụ điểm toán của ai cao hơn) thì sẽ xếp hạng cao hơn.
Mình làm hoài chẳng được, các bạn chỉ giúp mình với!
Cảm ơn nhiều!
Bạn nên loại trừ tất cả những trường hợp có thể xảy ra nữa chứ.Không chỉ cùng 1 thứ hạng, điểm Toán của ai cao hơn thì xếp hạng cao hơn, vậy nếu điểm Toán nó bằng nhau nữa thì sao? Lấy căn cứ đâu để xếp hạng?
 
Mình muốn sắp xếp thứ hạng với điều kiện: nếu hai người có cùng thứ hạng thì so sánh dữ liệu (Ví dụ điểm toán của ai cao hơn) thì sẽ xếp hạng cao hơn.
Mình làm hoài chẳng được, các bạn chỉ giúp mình với!
Cảm ơn nhiều!
- Tạo 1 cột phụ với công thức =Điểm TB + Điểm Toán/1000
- Dùng hàm RANK với cột phụ này
Tuy nhiên:
- Nếu ĐTB bằng nhau và điểm toán cũng bằng nhau luôn thì tính sao đây?
Nói tóm lại:
- Cho file cụ thể lên
- Ghi rõ mọi trường hợp xảy ra để xếp hạng cho chính xác
 
Mình muốn sắp xếp thứ hạng với điều kiện: nếu hai người có cùng thứ hạng thì so sánh dữ liệu (Ví dụ điểm toán của ai cao hơn) thì sẽ xếp hạng cao hơn.
Mình làm hoài chẳng được, các bạn chỉ giúp mình với!
Cảm ơn nhiều!
theo tôi là xếp hạng (điểm trung bình+min(toán, lý ........)/1000??) nói ra thì khó quá vì tôi kém môn sư phạm lắm
tốt nhất bạn nên gửi file lên
 
Hàm rank nhưng trùng số lượng?

Muội có bài toán sau
- Lấy ra 05 acc có số tiền lớn nhất (những acc có số tiền bằng nhau vẫn tính) ví dụ
a1 100
a2 100
a3 100
a4 80
a5 80
a6 70
a7 50
a8 40
a9 30

Như trên thì 05 acc có số tiền lớn nhất sẽ là (a1; a2; a3; a4; a5)

Huynh xem file và chỉ giúp (công thức hay VBA cũng được ạh)
Muội cám ơn
 

File đính kèm

Muội có bài toán sau
- Lấy ra 05 acc có số tiền lớn nhất (những acc có số tiền bằng nhau vẫn tính) ví dụ
a1 100
a2 100
a3 100
a4 80
a5 80
a6 70
a7 50
a8 40
a9 30

Như trên thì 05 acc có số tiền lớn nhất sẽ là (a1; a2; a3; a4; a5)

Huynh xem file và chỉ giúp (công thức hay VBA cũng được ạh)
Muội cám ơn

Có một số cách (dùng công thức & Pivot,...)
Bạn tham khảo qua file
 

File đính kèm

Huynh Butmuc ơi,
1. Bằng công thức
Cám ơn bài giải của Huynh nhưng nó chưa tổng quát, thực tế dữ liệu acc không nằm theo thứ tự để mình counfif và chèn nó vào hàm match
Trong trường hợp các acc nằm lung tung thì bài toán trên bị sai hết

2. Dùng pivot
Làm sao mình đã biết a1, a2, ...a5 là nhiều nhất
 
Lần chỉnh sửa cuối:
Huynh Butmuc ơi,
1. Bằng công thức
Cám ơn bài giải của Huynh nhưng nó chưa tổng quát, thực tế dữ liệu acc không nằm theo thứ tự để mình counfif và chèn nó vào hàm match
Trong trường hợp các acc nằm lung tung thì bài toán trên bị sai hết

Có cách, đó là dùng mảng
Xem file!
Nhưng dù sao theo tôi thì nên dùng VBA bằng cách:
- Sort dữ liệu
- Lấy 5 dòng đầu tiên copy sang vị trí mới
- Trả dữ liệu về ban đầu
 

File đính kèm

Có cách, đó là dùng mảng
Xem file!
Nhưng dù sao theo tôi thì nên dùng VBA bằng cách:
- Sort dữ liệu
- Lấy 5 dòng đầu tiên copy sang vị trí mới
- Trả dữ liệu về ban đầu

1. Nếu muốn học thuật toán thì em sẽ cố gắng dùng công thức (công thức của Huynh siêu quá, muội đang ngâm cứu)
2. Nếu sử dụng cho nhanh em sẽ dùng VBA

Cám ơn Huynh NDU
 
Mình tham gia hàm UDF (Xếp theo cột 2):
(Xin phép mượn File của Ndu nha)
Mã:
Function chon(Rg As Range, Stt As Integer, cot As Integer)
Dim mg(), i, j, tam1, tam2
mg = Rg.Value
For i = 1 To UBound(mg, 1)
    For j = i To UBound(mg, 1)
         If mg(i, 2) < mg(j, 2) Then
            tam1 = mg(i, 1): tam2 = mg(i, 2)
            mg(i, 1) = mg(j, 1): mg(i, 2) = mg(j, 2)
        mg(j, 1) = tam1: mg(j, 2) = tam2
    End If
Next
Next
chon = mg(Stt, cot)
End Function
Cú pháp: =chon(Vung 2 cot, Stt,cot)
 

File đính kèm

Lần chỉnh sửa cuối:
To: Huynh NDU
VBA dùng sort trong trường hợp này không được vì giá trị của muội ở dạng công thức nên có sort nó cũng đứng yên
(hình như 2007 có sort theo top ten nên mình có thể tận dụng được)

To: Huynh Sealand
Muội đần quá không hiểu code của Huynh như nào ..hic

1.
PHP:
Ubound(Mg,1) được hiểu như nào?

2. Đoạn code sau Nằm trong For ...next muội chưa hiểu
 
Không hiểu nổi name Pos

Có cách, đó là dùng mảng
Xem file!
Nhưng dù sao theo tôi thì nên dùng VBA bằng cách:
- Sort dữ liệu
- Lấy 5 dòng đầu tiên copy sang vị trí mới
- Trả dữ liệu về ban đầu

Em đã ngồi đọc đi đọc lại nhưng không thể hiểu đuợc name Pos cụ thể trong
Nguyên name Pos
=IF(OFFSET(Name,,1)=Sheet1!$E8,ROW(INDIRECT("1:"&ROWS(OFFSET(Name,,1)))),"")

Không hiểu chỗ


Em chỉ hiểu được quy trình như sau
Đối chiếu lần lượt từng giá trị trong offset(name,,1) với ô E8
- Nếu bằng nhau ta có ROW(INDIRECT("1:"&ROWS(OFFSET(Name,,1)))
- Không bằng bỏ qua

Không hiểu sao từ ROW(INDIRECT("1:"&ROWS(OFFSET(Name,,1))) ta lại có Name Pos để kết hợp với hàm Small nhỉ?

Muội đau đầu quá, xin các Huynh giải giúp
 
Tường Vi đừng nói vậy, có những vấn đề chưa biết chứ không thể không biết nếu quyết tìm hiểu nó phải không, mình là người đi gom kinh nghiệm của các vị tiền bối GPE trước bạn mà thôi


1/Ubound(mg,1):
Xác định số phần tử của mg theo chiều 1. Nếu Ubound(mg,2) chắc chắn là 2 vì chiều 2 tương ứng với 2 cột.


2/Cặp đôi For …Next trong hàm là các vòng lặp truyền thống mà các vị tiền bối vẫn dùng trong việc sắp xếp mảng. Theo kinh nghiệm của GPE việc sắp xếp trên mảng sẽ nhanh hơn nhiều so với sắp xễp trên Sheet mà lại không ảnh hưởng gì đến Sheet. Chỉ có điều mình mở rộng để sắp xếp mảng đa chiều.
Nói nhỏ nha: Nếu sắp xếp mảng một chiều có chiêu sắp xếp không dùng vòng lặp của rollover79 thật kinh ngạc. Tiếc rằng chiêu đó chưa vận dụng cho mảng đa chiều được.
 
Cám ơn Huynh Sealand, Huynh giải thích giúp muội công thức của Sư Huynh NDU không?
Muội chưa hiểu name Pos
 
Kiên nhẫn đi, Ndu là người khá là đầu cuối nên không bỏ giữa chừng đâu. Vậy bạn cứ nghiên cứu đến tầm là anh ấy sẽ chẻ vụn cái Name ấy ra cho bạn thấy. Để hiểu được bạn cứ cắt từng đoạn Name đó và đặt vào 1 ô xem kết quả là gì thì sẽ hiểu.
Riêng mình, mình không thích Name lắm sau cái vụ Name rác. Thế nên Tường Vi để ý bài của mình sẽ thấy thà mình dùng cột phụ chứ ít khi dùng Name. Bí lắm thì mình dùng VBA. Chính vì vậy nên mình không giải thích thấu đáo được cho Tường Vi. Thông cảm nha.
 
Kiên nhẫn đi, Ndu là người khá là đầu cuối nên không bỏ giữa chừng đâu. Vậy bạn cứ nghiên cứu đến tầm là anh ấy sẽ chẻ vụn cái Name ấy ra cho bạn thấy. Để hiểu được bạn cứ cắt từng đoạn Name đó và đặt vào 1 ô xem kết quả là gì thì sẽ hiểu.
Riêng mình, mình không thích Name lắm sau cái vụ Name rác. Thế nên Tường Vi để ý bài của mình sẽ thấy thà mình dùng cột phụ chứ ít khi dùng Name. Bí lắm thì mình dùng VBA. Chính vì vậy nên mình không giải thích thấu đáo được cho Tường Vi. Thông cảm nha.

Hôm qua muội cũng chắt name ra ngồi xem, nhưng khá thú vị là cái anh Row(indirect...mà paste vào cell nó thành #NUM

Ngồi ngâm mãi cũng hiểu ra được nguyên tắc của nó
1. Với Name Pos: Muội bỏ offset đi còn lại
=IF(OFFSET(Name;;1)=Sheet1!$E17;ROW(INDIRECT("1:"&ROWS(Name)));"")

Công thức ROW(INDIRECT("1:"&ROWS(Name))) sẽ tạo ra một mảng số từ 1 đến Rows (nếu thoả mãn điều kiện)
Và ta chỉ việc lấy được mảng số này và đưa vào hàm Small là ok

------> Quá hay

2. Duy nhất em thắc mắc là tại sao em test hàm row trên sheet ví dụ = Row(1:5) bằng 1 nhưng hoặc Row(2:5) = 2, dù có kéo đi đâu nó vẫn như vậy
==> Nhưng khi đưa vào Name nó lại tạo ra được một mảng số nhể

Chỉ có mỗi cái name này (đêm qua ngồi nghĩ, sáng trên đường đi làm nghĩ.....hi hi đến giờ mới nghĩ ra)

Ẹc ẹc

Cám ơn các sư Huynh
 
Em đã ngồi đọc đi đọc lại nhưng không thể hiểu đuợc name Pos cụ thể trong
Nguyên name Pos


Không hiểu chỗ



Em chỉ hiểu được quy trình như sau
Đối chiếu lần lượt từng giá trị trong offset(name,,1) với ô E8
- Nếu bằng nhau ta có ROW(INDIRECT("1:"&ROWS(OFFSET(Name,,1)))
- Không bằng bỏ qua

Không hiểu sao từ ROW(INDIRECT("1:"&ROWS(OFFSET(Name,,1))) ta lại có Name Pos để kết hợp với hàm Small nhỉ?

Muội đau đầu quá, xin các Huynh giải giúp
Có thể diễn nôm thế này:
Nếu OFFSET(Name,,1)=Sheet1!$E8 thì... đánh STT từ 1 đến... ---> Đến bao nhiêu là do thằng ROWS(OFFSET(Name,,1)) xác định ---> Nó là tổng số dòng của Name thôi
Ví dụ ROWS(OFFSET(Name,,1)) cho kết quả = 20 (tức 20 dòng) thì ROW(INDIRECT("1:"&ROWS(OFFSET(Name,,1)))) sẽ bằng ROW($1:$20)
Nói lại lần nữa:
Nếu OFFSET(Name,,1)=Sheet1!$E8 thì... đánh STT từ 1 đến số nào đó chính bằng tổng số dòng của Name
--------------
Bạncó thể quét chọn vùng dữ liệu C2:C21 rôi gõ vào thanh Formula công thức
=IF(OFFSET(Name,,1)=Sheet1!$E2,ROW(INDIRECT("1:"&ROWS(OFFSET(Name,,1)))),"")
sau đó Ctrl + Shift + Enter để xem kết quả của từng phần tử
--------------------
Còn code của anh sealand chẳng qua chỉ là code sort mảng thôi mà (tìm từ khóa sort mảng trên diễn đàn để biết thêm chi tiết)
---------------------
2. Duy nhất em thắc mắc là tại sao em test hàm row trên sheet ví dụ = Row(1:5) bằng 1 nhưng hoặc Row(2:5) = 2, dù có kéo đi đâu nó vẫn như vậy
==> Nhưng khi đưa vào Name nó lại tạo ra được một mảng số nhể
Hàm ROW là hàm mảng (tôi đã nói nhiều lần trên diễn đàn rồi) ---> Bạn gõ = Row(1:5) nó ra bao nhiêu kệ nó, quan trọng là khi bạn quét chọn công thức này trên thanh Formula rồi F9 thì sẽ thấy ---> Đấy mới chính là kết quả thật sự của Row(1:5)
 
Lần chỉnh sửa cuối:
Hàm ROW là hàm mảng (tôi đã nói nhiều lần trên diễn đàn rồi) ---> Bạn gõ = Row(1:5) nó ra bao nhiêu kệ nó, quan trọng là khi bạn quét chọn công thức này trên thanh Formula rồi F9 thì sẽ thấy ---> Đấy mới chính là kết quả thật sự của Row(1:5)

Cám ơn Huynh NDU nhiều nhiều
Do công việc nên lâu rồi mới học thêm được bài mới, thấy vui quá.. he he
 
Huynh Butmuc ơi,
1. Bằng công thức
Cám ơn bài giải của Huynh nhưng nó chưa tổng quát, thực tế dữ liệu acc không nằm theo thứ tự để mình counfif và chèn nó vào hàm match
Trong trường hợp các acc nằm lung tung thì bài toán trên bị sai hết

Giờ mới ngó lại thấy thật buồn , bạn nói rõ từ đầu thì có phải đỡ mất thời gian không???
Lúc bạn đưa dữ liệu lên bạn phải nói rõ chứ - dữ liệu bạn được bố trí như vậy nên tôi chỉ tinh giản cho nó gọn trong trường hợp vừa đủ thôi.
Bây giờ thì Bác Ndu đã thực hiện đầy đủ các yêu cầu phát sinh cho bạn!


2. Dùng pivot
Làm sao mình đã biết a1, a2, ...a5 là nhiều nhất

Sao lại không biết - Bạn yên tâm về độ chính xác của Pivot - bởi vì cái này bên Microsoft người ta làm, tôi chỉ yêu cầu Pivot làm bảng chọn ra Top 5 giá trị lớn nhất còn của a1, a2, ...a5 hay a nào đó thì tự nó tham chiếu và tìm kiếm thôi.
 
Huynh

Giờ mới ngó lại thấy thật buồn , bạn nói rõ từ đầu thì có phải đỡ mất thời gian không???
Lúc bạn đưa dữ liệu lên bạn phải nói rõ chứ - dữ liệu bạn được bố trí như vậy nên tôi chỉ tinh giản cho nó gọn trong trường hợp vừa đủ thôi.
Bây giờ thì Bác Ndu đã thực hiện đầy đủ các yêu cầu phát sinh cho bạn!




Sao lại không biết - Bạn yên tâm về độ chính xác của Pivot - bởi vì cái này bên Microsoft người ta làm, tôi chỉ yêu cầu Pivot làm bảng chọn ra Top 5 giá trị lớn nhất còn của a1, a2, ...a5 hay a nào đó thì tự nó tham chiếu và tìm kiếm thôi.


Ấy Huynh Butmuc ơi, sao lại buồn
Muội biết ơn Huynh mà nhưng do trao đổi nên muội ghi vậy thôi
Muội sẽ rút kinh nhiệm lần sau hỏi han rõ hơn

Hi hi
 
Web KT

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

Back
Top Bottom