Xin giúp đở vba hàm lấy giá trị điểm max của mỗi lớp học, và họ tên học sinh đó (1 người xem)

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi

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

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Có 1 bài toán như thế này
Mỗi lớp học có nhiều học sinh đi thi, và được nhiều loại điểm khác nhau

Tìm ra học sinh nào có kết quả cao nhất, và điểm từng môn học, với mỗi lớp tìm ra 1 học sinh cao nhất thôi.


PS, mình đã làm và đã tìm ra được số điểm cao nhất, nhưng không thể tìm ra tên em học sinh và điểm từng môn học
Mong các anh chị GPE giúp đở với.

File bài tập mẫu mình đã gửi kèm theo
 

File đính kèm

Có 1 bài toán như thế này
Mỗi lớp học có nhiều học sinh đi thi, và được nhiều loại điểm khác nhau

Tìm ra học sinh nào có kết quả cao nhất, và điểm từng môn học, với mỗi lớp tìm ra 1 học sinh cao nhất thôi.


PS, mình đã làm và đã tìm ra được số điểm cao nhất, nhưng không thể tìm ra tên em học sinh và điểm từng môn học
Mong các anh chị GPE giúp đở với.

File bài tập mẫu mình đã gửi kèm theo

ko xài vba được không
Mã:
F7=MAX(IF(Diem!$A$7:$A$18=A7,Diem!$F$7:$F$18),0)
nhớ nhấn Ctrl shift enter (cthuc mảng)
Mã:
B7=LOOKUP(2,1/(Diem!$A$7:$A$18=A7)/(Diem!$F$7:$F$18=F7),Diem!$B$7:$B$18)
 
Upvote 0
Mã:
F7=MAX(IF(Diem!$A$7:$A$18=A7,Diem!$F$7:$F$18),0)
nhớ nhấn Ctrl shift enter (cthuc mảng)
Mã:
B7=LOOKUP(2,1/(Diem!$A$7:$A$18=A7)/(Diem!$F$7:$F$18=F7),Diem!$B$7:$B$18)
F7=MAX(IF(Diem!$A$7:$A$18=A7,Diem!$F$7:$F$18),0) câu này có chổ $A$7:$A$18=A7, mộ mãng sao lại =A7 được, nên câu này nó chạy sai.

B7=LOOKUP(2,1/(Diem!$A$7:$A$18=A7)/(Diem!$F$7:$F$18=F7),Diem!$B$7:$B$18) câu này nó chạy thấy đúng, mà vẫn chưa hiểu hết ý nghĩa của các biến trong lookup dùng theo cách của bạn, tuy rằng nó chạy ra kết quả đúng?

Vậy còn cột điểm 1, 2, 3 làm sao cho nó hiện ra, bạn làm trên file rồi gửi mình luôn đi.
 
Lần chỉnh sửa cuối:
Upvote 0
F7=MAX(IF(Diem!$A$7:$A$18=A7,Diem!$F$7:$F$18),0) câu này có chổ $A$7:$A$18=A7, mộ mãng sao lại =A7 được, nên câu này nó chạy sai.

B7=LOOKUP(2,1/(Diem!$A$7:$A$18=A7)/(Diem!$F$7:$F$18=F7),Diem!$B$7:$B$18) câu này nó chạy thấy đúng, mà vẫn chưa hiểu hết ý nghĩa của các biến trong lookup dùng theo cách của bạn, tuy rằng nó chạy ra kết quả đúng?

Vậy còn cột điểm 1, 2, 3 làm sao cho nó hiện ra, bạn làm trên file rồi gửi mình luôn đi.

không sai đâu bạn, cái hàm đó trên GPE người ta thường xuyên sử dụng, chắc là bạn không nhấn Ctrl shift enter
=====
làm thêm một cái bằng vba (để ở sheet vbA)
nhấn Alt F8 để chạy code
 

File đính kèm

Upvote 0
không sai đâu bạn, cái hàm đó trên GPE người ta thường xuyên sử dụng, chắc là bạn không nhấn Ctrl shift enter
=====
làm thêm một cái bằng vba (để ở sheet vbA)
nhấn Alt F8 để chạy code
2 cách làm của bạn chạy rất ok, có vài chổ trong code mình đọc chưa có hiểu, mình sẽ nguyên cứu, cảm ơn bạn nhiều nha.
 
Upvote 0
B7=LOOKUP(2,1/(Diem!$A$7:$A$18=$A7)/(Diem!$F$7:$F$18=$F7),Diem!B$7:B$18)

Mình vẫn chưa hiểu rõ cách làm việc của câu lệnh trên
Theo mình hiểu là:
1. tìm giá trị 2,
2. trong bảng : 1/(Diem!$A$7:$A$18=$A7)/(Diem!$F$7:$F$18=$F7)
3. và cho ra kết quả tương ứng: Diem!B$7:B$18

vì sao lại là tìm số 2, mà không phải là số khác?
1/(Diem!$A$7:$A$18=$A7)/(Diem!$F$7:$F$18=$F7), là bảng loại gì? sao lại có 1/(...)/(...)

Mong bạn giúp mình hiểu với.
 
Upvote 0
Bạn cần hàm =DiemCN(.., ..., ...), thì nó đây

& nhớ cho: Nó là hàm mảng đó nha!
 

File đính kèm

Upvote 0
Mình vẫn chưa hiểu rõ cách làm việc của câu lệnh trên
Theo mình hiểu là:
1. tìm giá trị 2,
2. trong bảng : 1/(Diem!$A$7:$A$18=$A7)/(Diem!$F$7:$F$18=$F7)
3. và cho ra kết quả tương ứng: Diem!B$7:B$18

vì sao lại là tìm số 2, mà không phải là số khác?
1/(Diem!$A$7:$A$18=$A7)/(Diem!$F$7:$F$18=$F7), là bảng loại gì? sao lại có 1/(...)/(...)

Mong bạn giúp mình hiểu với.

bạn hiểu đúng rồi đó
1- số đi tìm là 2
2- tìm trong mảng 1/(Diem!$A$7:$A$18=$A7)/(Diem!$F$7:$F$18=$F7)
cái mảng này nó như vậy Diem!$A$7:$A$18=$A7====>{true,false,true, false.....,.,.....,} tức là cái nào đúng là true, cai nào sai là false
hay nói là một mảng như sau {0,1,0,1........v.v.v..v} (true=1, false=0)
rồi 1/{1,0,1,0......vvvvvv}==> {1,#div/0!,1......vvvv} tức là 1/0 thì ra lổi
như vậy cái mảng của mình chỉ có các con số 1 và lổi
khi đó hàm lookup(2,1/{1,#div/0!..................}===> khi đó nó sẻ đi tìm con số con số nào sắp xỉ con số 2 trong cái mảng đó
bạn muốn để cón số đó là mấy cũng được miễn là nó lớn hơn 1
lưu ý hàm lookup nó dò từ bên trái của mảng qua nha
3- mảng nó tra về thì đúng như bạn nói.
============
tôi giải thích lũn cũn, bạn tìm thêm trên diễn đàn, tôi thấy nick NDU....... có nhiều bài giải thích về hàm này lắm
tìm hiểu thêm nha
 
Upvote 0
& nhớ cho: Nó là hàm mảng đó nha!
Công nhận cách của anh SA_DQ, mới lạ và hấp dẫn, lần đầu tiên thấy hàm là mảng, giải quyết được bài toán rất ok.

Có một điều là hàm này lại kéo xuống các ô dưới không có được, vì bị biến thứ 3 là 2 hàng, và csdl là linh động có thể có nhiều lớp hơn và nhiều học sinh hơn, dài hơn. Nhưng chạy được như anh làm là một điều quá hay rồi.

ps:
hàm cong1(a,b) thì chạy bình thường
Mã:
Function cong1(a, b)
cong1 = a + b
MsgBox "ket qua cong = " & cong1
End Function
hàm cong2(a,b) có thêm 1 câu gán giá trị cho 1 ô thì lại không chạy được
Mã:
Function cong2(a, b)
cong2 = a + b
MsgBox "ket qua cong = " & cong2
[A1].Value = cong2
End Function
Hình như cấu trúc hàm thì vba nó không cho gán giá trị cho cells khác, không cho gọi 1 sub khác thì phải?
 
Upvote 0
Nhờ lấy danh sách học sinh có điểm cao nhất với 2 điều kiện lớp học và tổ

Có số liệu lấy làm mẫu như sau:
1. có 3 lớp học: 06A2, 07B3, C12B (thực tế sẽ rất nhiều lớp)
2. Mỗi lớp sẽ có nhiều tổ, T1, T2, T3...
3. Mỗi tổ sẽ có nhiều học sinh
4. Sau khi dự thi được điểm tổng kết (Kết Quả như vd)


Yêu cầu:
1. Xuất kết quả qua sheet KetQua
2. Mỗi lớp, mỗi tổ lấy 1 học sinh có điểm cao nhất để khen thưởng


VD, lớp 06A2 có 3 tổ thì mỗi tổ lấy 1 em, vậy là lớp này được 3 em

 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Có số liệu lấy làm mẫu như sau:
1. có 3 lớp học: 06A2, 07B3, C12B (thực tế sẽ rất nhiều lớp)
2. Mỗi lớp sẽ có nhiều tổ, T1, T2, T3...
3. Mỗi tổ sẽ có nhiều học sinh
4. Sau khi dự thi được điểm tổng kết (Kết Quả như vd)


Yêu cầu:
1. Xuất kết quả qua sheet KetQua
2. Mỗi lớp, mỗi tổ lấy 1 học sinh có điểm cao nhất để khen thưởng
VD, lớp 06A2 có 3 tổ thì mỗi tổ lấy 1 em, vậy là lớp này được 3 em
Công thức tính điểm max (mãng):
F7 =MAX(IF((Diem!$A$7:$A$23=$A7)*(Diem!$B$7:$B$23=$B7),Diem!$F$7:$F$23,""))
Công thức Tên:
=LOOKUP(2,1/(Diem!$A$7:$A$23=$A7)/(Diem!$B$7:$B$23=$B7)/(Diem!$F$7:$F$23=$F7),Diem!C$7:C$23)
Kéo qua Điếm 1, Điểm 2, kéo xuống.
 
Lần chỉnh sửa cuối:
Upvote 0
Công thức F7 =MAX(IF((Diem!$A$7:$A$23=KetQua!A7)*(Diem!$B$7:$B$23=KetQua!B7),Diem!$F$7:$F$23))
C7=INDEX(Diem!$C$7:$C$23,MATCH(1,(Diem!$A$7:$A$23=KetQua!A7)*(Diem!$B$7:$B$23=KetQua!B7)*(Diem!$F$7:$F$23=KetQua!F7),0))
D7, E7 tương tự C7: thay cột C trong Diem!$C$7:$C$23 bằng D và E
Các công thức kết thúc bằng Ctrl-Shift-Enter
 
Upvote 0
Có số liệu lấy làm mẫu như sau:
1. có 3 lớp học: 06A2, 07B3, C12B (thực tế sẽ rất nhiều lớp)
2. Mỗi lớp sẽ có nhiều tổ, T1, T2, T3...
3. Mỗi tổ sẽ có nhiều học sinh
4. Sau khi dự thi được điểm tổng kết (Kết Quả như vd)


Yêu cầu:
1. Xuất kết quả qua sheet KetQua
2. Mỗi lớp, mỗi tổ lấy 1 học sinh có điểm cao nhất để khen thưởng


VD, lớp 06A2 có 3 tổ thì mỗi tổ lấy 1 em, vậy là lớp này được 3 em

Muốn VBA thì thử với Sub "dài thoòng" này coi có đúng kết quả không nhé
PHP:
Public Sub GPEII()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Diem")
    sArr = Range(.[A7], .[A7].End(xlDown)).Resize(, 6).Value
    ReDim dArr(1 To UBound(sArr, 1), 1 To 6)
End With
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1) & sArr(I, 2)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        For J = 1 To 6
            dArr(K, J) = sArr(I, J)
        Next J
    Else
        If sArr(I, 6) > dArr(Dic.Item(Tem), 6) Then
            dArr(Dic.Item(Tem), 6) = sArr(I, 6)
            For J = 1 To 6
                dArr(Dic.Item(Tem), J) = sArr(I, J)
            Next J
        End If
    End If
Next I
With Sheets("KetQua")
    .[A7:F10000].ClearContents
    .[A7:F7].Resize(K) = dArr
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Muốn VBA thì thử với Sub "dài thoòng" này coi có đúng kết quả không nhé
[GPECODE=vb]Public Sub GPEII()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Diem")
sArr = Range(.[A7], .[A7].End(xlDown)).Resize(, 6).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 6)
End With
For I = 1 To UBound(sArr, 1)
Tem = sArr(I, 1) & sArr(I, 2)
If Not Dic.Exists(Tem) Then
K = K + 1
Dic.Add Tem, K
For J = 1 To 6
dArr(K, J) = sArr(I, J)
Next J
Else
If sArr(I, 6) > dArr(Dic.Item(Tem), 6) Then
dArr(Dic.Item(Tem), 6) = sArr(I, 6)
For J = 1 To 6
dArr(Dic.Item(Tem), J) = sArr(I, J)
Next J
End If
End If
Next I
With Sheets("KetQua")
.[A7:F10000].ClearContents
.[A7:F7].Resize(K) = dArr
End With
Set Dic = Nothing
End Sub[/GPECODE]
Nhìn hoa cả mắt, nội mà đọc từ từ mà để hiểu cái code này cũng khó. Mình sẽ làm thử xem sao, cảm ơn bạn nhiều nha.
Set Dic = CreateObject("Scripting.Dictionary") mình chưa biết câu này?
 
Upvote 0
Nhìn hoa cả mắt, nội mà đọc từ từ mà để hiểu cái code này cũng khó. Mình sẽ làm thử xem sao, cảm ơn bạn nhiều nha.
Set Dic = CreateObject("Scripting.Dictionary") mình chưa biết câu này?
Nếu kết quả đúng yêu cầu thì xài tạm thôi.
Sub dài chưa hẵn là tốc độ chậm hơn code ngắn.
Muốn tìm hiểu về Dictionary thì vào đây:
http://www.giaiphapexcel.com/forum/...n-về-Scripting-Dictionary&p=374487#post374487
 

File đính kèm

Upvote 0
những dạng như bài này nên viết theo từng modlue nhỏ thì dễ đọc và dễ hiểu hơn
ví như bài này mình viết
1 function tìm điểm lớn nhất theo 2 đk(kết quả trả về là 1 (điểm max)
1 sub chính để in ra những thằng có đúng với giá trị trả về đúng như giá trị của function trên

nói chung là viết theo cách chia để trị
 
Upvote 0
Nếu kết quả đúng yêu cầu thì xài tạm thôi.
Sub dài chưa hẵn là tốc độ chậm hơn code ngắn.
Muốn tìm hiểu về Dictionary thì vào đây:
http://www.giaiphapexcel.com/forum/...n-về-Scripting-Dictionary&p=374487#post374487

Em cảm ơn anh nhiều nhà.
File của anh làm chạy cho kết quả rất đúng, nó làm việc rất tốt, em sẽ nguyên cứu để hiểu nó, chân thành cảm ơn sự giúp đở của anh.
 
Upvote 0

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

Back
Top Bottom