Nhờ sắp xếp thứ hạng học sinh (trường hợp điểm bằng nhau thứ tự sắp xếp không đổi) (1 người xem)

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

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

trungvdb

Thành viên thường trực
Tham gia
22/8/08
Bài viết
374
Được thích
171
Nghề nghiệp
Tài chính
Hic...em bắt đầu va chạm, học về Name khoảng 3 ngày, nhưng sao thấy khó khăn quá, có cảm giác thuật toán trong VBA còn dễ hơn cái này. Em đang cần trau dồi thêm về cách làm bằng công thức đơn thuần trong Excel từ 1 số bài cụ thể, rất mong mọi người chỉ bảo.

Bài toán của em là:

Hãy sắp xếp danh sách học sinh theo thứ tự điểm cao nhất sẽ xếp đầu tiên, điểm thấp nhất xếp cuối cùng. Trường hợp 2 học sinh bằng điểm nhau thì thứ tự vẫn vậy (học sinh nào ở dòng trên-->Vẫn ở dòng trên và ngược lại).
 

File đính kèm

Lần chỉnh sửa cuối:
Hic...em bắt đầu va chạm, học về Name khoảng 3 ngày, nhưng sao thấy khó khăn quá, có cảm giác thuật toán trong VBA còn dễ hơn cái này. Em đang cần trau dồi thêm về cách làm bằng công thức đơn thuần trong Excel từ 1 số bài cụ thể, rất mong mọi người chỉ bảo.

Bài toán của em là:

Hãy sắp xếp danh sách học sinh theo thứ tự điểm cao nhất sẽ xếp đầu tiên, điểm thấp nhất xếp cuối cùng. Trường hợp 2 học sinh bằng điểm nhau thì thứ tự vẫn vậy (học sinh nào ở dòng trên-->Vẫn ở dòng trên và ngược lại).

VBA thì sai biết ngay, còn công thức thì phải nghĩ......... không rõ đúng không

Không hiểu bạn muốn sắp xếp cái gì,
toàn A, B,... linh tinh đâu phải học sinh

hay bạn muốn sử hàm RANK()
 
Chắc bác ấy ngại đánh tên đầy đủ nên đặt tên cho học sinh là A, B,...mà đầu bài là sắp xếp theo cột điểm (cột B) mà

Chắc đây là dữ liệu của tình huống giả định thôi
 
Lần chỉnh sửa cuối:
Rất mong mọi người giúp đỡ em bài này với.
 
Hic...em bắt đầu va chạm, học về Name khoảng 3 ngày, nhưng sao thấy khó khăn quá, có cảm giác thuật toán trong VBA còn dễ hơn cái này. Em đang cần trau dồi thêm về cách làm bằng công thức đơn thuần trong Excel từ 1 số bài cụ thể, rất mong mọi người chỉ bảo.

Bài toán của em là:

Hãy sắp xếp danh sách học sinh theo thứ tự điểm cao nhất sẽ xếp đầu tiên, điểm thấp nhất xếp cuối cùng. Trường hợp 2 học sinh bằng điểm nhau thì thứ tự vẫn vậy (học sinh nào ở dòng trên-->Vẫn ở dòng trên và ngược lại).
Đặt 2 name:
Mã:
Data =Sheet1!$A$2:$B$12
Mã:
Pos =OFFSET(Data,,1,,1)-ROW(Data)/10000
Công thức tại G2:
Mã:
=INDEX(Data,MATCH(LARGE(Pos,ROWS($1:1)),Pos,0),1)
Công thức tại H2:
Mã:
=INDEX(Data,MATCH(LARGE(Pos,ROWS($1:1)),Pos,0),2)
Lưu ý: cái vụ -ROW(Data)/10000 để phòng trường hợp điểm trùng, sẽ ưu tiên em nào nhập liệu trước sẽ đứng trước
 

File đính kèm

Chưa hiểu bản chất khi gán mảng xuống từng ô thì nó sẽ áp vào như thế nào

Em có 2 Name DataDiem, em biết dĩ nhiên các name này có nhiều phần tử. Tuy vậy, em chưa hiểu được gán giá trị các phần tử của Name trở lại bảng tính thì nó thực hiện như thế nào? Tại sao cùng là Name mà có sự khác biệt giữa 2 cái như vậy

Name.png


Rất mong được các thày chỉ thêm cho./.
 

File đính kèm

Em có 2 Name DataDiem, em biết dĩ nhiên các name này có nhiều phần tử. Tuy vậy, em chưa hiểu được gán giá trị các phần tử của Name trở lại bảng tính thì nó thực hiện như thế nào? Tại sao cùng là Name mà có sự khác biệt giữa 2 cái như vậy

Name.png


Rất mong được các thày chỉ thêm cho./.
Nguyên tắc truy xuất mảng trên bảng tính cũng giống trong VBA thôi
Trên VBA thì Arr(lR, lC) là giá trị phần tự tại vị trí lR, lC
Trên bảng tính ta truy xuất thông qua hàm INDEX, ví dụ: =INDEX(Data, ROWS($1:1),1)
Tương tự thế với name Diem =INDEX(Diem, ROWS($1:1),1)
Còn việc bạn gõ công thức =Data, kéo fill xuống tự nhiên nó lại truy xuất từng phần từ trong mảng (mà không cần phải chỉ ra vị trí cụ thế), cái này đúng là.. hên xui thôi
Nói chung: Chuẩn mực vẫn là dùng hàm INDEX
----------------
Nói thêm:
- Name Data được xem là lưng lửng giữa Array và Range nên đổi khi cách truy xuất cũng khá đặc biệt. Chẳng hạn bạn có thể gõ vào cell I2 công thức =$A$2:$A$12 rồi kéo fill xuống, nó cũng cho kết quả tương tự như trường hợp bạn gõ công thức =Data
- Name Diem thì đúng là 1 Array thật sự rồi nên không có được tính chất đặc biết của Data... Để truy xuất nó phải tuân thủ quy tắc dùng INDEX mà thôi
 
Lần chỉnh sửa cuối:
Cũng có thể hình dung thế này liệu có được không hả thày:

- Data là Name được tạo "trực tiếp" nên có tính chất lưng lửng của Range (tuởng tượng như là vẫn "gắn" với vị trí của bàng tính),

- Trong khi đó Diem là Name được tạo gián tiếp nên nó tựa như là Array trong VBA (thoát ra khỏi vị trí của bảng tính, "chỉ xuống áp vào" bảng tính khi ta truy xuất bằng các hàm như Index... thôi), khi gõ trực tiếp thì nó chỉ hiện ra phần tử đại diện đầu tiên nhưng không phản ánh đúng bản chất, vì nó là tập hợp nhiều phần tử.
 
Lần chỉnh sửa cuối:
Em có 2 Name:

PHP:
Data =Sheet1!$B$2:$B$12
PHP:
DK = IF(Data>5;ROW(INDIRECT("1:"&ROWS(Data)));"")

Em muốn tìm hiểu quy trình "sản xuất" ra ra các phần tử của DK, ví dụ phần tử thứ 2 của DK như thế nào, có phải là:
- Phần tử thứ 2 của DK (tức DK(2)) được lấy trên cơ sở phần tử thứ 2 của Data(2)?
- ROW(INDIRECT("1:"&ROWS(Data))) nó là 1 mảng trong ví dụ của em nó là {1;2;"";4;"";6;"";"";"";10;11}---> Vậy cơ sở nào để máy nó "tự hiểu" phần tử thứ 2 của DK: DK(2) = 2 mà không phải là 4,6,10,11 gì đó?

(Tức là hiểu lấy luôn phần tử thứ 2 của hàm Row, mà sao không nhầm thành 1 hoặc 4 hoặc 6...)
 

File đính kèm

Lần chỉnh sửa cuối:
Em có 2 Name:

PHP:
Data =Sheet1!$B$2:$B$12
PHP:
DK = IF(Data>5;ROW(INDIRECT("1:"&ROWS(Data)));"")

Em muốn tìm hiểu quy trình "sản xuất" ra ra các phần tử của DK, ví dụ phần tử thứ 2 của DK như thế nào, có phải là:
- Phần tử thứ 2 của DK (tức DK(2)) được lấy trên cơ sở phần tử thứ 2 của Data(2)?
- ROW(INDIRECT("1:"&ROWS(Data))) nó là 1 mảng trong ví dụ của em nó là {1;2;"";4;"";6;"";"";"";10;11}---> Vậy cơ sở nào để máy nó "tự hiểu" phần tử thứ 2 của DK: DK(2) = 2 mà không phải là 4,6,10,11 gì đó?

(Tức là hiểu lấy luôn phần tử thứ 2 của hàm Row, mà sao không nhầm thành 1 hoặc 4 hoặc 6...)
Để biết DK có những gì, bạn quét chọn vùng D2:D12 hoặc bất cứ vùng nào miễn sao nó 1 cột, 11 dòng (bằng với kích thước của Data)... Xong bạn gõ vào thanh Formula công thức =DK rồi bấm tổ hợp phím Ctrl + Shift + Enter
DKData có cùng kích thước nên vị trí thứ n của DK cũng tương đương vị trí n của Data
ROW(INDIRECT("1:"&ROWS(Data))) là 1 mảng 11 phần tử (vì Data có 11 phần tử).., giá trị của nó là {1;2;3;4;5;6;7;8;9;10;11} ---> Khi bạn thiết lập công thức DK =IF(Data>5,ROW(INDIRECT("1:"&ROWS(Data))),"") thì ứng với vị trị nào mà Data<=5 thì vị trí tương ứng của DK sẽ bị rổng, thế thôi
Bạn có thể quét chọn E2:E12 rồi gò vào thanh Formula công thức =ROW(INDIRECT("1:"&ROWS(Data))) bấm Ctrl + Shift + Enter để kết thúc ---> So sánh giá trị ở E2:E12 với D2:D12 và tự nghiệm ra vấn đề
 

File đính kèm

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

Back
Top Bottom