Thống kê 1 giáo viên tất cả các lớp (2 người xem)

Liên hệ QC

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

ngodany135

Thành viên thường trực
Tham gia
1/12/10
Bài viết
346
Được thích
522
Nghề nghiệp
GIÁO VIÊN
Em có bảng thống kê của nhiều giáo viên dạy các lớp. Nhưng phần tổng hợp lại không thống kê được (có file đính kèm).Mong được sự giúp đở của các cao thủ. Trân thành cảm ơn!.
 
Lần chỉnh sửa cuối:
Em có bảng thống kê của nhiều giáo viên dạy các lớp. Nhưng phần tổng hợp lại không thống kê được (có file đính kèm).Mong được sự giúp đở của các cao thủ. Trân thành cảm ơn!.
- Việc tính tổng số học sinh và số lượng theo mỗi loại thì dễ, chỉ cần dùng SUMIF là được. Ví dụ: Công thức cho D40 là:
=SUMIF($B$4:$B$35,$B40,D$4:D$35)
(công thức này có thể dùng chung cho tất cả các cột số lượng, chỉ cần copy ô D40 và dán cho các ô còn lại cần tính số lượng)
- Việc liệt kê mỗi GV dạy từng lớp nào có lẽ phải dùng đến VBA. Chẳng hạn, mình sử dụng hàm tự tạo "củ chuối" này:
PHP:
Function LopDay(Ten As String, Vung As Range) As String
    Dim Cll As Range
    For Each Cll In Vung
        If Cll.Value = Ten Then LopDay = LopDay & Cll.Offset(, 1).Value & ", "
    Next Cll
    LopDay = Left(LopDay, Len(LopDay) - 2)
End Function
Sau đó áp dùng hàm LopDay cho ô C40 như sau:
Cuối cùng là Copy công thức của C40 cho các ô còn lại.
Bạn tham khảo trong file nhé.
 

File đính kèm

Rất rất hay. 1 lần nữa xin cảm ơn rất rất nhiều. Nhưng bác NghiaPhuc ơi. Mình thì trình độ tin học còn thấp lắm. Cái phần visubasic đó chỉ biết vậy thôi chứ đi thẳng vào vấn đề visubasic thì mình bị Mù luôn, sẳn đây Bác có thể phân tích dùm mình luôn đi. Xin trân thành cảm ơn!
 
Rất rất hay. 1 lần nữa xin cảm ơn rất rất nhiều. Nhưng bác NghiaPhuc ơi. Mình thì trình độ tin học còn thấp lắm. Cái phần visubasic đó chỉ biết vậy thôi chứ đi thẳng vào vấn đề visubasic thì mình bị Mù luôn, sẳn đây Bác có thể phân tích dùm mình luôn đi. Xin trân thành cảm ơn!
Có thể hiểu hàm tự tạo LopDay đó là như vầy:
- Đầu tiên LopDay=""
- Tiếp theo, duyệt tất cả các ô trong vùng chứa tên giáo viên trong bảng chính (tức là tham số Vung trong hàm), nếu ô nào có giá trị là tên cần liệt kê lớp dạy (tương ứng tham số Ten trong hàm) thì nối lớp tương ứng trong bảng chính vào trong chuỗi LopDay, đồng thời thêm một chuỗi ", " (dấu phẩy và dấu cách) vào cuối để phân cách với các lớp khác.
- Cuối cùng, câu lệnh LopDay = Left(LopDay, Len(LopDay) - 2) nhằm xóa đi chuỗi ", " thừa trong chuỗi LopDay (tất nhiên chuỗi LopDay này cũng là kết quả trả về của hàm LopDay)
 
Trân thành cảm ơn bác nghiaphuc. Chắc em phải đi học thêm. hihihi. Chúc bác thành công trong công việc và dồi dào sức khỏe. cảm ơn bác!
 
Bạn xài hàm này để tốc độ được cải thiện thêm chút téo

PHP:
Option Explicit
Function LopDay(Ten As String, Vung As Range) As String
    Dim Cll As Range
    
    Set Cll = Vung.Find(Ten, , xlFormulas, xlWhole)
    If Cll Is Nothing Then
        LopDay = "Nothing"
    Else
        Set Vung = Range(Cll, Vung.Cells(Vung.Count))
'        MsgBox Vung.Address  '
        For Each Cll In Vung
            If Cll.Value = Ten Then LopDay = LopDay & Cll.Offset(, 1).Value & ", "
        Next Cll
    End If
    LopDay = Left(LopDay, Len(LopDay) - 2)
End Function
 
PHP:
Option Explicit
Function LopDay(Ten As String, Vung As Range) As String
Dim Cll As Range
 
Set Cll = Vung.Find(Ten, , xlFormulas, xlWhole)
If Cll Is Nothing Then
LopDay = "Nothing"
Else
Set Vung = Range(Cll, Vung.Cells(Vung.Count))
' MsgBox Vung.Address '
For Each Cll In Vung
If Cll.Value = Ten Then LopDay = LopDay & Cll.Offset(, 1).Value & ", "
Next Cll
End If
LopDay = Left(LopDay, Len(LopDay) - 2)
End Function
Chú ơi, hình như phải như vầy mới đúng chứ:
PHP:
Function LopDay(Ten As String, Vung As Range) As String
    Dim Cll As Range
 
    Set Cll = Vung.Find(Ten, , xlFormulas, xlWhole)
    If Cll Is Nothing Then
        LopDay = vbNullString
    Else
        Set Vung = Range(Cll, Vung.Cells(Vung.Count))
'        MsgBox Vung.Address  '
        For Each Cll In Vung
            If Cll.Value = Ten Then LopDay = LopDay & Cll.Offset(, 1).Value & ", "
        Next Cll
        LopDay = Left(LopDay, Len(LopDay) - 2)
    End If
End Function
Nếu làm như chú thì nếu "lôi" một anh chàng nào đó không có trong danh sách vào thống kê thì kết quả là anh chàng này dạy các lớp "Nothi", nhìn thấy ngộ làm sao ấy.
 
Lần chỉnh sửa cuối:
À ha!, hoặc đã quên dòng lệnh thoát ngay khi hàm không tìm thấy tên GV trong danhsách

Thêm vô trước dòng lệnh Else dòng

PHP:
 Exit Function

Rất cảm ơn bạn!--=0 --=0 --=0
 
Cời ơi! Toàn là dân thứ dữ, đại cao thủ gì không vậy. Mình cung bó tay với các Bác luôn, theo tôi cảm ơn không chắc cung chưa đủ, hôm nào mình mời các Bác đi.....1 chầu. hihihihi........Nhưng các bác ơi! trong qúa trình làm nãy sinh ra 1 ý khác cho đơn giản hơn là như vầy nha. ví dụ: mình lập 1 bảng gồm các khối lớp 6a1 đến 6a8, 7a1 đến 7a8, 8a1 đến 8a8, 9a1 đến 9a8. Khi đó giáo viên dạy lớp nào thì đánh dấu (X) vào ô lớp đó. Như vậy dùng công thức theo các Bác ở trên thì không được. Vậy mong các Bác viết dùm lại mình với và đừng quên Giải thích từng lời văn dùm. Giải thích chi tiết cụ thể dùm cũng giống giống như Bác Nghiaphuc vậy đó. Nếu câu hỏi của mình, các bác chưa rõ mình cũng có đưa file lên đó. Tên file là Bảng Phân Công. Xin trân thành cảm ơn
 
Bạn không nên tạo topic mới, mà nên chuyển file đó lên đây sẽ tiện hơn;

Còn đây là hàm tự tạo cho trường hợp mới:
PHP:
Option Explicit
Function LopDay_(Ten As String, Vung As Range) As String
1 Dim Rg1 As Range, Cls As Range
 
 Set Cls = Cells(Vung.Row, "iV").End(xlToLeft)
3 Set Rg1 = Range(Vung.Cells(0).End(xlToRight), Cls)
 For Each Cls In Rg1
5    If UCase$(Cls.Value) = "X" Then
        LopDay_ = LopDay_ & ", " & Cells(2, Cls.Column).Value
7    End If
 Next Cls
9 LopDay_ = Mid(LopDay_, 3, 255)
End Function
Cách sử dụng: Tại [E10] ta nhập cú fáp =lopday_(B10,C3:AH3)
Hàm này có thể viết cách khác, nếu xài như vậy bạn thấy không tiện lắm!
 
Lần chỉnh sửa cuối:
Cảm ơn Bác ChanhTQ@. Nhưng Bác ChanhTQ@ ơi! như ở trên em có nói VBA em bị mù. vậy Bác có thể viết ngắn ngắn lại dùm em. Càng ngắn càng tốt và giải thích dùm cái ngôn ngữ luôn đi nha. Em cảm ơn nhiều. Chúc Bác vui vẽ.
 

File đính kèm

Lần chỉnh sửa cuối:
(2) Vậy Bác có thể viết ngắn ngắn lại dùm em. Càng ngắn càng tốt và (1) giải thích dùm cái ngôn ngữ luôn đi nha.
(1)

Option Explicit 'Yêu cầu các biến sử dụng f ải được khai báo tường minh'
Function LopDay_(Ten As String, Vung As Range) As String
'(Hàm Cần được cung cấp 2 tham biến: Ten GV & Vùng lịch dạy của GV đó'
1 Dim Rg1
As Range, Cls As Range 'Khai báo các biến cần dùng'
'Gán ô fải nhất có dữ liệu ('X') của Vung vô biến đã khai báo:'
Set Cls
= Cells(Vung.Row, "iV").End(xlToLeft)
'Gán vùng gồm ô đầu tiên trong dòng đến ô trong biến Cls vô biến đã khai báo:'
3 Set Rg1 = Range(Vung.Cells(0).End(xlToRight), Cls)
' Lập vòng lặp duyệt các ô của chưa trong biến Rg1 vừa xã định:'
For
Each Cls In Rg1
'Điều kiện: nếu dữ liệu là "X" hay "x" thì:'
5
If UCase$(Cls.Value) = "X" Then
Hàm được thêm chuỗi fân cách & trị trong hàng 2 có cùng cột:'
LopDay_
= LopDay_ & ", " & Cells(2, Cls.Column).Value
7 End
If
'Dòng 7: Kết thúc Đkiện; Dòng 6: Kết thúc vùng lặp:'
Next Cls
'Cắt fần dư & báo kết quả hàm:'
9 LopDay_
= Mid(LopDay_, 3, 255)
End Function

(1) Vậy là ngắn rồi, chí ít trên fương diện tốc độ & chúc ngày nghỉ cuối tuần vui vẽ!

 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT

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

Back
Top Bottom