1050167
Thành viên mới

- Tham gia
- 16/6/15
- Bài viết
- 29
- Được thích
- 0
.Em có file excel đính kèm mọi người có thể giúp đỡ em khi mình click chọn môn thi thì điểm thi môn đó ở tất cả các lớp sẽ được thống kê theo mẫu ở sheet THONG KE không ạ. Em chân thành cảm ơn!
Được nhé bạn.Viết cho nó cái code VBA là được.Bạn biết dùng VBA không.Em có file excel đính kèm mọi người có thể giúp đỡ em khi mình click chọn môn thi thì điểm thi môn đó ở tất cả các lớp sẽ được thống kê theo mẫu ở sheet THONG KE không ạ. Em chân thành cảm ơn!
Nếu biết dùng code thử code này.Em có file excel đính kèm mọi người có thể giúp đỡ em khi mình click chọn môn thi thì điểm thi môn đó ở tất cả các lớp sẽ được thống kê theo mẫu ở sheet THONG KE không ạ. Em chân thành cảm ơn!
Sub abc()
Dim i As Long, arr, dic As Object, dk As String, diem As Integer, T, b As Integer, c As Integer
Dim j As Integer, so As Integer, lr As Long, data
Set dic = CreateObject("scripting.dictionary")
With Sheets("diem thi")
lr = .Range("E" & Rows.Count).End(xlUp).Row
If lr < 4 Then Exit Sub
data = .Range("E4:N" & lr).Value
End With
With Sheets("thong ke")
.Range("C5:T18").ClearContents
arr = .Range("B3:T18").Value
For i = 4 To 14
T = Split(arr(2, i), "-")
b = T(0) * 10
c = T(1) * 10
For j = b To c
dic.Item(j) = i
Next j
Next i
For i = 3 To 16
dic.Item(arr(i, 1)) = i
Next i
dk = .Range("o2").Value
For i = 2 To 10
If data(1, i) = dk Then
so = i
Exit For
End If
Next i
If so = 0 Then MsgBox "sai": Exit Sub
For i = 2 To UBound(data)
b = dic.Item(data(i, 1))
If b Then
arr(b, 2) = arr(b, 2) + 1
If data(i, so) = Empty Then
arr(b, 3) = arr(b, 3) + 1
Else
If data(i, so) > 4.9 Then arr(b, 15) = arr(b, 15) + 1
c = dic.Item(data(i, so) * 10)
arr(b, c) = arr(b, c) + 1
If arr(b, 17) <= data(i, so) Then arr(b, 17) = data(i, so)
If arr(b, 18) = Empty Then
arr(b, 18) = data(i, so)
ElseIf arr(b, 18) >= data(i, so) Then
arr(b, 18) = data(i, so)
End If
arr(b, 19) = arr(b, 19) + data(i, so) * 1
End If
End If
Next i
For i = 3 To 16
If arr(i, 19) Then arr(i, 19) = arr(i, 19) / (arr(i, 2) - arr(i, 3))
If arr(i, 15) Then arr(i, 16) = arr(i, 15) / (arr(i, 2) - arr(i, 3))
Next i
.Range("B3:T18").Value = arr
End With
Set dic = Nothing
End Sub
Cảm ơn bạn nhiều. Cho mình hỏi thêm ạ! Mình thấy cho môn toán là code chạy, giờ cho các môn khác thì sửa code chỗ nào ạ?Nếu biết dùng code thử code này.
Mã:Sub abc() Dim i As Long, arr, dic As Object, dk As String, diem As Integer, T, b As Integer, c As Integer Dim j As Integer, so As Integer, lr As Long, data Set dic = CreateObject("scripting.dictionary") With Sheets("diem thi") lr = .Range("E" & Rows.Count).End(xlUp).Row If lr < 4 Then Exit Sub data = .Range("E4:N" & lr).Value End With With Sheets("thong ke") .Range("C5:T18").ClearContents arr = .Range("B3:T18").Value For i = 4 To 14 T = Split(arr(2, i), "-") b = T(0) * 10 c = T(1) * 10 For j = b To c dic.Item(j) = i Next j Next i For i = 3 To 16 dic.Item(arr(i, 1)) = i Next i dk = .Range("o2").Value For i = 2 To 10 If data(1, i) = dk Then so = i Exit For End If Next i If so = 0 Then MsgBox "sai": Exit Sub For i = 2 To UBound(data) b = dic.Item(data(i, 1)) If b Then arr(b, 2) = arr(b, 2) + 1 If data(i, so) = Empty Then arr(b, 3) = arr(b, 3) + 1 Else If data(i, so) > 4.9 Then arr(b, 15) = arr(b, 15) + 1 c = dic.Item(data(i, so) * 10) arr(b, c) = arr(b, c) + 1 If arr(b, 17) <= data(i, so) Then arr(b, 17) = data(i, so) If arr(b, 18) = Empty Then arr(b, 18) = data(i, so) ElseIf arr(b, 18) >= data(i, so) Then arr(b, 18) = data(i, so) End If arr(b, 19) = arr(b, 19) + data(i, so) * 1 End If End If Next i For i = 3 To 16 If arr(i, 19) Then arr(i, 19) = arr(i, 19) / (arr(i, 2) - arr(i, 3)) If arr(i, 15) Then arr(i, 16) = arr(i, 15) / (arr(i, 2) - arr(i, 3)) Next i .Range("B3:T18").Value = arr End With Set dic = Nothing End Sub
Code trên chạy được 2 môn toán và tiếng anh, các môn khác thì bị lỗi như hình nhờ bạn giúp mình tí ạ!Nếu biết dùng code thử code này.
Mã:Sub abc() Dim i As Long, arr, dic As Object, dk As String, diem As Integer, T, b As Integer, c As Integer Dim j As Integer, so As Integer, lr As Long, data Set dic = CreateObject("scripting.dictionary") With Sheets("diem thi") lr = .Range("E" & Rows.Count).End(xlUp).Row If lr < 4 Then Exit Sub data = .Range("E4:N" & lr).Value End With With Sheets("thong ke") .Range("C5:T18").ClearContents arr = .Range("B3:T18").Value For i = 4 To 14 T = Split(arr(2, i), "-") b = T(0) * 10 c = T(1) * 10 For j = b To c dic.Item(j) = i Next j Next i For i = 3 To 16 dic.Item(arr(i, 1)) = i Next i dk = .Range("o2").Value For i = 2 To 10 If data(1, i) = dk Then so = i Exit For End If Next i If so = 0 Then MsgBox "sai": Exit Sub For i = 2 To UBound(data) b = dic.Item(data(i, 1)) If b Then arr(b, 2) = arr(b, 2) + 1 If data(i, so) = Empty Then arr(b, 3) = arr(b, 3) + 1 Else If data(i, so) > 4.9 Then arr(b, 15) = arr(b, 15) + 1 c = dic.Item(data(i, so) * 10) arr(b, c) = arr(b, c) + 1 If arr(b, 17) <= data(i, so) Then arr(b, 17) = data(i, so) If arr(b, 18) = Empty Then arr(b, 18) = data(i, so) ElseIf arr(b, 18) >= data(i, so) Then arr(b, 18) = data(i, so) End If arr(b, 19) = arr(b, 19) + data(i, so) * 1 End If End If Next i For i = 3 To 16 If arr(i, 19) Then arr(i, 19) = arr(i, 19) / (arr(i, 2) - arr(i, 3)) If arr(i, 15) Then arr(i, 16) = arr(i, 15) / (arr(i, 2) - arr(i, 3)) Next i .Range("B3:T18").Value = arr End With Set dic = Nothing End Sub
không phải sửa điền dữ liệu vào là chạy mà.Cảm ơn bạn nhiều. Cho mình hỏi thêm ạ! Mình thấy cho môn toán là code chạy, giờ cho các môn khác thì sửa code chỗ nào ạ?
Bài đã được tự động gộp:
Cảm ơn bạn nhiều. Cho mình hỏi thêm ạ! Mình thấy cho môn toán là code chạy, giờ cho các môn khác thì sửa code chỗ nào ạ?
Gửi dữ liệu lỗi lên xem nào.Code trên chạy được 2 môn toán và tiếng anh, các môn khác thì bị lỗi như hình nhờ bạn giúp mình tí ạ!View attachment 301906
Data của bạn hình như chưa có, nên nó bị lỗi sao áCảm ơn bạn nhiều. Cho mình hỏi thêm ạ! Mình thấy cho môn toán là code chạy, giờ cho các môn khác thì sửa code chỗ nào ạ?
Bài đã được tự động gộp:
Cảm ơn bạn nhiều. Cho mình hỏi thêm ạ! Mình thấy cho môn toán là code chạy, giờ cho các môn khác thì sửa code chỗ nào ạ?
Đây anh! File này có dữ liệu tất cả các mônkhông phải sửa điền dữ liệu vào là chạy mà.
Bài đã được tự động gộp:
Gửi dữ liệu lỗi lên xem nào.
Bạn thử lại code này.Đây anh! File này có dữ liệu tất cả các môn
Sub abc()
Dim i As Long, arr, dic As Object, dk As String, diem As Integer, T, b As Integer, c As Integer
Dim j As Integer, so As Integer, lr As Long, data, d As Long
Set dic = CreateObject("scripting.dictionary")
With Sheets("diem thi")
lr = .Range("E" & Rows.Count).End(xlUp).Row
If lr < 4 Then Exit Sub
data = .Range("E4:N" & lr).Value
End With
'
With Sheets("thong ke")
.Range("C5:T18").ClearContents
arr = .Range("B3:T18").Value
For i = 4 To 14
T = Split(arr(2, i), "-")
b = T(0) * 100
c = T(1) * 100
For j = b To c
dic.Item(j) = i
Next j
Next i
For i = 3 To 16
dic.Item(arr(i, 1)) = i
Next i
dk = .Range("o2").Value
For i = 2 To 10
If data(1, i) = dk Then
so = i
Exit For
End If
Next i
If so = 0 Then MsgBox "sai": Exit Sub
For i = 2 To UBound(data)
b = dic.Item(data(i, 1))
If b Then
arr(b, 2) = arr(b, 2) + 1
If data(i, so) = Empty Then
arr(b, 3) = arr(b, 3) + 1
Else
If data(i, so) > 4.9 Then arr(b, 15) = arr(b, 15) + 1
d = data(i, so) * 100
c = dic.Item(d)
arr(b, c) = arr(b, c) + 1
If arr(b, 17) <= data(i, so) Then arr(b, 17) = data(i, so)
If arr(b, 18) = Empty Then
arr(b, 18) = data(i, so)
ElseIf arr(b, 18) >= data(i, so) Then
arr(b, 18) = data(i, so)
End If
arr(b, 19) = arr(b, 19) + data(i, so) * 1
End If
End If
Next i
For i = 3 To 16
If arr(i, 19) Then arr(i, 19) = arr(i, 19) / (arr(i, 2) - arr(i, 3))
If arr(i, 15) Then arr(i, 16) = arr(i, 15) / (arr(i, 2) - arr(i, 3))
Next i
.Range("B3:T18").Value = arr
End With
Set dic = Nothing
End Sub
Cảm ơn anh nhiều đã chạy được tất cả các môn.Bạn thử lại code này.
Mã:Sub abc() Dim i As Long, arr, dic As Object, dk As String, diem As Integer, T, b As Integer, c As Integer Dim j As Integer, so As Integer, lr As Long, data, d As Long Set dic = CreateObject("scripting.dictionary") With Sheets("diem thi") lr = .Range("E" & Rows.Count).End(xlUp).Row If lr < 4 Then Exit Sub data = .Range("E4:N" & lr).Value End With ' With Sheets("thong ke") .Range("C5:T18").ClearContents arr = .Range("B3:T18").Value For i = 4 To 14 T = Split(arr(2, i), "-") b = T(0) * 100 c = T(1) * 100 For j = b To c dic.Item(j) = i Next j Next i For i = 3 To 16 dic.Item(arr(i, 1)) = i Next i dk = .Range("o2").Value For i = 2 To 10 If data(1, i) = dk Then so = i Exit For End If Next i If so = 0 Then MsgBox "sai": Exit Sub For i = 2 To UBound(data) b = dic.Item(data(i, 1)) If b Then arr(b, 2) = arr(b, 2) + 1 If data(i, so) = Empty Then arr(b, 3) = arr(b, 3) + 1 Else If data(i, so) > 4.9 Then arr(b, 15) = arr(b, 15) + 1 d = data(i, so) * 100 c = dic.Item(d) arr(b, c) = arr(b, c) + 1 If arr(b, 17) <= data(i, so) Then arr(b, 17) = data(i, so) If arr(b, 18) = Empty Then arr(b, 18) = data(i, so) ElseIf arr(b, 18) >= data(i, so) Then arr(b, 18) = data(i, so) End If arr(b, 19) = arr(b, 19) + data(i, so) * 1 End If End If Next i For i = 3 To 16 If arr(i, 19) Then arr(i, 19) = arr(i, 19) / (arr(i, 2) - arr(i, 3)) If arr(i, 15) Then arr(i, 16) = arr(i, 15) / (arr(i, 2) - arr(i, 3)) Next i .Range("B3:T18").Value = arr End With Set dic = Nothing End Sub
Cái bảng thiết kế theo dạng báo cáo chứ không phải thống kê. Thớt chưa đủ trình độ lập thống kê..
Với thiêt kế như file này, 11 cột phải dùng 11 công thức khác nhau.
Data Validation trong O2 có 2 môn khác với tiêu đề trong sheet DIEM THI vùng F4:N4, Địa lý <=> Địa lí và GDCD <=>GDCD(Có char(10) ở giữa.
Có thể dùng 1 công thức cho toàn bảng nếu thay đổi thiết kế cũng như nguồn của Data Validation.
Phải học nhiều quá bác ơi.Dùng Power query - Unpivot thì dùng slicer để lọc
...