Tìm điểm trung bình trong danh sách (1 người xem)

Liên hệ QC

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

conghoangxd037

Thành viên chính thức
Tham gia
16/1/13
Bài viết
54
Được thích
2
Em có dữ liệu file excel gồm tất cả học sinh có điểm trung bình.Rồi sau đó em tự chọn 1 điểm TB nào đó và sau đó sẽ hiện ra danh sách 5 người gần số điểm em đã chọn bằng code vba(ví dụ như em có 1 dãy số 0,32,1,4,5,9,11,116,43 em chọn số 2 thì ta sẽ được số cần tìm là 1,4,5,9,0 hoặc số 11).Nghĩ hoài không ra thuật toán mong mấy a chỉ giáo.
 

File đính kèm

Lần chỉnh sửa cuối:
Em có dữ liệu file excel gồm tất cả học sinh có điểm trung bình.Rồi sau đó em tự chọn 1 điểm TB nào đó và sau đó sẽ hiện ra danh sách 5 người gần số điểm em đã chọn bằng code vba(ví dụ như em có 1 dãy số 0,32,1,4,5,9,11,116,43 em chọn số 2 thì ta sẽ được số cần tìm là 1,4,5,9,0 hoặc số 11).Nghĩ hoài không ra thuật toán mong mấy a chỉ giáo.

code thì các sư phụ sẻ viết cho bạn, mình góp vui một công thức
J3=IF(ROW()-2<=5,INDEX($A$2:$E$10,MATCH(SMALL($E$2:$E$10-$H$1,ROW(A1)),$E$2:$E$10-$H$1,0),COLUMN(A1)),"")
kết thúc bằng Ctrl Shift Enter.
kéo qua phải, kéo xuống

chỉ để thoả chí tò mò, thử tiếp công thức sau:
J2=INDEX($A$2:$E$10,SMALL(IF((COUNTIF($J$2:$J2,$A$2:$A$10)=0)*(ABS($E$2:$E$10-$H$1)=SMALL(ABS($E$2:$E$10-$H$1),ROW(A1))),ROW($A$2:$A$10)-1),1),COLUMN(A1))
Ctrl Shift Enter
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
code thì các sư phụ sẻ viết cho bạn, mình góp vui một công thức
J3=IF(ROW()-2<=5,INDEX($A$2:$E$10,MATCH(SMALL($E$2:$E$10-$H$1,ROW(A1)),$E$2:$E$10-$H$1,0),COLUMN(A1)),"")
kết thúc bằng Ctrl Shift Enter.
kéo qua phải, kéo xuống
Công thức của bạn sẽ không đúng nếu 5 người đó có số điểm bằng nhau. Nói tóm lại hỏi theo kiểu vu vơ như thế này thì kết quả ra sẽ như thế nào? 5 người có điểm gần điểm trung bình nhất, nhỡ có tới 10 người cùng số điểm 6.6 (gần 6.5) thì sao? Hoặc là 3 người cận trên 6.5, 3 người cận dưới 6.5...lấy ai?
 
Upvote 0
[ThongBao]Nghĩ hoài không ra thuật toán mong mấy a chỉ giáo.[/ThongBao]

Mình hướng dẫn bạn cách này:

Nhập 1 chuỗi bất kỳ vô [F1] làm tên trường;
Khai báo 1 biến (Như TriTim) để nhận trị cần tìm tại [I1] & khai 1 biến kiểu Range để duyệt toàn bộ cột số tại 'E:E'

(*) Nếu gặp số lớn hơn hay bằng TriTim, ta ghi hiệu của số trong ô duyệt - TriTim vô ô bên fải liền kề

(*) Nếu bằng ngược lại sẽ gán hiệu TriTim - Số trong ô duyệt vô đó;

Bước cuối ta xếp theo cột tổng đại số vừa hình thành là được;

Những mong bạn sẽ tự viết được theo cách này.
 
Upvote 0
Hãy tham khảo cái ni, nha.

[ThongBao]em làm không được anh ơi. Giúp em.[/ThongBao]

PHP:
Option Explicit
Sub TrungDiem()
 Dim TriTim As Double:                              Dim Cls As Range
 
 [F1].Value = "Delta"               '<=| Ten Truòng '
 TriTim = [i1].Value                '<=| Chú Ý  '
 'Duyet Theo Cot "E":   '
 For Each Cls In Range([e2], [e2].End(xlDown))
    With Cls.Offset(, 1)
        If Cls.Value >= TriTim Then
            .Value = Cls.Value - TriTim
        Else
            .Value = TriTim - Cls.Value
        End If
    End With
 Next Cls
 'Xép Theo Cot "F": '
 Range("B1").CurrentRegion.Offset(, 1).Select
 Selection.Sort Key1:=Range("F2"), Order1:=xlAscending, Key2:=Range("E2") _
    , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
    False, Orientation:=xlTopToBottom
End Sub
 
Upvote 0
đoạn code trên thì cũng giống như sort thôi mà anh.Chắc anh không hiểu ý em rồi.Giống như em có điền một giá trị và sau đó tìm 3 giá trị cận dưới và 3 giá trị cận trên nếu giá trị cận dưới có 2 giá trị thì cận trên phải có 4 giá trị và cận dưới 1 giá trị thì cận trên 5 giá trị và cận duới 0 giá trị thì cận trên 6 giá trị và ngược lại. VD em có dãy dữ liệu
Dãy dữ liệu: 7,3,9,1,10,4,22,663,22,662,15. Em cho số 2 thì cận dưới là 3,1 cận trên thì 4,7,9,10.
 
Upvote 0
tôi ko rành vba, gởi bạn tham khảo một cách mà tôi quay lại bằng record macro.
bạn lấy ý tưởng viết lại code
 

File đính kèm

Upvote 0
cảm ơn bạn.Nhưng cũng không đúng luôn bạn ơi, ai có thể hướng dẫn mình tìm thuật toán tìm 3 giá trị cận trên và 3 giá trị cận dưới với nghĩ hoài không ra.
 
Upvote 0
Thuật toán 1:

- Sort array
- dò array, tìm vị trí giá trị đã cho và đánh dấu vị trí cảu hai trị trên và dưới nó (nếu trị có trong mảng hay không có trong mảng thì cũng đánh dấu hai vị trí trên và dưới)
- Dò ngược ra hai bên và lấy mỗi bên 3 trị.
- Nếu một bên bị hết đường (chạm giới hạn) thì dò bên còn lại cho đủ số.

Thuật toán 2:

- Lập ra hai mảng. Mảng 1 chứa số dưới và mảng 2 chứa số trên. Mỗi mảng 6 phần tử.
- Đọc theo cột, nhét các số nhỏ hơn vào mảng 1 và các số lớn hơn vào mảng 2
- Nhét theo đúng thứ tự. Nếu mảng đầy thì đẩy bớt ra.
- Sau khi đọc hết cột thì ta có 2 mảng chứa các số gần nhất.
 
Upvote 0
cảm ơn a. Để nhét theo đúng thứ tự cho 1 mảng thì làm sao anh.
 
Upvote 0
cảm ơn a, cho em hỏi thêm. Để nhét theo đúng thứ tự cho 1 mảng thì làm sao anh.Nhưng chúng ta không sử ô trong excel để sắp xếp mà sắp xếp luôn trên mảng khi ta nhập dữ liệu hết vào được không a.Anh có thể vd cho em về thuật toán này với.
 
Upvote 0
đoạn code trên thì cũng giống như sort thôi mà anh.Chắc anh không hiểu ý em rồi.

Giống như em có điền một giá trị và sau đó tìm 3 giá trị cận dưới và 3 giá trị cận trên nếu giá trị cận dưới có 2 giá trị thì cận trên phải có 4 giá trị và cận dưới 1 giá trị thì cận trên 5 giá trị và cận duới 0 giá trị thì cận trên 6 giá trị và ngược lại. VD em có dãy dữ liệu
Dãy dữ liệu: 7,3,9,1,10,4,22,663,22,662,15. Em cho số 2 thì cận dưới là 3,1 cận trên thì 4,7,9,10.

Bạn xem trong file;
Chọn số HS cần hiễn thị tại ô [L1:P1]
 

File đính kèm

Upvote 0
Dùng phương pháp dò và chèn đùng chỗ, đẩy số khác ra.

chèn sẵn số mốc vào đầy mảng.

Mã:
private const SOLUONG = 6

for i = 1 to SOLUONG
' đúng ra thì mảng tiêu chuẩn từ 0 đến 5 nhưng ở đây dùng 1 đến 6 cho dễ
m1(i) = soMoc : m2(i) = soMoc
next i

Chèn vào mảng:
Mã:
with [range cột cần xét]
for i1 = [ô đầu tiên] to [ô cuối cùng]
' nếu trị cell nhỏ hơn số mốc thì xem có thể nhét vào mảng dưới
' nếu lớn hơn số mốc thì xem có thể nhét vào mảng trên
' nếu bằng thì bỏ qua
if .cells(i1) < soMoc then
  ' code tính đầu dưới
  for i2 = 1 to SOLUONG
    if .cells(i1).value > m1(i2) then ' số này gần số mốc hơn
      for i3 = SOLUONG to i2+1 step -1
        m1(i3) = m1(i3-1) ' đẩy các số về bên phải
      next i3
      m1(i2) = .cells(i1) ' chép số vào mảng
      exit for ' nhét xong rồi không cần xét mảng nữa
    end if
  next i2
elseif .cells(i1) > soMoc then
  ' code tính đầu trên ở đây, code ngược với mảng nhỏ
end if
next i1
end with

Sau khi chèn xong, đọc hai mảng và lấy 3 trị đầu tiên của mỗi mảng. Nếu trong 3 trị đầu tiên này có trị bằng số mốc thì do không đủ số, lúc đó phải lấy thêm của mảng còn lại.

vd số mốc là 5, sau khi chèn:
m1: { 4, 3, 5, 5, 5 }
m2: { 6, 8, 15, 20, 100 }
như vậy ta lấy được 3, 4, 6, 8, 15, 20 (2 từ mảng 1 và 4 từ mảng 2)
 
Upvote 0
Bài này thật ra còn nhiều cái để nói lắm, vì chủ topic đặt vấn đề chưa rõ lắm, thí dụ có những giá trị trùng với điều kiện, hoặc nhỏ, lớn liền kề nhiều hơn số giá trị cần tìm thì sao ????
Buồn, ngồi không làm đại.
cách tính:
* Nếu trùng với điều kiện ==> hông lấy
* Nếu trùng liền kề ==> lấy tới đủ số thì thôi, em nào bị bỏ ...........ráng chịu ( vì thấy bảng kết quả phải đưa ra danh sách nên mình nghĩ liền kề trùng phải "chơi" luôn. Híc)
* Sĩ số lớp < 100
Nếu bài này làm trên sheet thì đơn giản hơn rất nhiều
Mà cũng chẳng biết cái này làm cái chi chi nữa
Hihi, làm đại, trúng thì tốt, mà trật thì...........cũng tốt vì được suy nghĩ
Thân
 

File đính kèm

Upvote 0
Bài này thật ra còn nhiều cái để nói lắm, vì chủ topic đặt vấn đề chưa rõ lắm, thí dụ có những giá trị trùng với điều kiện, hoặc nhỏ, lớn liền kề nhiều hơn số giá trị cần tìm thì sao ????
Buồn, ngồi không làm đại.
cách tính:
* Nếu trùng với điều kiện ==> hông lấy
* Nếu trùng liền kề ==> lấy tới đủ số thì thôi, em nào bị bỏ ...........ráng chịu ( vì thấy bảng kết quả phải đưa ra danh sách nên mình nghĩ liền kề trùng phải "chơi" luôn. Híc)
* Sĩ số lớp < 100
Nếu bài này làm trên sheet thì đơn giản hơn rất nhiều
Mà cũng chẳng biết cái này làm cái chi chi nữa
Hihi, làm đại, trúng thì tốt, mà trật thì...........cũng tốt vì được suy nghĩ
Thân

các bác toàn làm hư người hỏi hết ah,

Nếu chưa rõ thì để chủ topic giải thích rõ, nếu không cứ phải làm đi làm lại làm hoài, lại sửa típ

Vậy thì có lẽ nên thà 1 lần hỏi rõ ràng cho người hỏi nói rõ ràng, đặt vấn đề rõ thì làm luôn 1 thể phải hay hơn không
 
Upvote 0
các bác toàn làm hư người hỏi hết ah,

Nếu chưa rõ thì để chủ topic giải thích rõ, nếu không cứ phải làm đi làm lại làm hoài, lại sửa típ

Vậy thì có lẽ nên thà 1 lần hỏi rõ ràng cho người hỏi nói rõ ràng, đặt vấn đề rõ thì làm luôn 1 thể phải hay hơn không

Chủ thớt không chịu ghiải thích rõ ràng thì có "hư" cũng là lỗi chính mình.

Ở đây, tôi diễn giải không phải với mục đích làm đó. Bài này có tính chất toán học cho nên tôi cố tình diễn thêm cho chúng ta cùng học hỏi nhau.

Đây là loại bài toán thống kê tim độ lệch không chuẩn, trái với độ lệch chuẩn (sigma, standard deviation).
 
Upvote 0
Bài này mình thấy làm bằng tay cũng được. Quy trình như sau:
- Gõ vào F2 công thức: =ABS(E2-$H$1) rồi kéo fill xuống
- Quét chọn vùng dữ liệu bao gồm cả cột F rồi AutoFilter
- Bấm mũi tên xổ xuống của cột F, chọn kiểu filter Top 10
- Trong cửa sổ Top 10 AutoFilter, khung Show ta chọn Bottom, khung cạnh bên gõ số tùy ý (muốn lấy ra 5 dòng thì gõ số 5)
- Bấm OK 1 phát sẽ có ngay kết quả
 
Upvote 0

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

Back
Top Bottom