Hỏi lại bài toán xếp vị thứ

  • Thread starter Thread starter BNTT
  • Ngày gửi Ngày gửi
Liên hệ QC

BNTT

Bùi Nguyễn Triệu Tường
Thành viên danh dự
Tham gia
3/7/07
Bài viết
4,946
Được thích
23,208
Nghề nghiệp
Dạy đàn piano
Tôi có vấn đề sau, tưởng là nhỏ, nhưng không nhỏ: Tôi muốn xếp vị thứ theo thứ tự 1, 2, 3, nếu trùng, cứ xếp trùng, nhưng không nhảy số như hàm RANK... Đây là bài toán của tôi:
111.png
Ở cột C, tôi dùng công thức:
(C1) = RANK(B1,$B$1:$B$28,0)
Và ở cột D, tôi dùng công thức:
D1 = RANK($B1,B$1:B$28,0)+COUNTIF($B$1:B1,B1)-1
Nhưng tôi muốn có được kết quả như ở cột E thì sao? Mò mẫm cả mấy tiếng đồng hồ rồi mà không ra. Nhờ các bạn giúp dùm. Dùng công thức, không dùng VBA.
 
À, tìm được 1 cách rồi! Xin góp vui thôi! Vì có vẻ hơi rừm rà! :-=:-=:-=
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi có vấn đề sau, tưởng là nhỏ, nhưng không nhỏ: Tôi muốn xếp vị thứ theo thứ tự 1, 2, 3, nếu trùng, cứ xếp trùng, nhưng không nhảy số như hàm RANK... Đây là bài toán của tôi:
111.png
Ở cột C, tôi dùng công thức:
(C1) = RANK(B1,$B$1:$B$28,0)
Và ở cột D, tôi dùng công thức:
D1 = RANK($B1,B$1:B$28,0)+COUNTIF($B$1:B1,B1)-1
Nhưng tôi muốn có được kết quả như ở cột E thì sao? Mò mẫm cả mấy tiếng đồng hồ rồi mà không ra. Nhờ các bạn giúp dùm. Dùng công thức, không dùng VBA.
THẾ NÀY CÓ ĐƯỢC KHÔNG
nhờ các bác loại bỏ giúp cột phụ​
 

File đính kèm

Cho em hỏi 1 chút nha! Nếu xếp vầy thì được gì? Nó có giúp gì cho việc xếp hạng không? Thanks.
 
Lần chỉnh sửa cuối:
Cho em hỏi 1 chút nha!
Nếu xếp vầy thì được gì?
Nó có giúp gì cho việc xếp hạng không?
Thanks.
Có nhiều ứng dụng cần đến việc sắp xếp như vầy lắm chứ bạn.
Ví dụ, tôi muốn biết con số có giá trị lớn thứ 3 trong danh sách ở cột B là số mấy? Nhờ việc sắp xếp này mà tôi biết được đó là số 89. Ở đây không dùng hàm LARGE() được đâu nhé.

Xin phép được đưa 2 công thức ra đây:
  • Anh SoiBien dùng công thức mảng:
    (E1) {= SUM(1 / (IF($B$1:$B$28 > B1, COUNTIF($B$1:$B$28, $B$1:$B$28), 9.999999E + 307))) + 1}

  • Anh ThuNghi biến đổi công thức này thành công thức thường:
    (E1) = 1 + SUMPRODUCT(($B$1:$B$28 > $B1) * (1 / COUNTIF($B$1:$B$28, $B$1:$B$28)))

Nhân tiện, xin hỏi anh SoiBien và anh ThuNghi, muốn sắp xếp theo thứ tự ngược lại thì sao? Nghĩa là từ nhỏ nhất đến lớn nhất? Là, số 98 sẽ có thứ tự là 14, còn số 5 có thứ tự là 1?


P/S
Xin đính chính lại hình đã gửi ở bài 1: Giá trị tại E3 là 5 (chứ không phải là 10)
 
Lần chỉnh sửa cuối:
muốn sắp xếp theo thứ tự ngược lại thì sao? Nghĩa là từ nhỏ nhất đến lớn nhất? Là, số 98 sẽ có thứ tự là 14, còn số 5 có thứ tự là 1?

P/S
Xin đính chính lại hình đã gửi ở bài 1: Giá trị tại E3 là 5 (chứ không phải là 10)
Dùng thử xem sao (chế từ công thức của bác ThuNghi)
PHP:
E1 = 1 + SUMPRODUCT(($B$1:$B$28 < $B1) * (1 / COUNTIF($B$1:$B$28, $B$1:$B$28)))
 
Dùng thử xem sao (chế từ công thức của bác ThuNghi)

E1 = 1 + SUMPRODUCT(($B$1:$B$28 < $B1) * (1 / COUNTIF($B$1:$B$28, $B$1:$B$28)))

Chính xác. Cảm ơn Boyxin nhé. Có thế mà mình nghĩ không ra. (Dạo này đầu óc hình như có vấn đề)
 
Hàm mảng tự tạo đây, xin mời tham khảo

Hàm này cho tự chon 1 trong 2 cách sắp xếp
* Sắp tuần tự & sắp đồng hạng
* Với ví dụ đã dẫn ở bài 1, ta có cú pháp
a*/ =XepHang(B1:B28;FALSE)
b*/ = XepHang(B1:B28)
Là hàm mảng, nên cần quét chọn vùng tại E1 hay F1 có số dòng đúng với số dòng của vùng 'B1:B28';
Kết thúc bằng tổ hợp 3 fím.

PHP:
Option Explicit:              Option Base 1

Function XepHang(Rng As Range, Optional DongHang As Boolean = True)
 Dim Temp, SoDong As Long, Jj As Long, Zz As Long
 
 SoDong = Rng.Rows.Count:                 ReDim MSL(SoDong, 1)
 ReDim MTT(SoDong, 1):                    MSL = Rng
 ReDim DaChep(SoDong) As Boolean
 For Jj = 1 To SoDong
   For Zz = Jj + 1 To SoDong
      If MSL(Jj, 1) > MSL(Zz, 1) Then
         Temp = MSL(Jj, 1):            MSL(Jj, 1) = MSL(Zz, 1)
         MSL(Zz, 1) = Temp
      End If
 Next Zz, Jj
 Dim B1 As Variant
 For Jj = 1 To SoDong
   For Zz = 1 To SoDong
      If DongHang Then
         If Rng.Cells(Zz, 1) = MSL(Jj, 1) And DaChep(Zz) Then B1 = 1 + B1
      End If
      If Rng.Cells(Zz, 1) = MSL(Jj, 1) And Not DaChep(Zz) Then
         MTT(Zz, 1) = Jj - B1:           DaChep(Zz) = True
         Exit For
      End If
   Next Zz
 Next Jj
GPE_COM:        XepHang = MTT
End Function
 
Web KT

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

Back
Top Bottom