Sửa code trích môn thi lại

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

boyxin

Members actively
Tham gia
10/3/08
Bài viết
1,664
Được thích
2,335
Hiện tại em đang dùng code sau để thực hiện công việc trích lọc các môn HS có điểm TBmôn < 5 để báo cáo BGH và thông báo cho HS
PHP:
Public Function MonKTL(namehs As String) As String
Set cn = Sheets("Canam").Range("DataCN")
rc = cn.Rows.Count
For r = 1 To rc
    If cn(r, 1) = namehs Then
      diemtb = ""
      sm = 0
      For C = 2 To 16
        dtb = cn(r, C)
        If dtb < 5 And dtb <> "" Then
        diemtb = diemtb & cn(1, C) & "=" & dtb & ", "
        sm = sm + 1
        End If
      Next
      MonKTL = sm & " M" & ChrW(244) & "n: " & diemtb
      rtl = rtl + 1
      Exit For
    End If
Next
If namehs = "" Then MonKTL = ""
End Function
  1. Nhưng em nhận thấy Range("DataCN") thật là lãng phí, trong khi số liệu nằm gọn trong 1 report => xét Range("Data") là đủ (DataCNData là các name trong file đính kèm) nhưng em loay hoay mãi mà không biết xử lý thế nào
  2. Hiện tại hàm MonKTL(Name HS) em muốn chuyển thành MonKTL(Ma HS)
Rất mong các bác ra tay giúp đỡ

---------------
Em không biết gì về VBA đâu. các bác làm hoàn thiện giúp em nha (đoạn code trên em có được cũng là nhờ các bác trên GPE giúp)
 

File đính kèm

C1: Nếu mình thêm sau dòng lệnh:
PHP:
Set cn = Sheets("Canam").Range("DataCN")
dòng lệnh này:
PHP:
Set cn = Sheets("Canam").Range("B3:Q" & Sheets("Canam").[Q65500].End(xlUp).Row)
Thì hàm cũng cho kết quả không đổi; Vậy nên theo mình cách này đơn giản hơn.
C2
Mình viết cho bạn thêm 1 Function Tìm tên theo mã như sau:
PHP:
Option Explicit
Function MonTL(MHS As String) As String
 Dim Rng As Range
 Dim lR As Long, Ww As Long
 lR = Sheets("LyLich").[a65500].End(xlUp).Row
 MonTL = Sheets("LyLich").Range("A1:A" & lR).Find(what:=MHS, _
          LookIn:=xlValues).Offset(, 2).Value   
End Function
Có nghĩa là bạn có thể ghép nối 2 hàm này hay tự viết 1 hàm khác từ tham khảo này.
Chú í:
1*/ Mình rất ưa xài Option Eplixit đó nha!
2*/ Phương thức Find thay cho vòng lặp sẽ tăng tốc chương trình nhiều hơn, mong vậy!

Chúc vui!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Tôi đã xem qua và có nhận xét rằng:
-cái Function ấy không giống Function lắm, có vẽ giống Sub hơn!
-Đã là Function thì các vùng chọn phải độc lập, không phụ thuộc gì vào name cả
Vậy tạm sửa lại như sau:
PHP:
Option Explicit
Function MonKTL(VungTen As Range, Ten As String, Mon As Range, Vungdiem As Range) As String
  Dim VT As Integer, k As Integer, sm As Integer
  Dim TempRng As Range, dtb As Range
  Dim Temp As String, diemtb As String
  VT = Application.WorksheetFunction.Match(Ten, VungTen, 0)
  Set TempRng = Vungdiem.Offset(VT - 1, 0).Resize(1, Mon.Cells.Count)
      sm = 0
      For Each dtb In TempRng
        k = k + 1
        If dtb < 5 And dtb <> "" Then
          diemtb = diemtb & Mon(k) & "=" & dtb & ", "
          sm = sm + 1
        End If
      Next
      If diemtb = "" Then
        MonKTL = ""
      Else:
        Temp = sm & " M" & ChrW(244) & "n: " & diemtb
        MonKTL = Left(Temp, Len(Temp) - 2)
      End If
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Một cách giải từ hàm của Boyxin:
Mã:
Public Function MonKTL(MaSoHs As String) As String
Dim MaSo As Range, CaNam As Range, sm As Byte, DiemTb As String
Set MaSo = Sheets("LyLich").Range("MaHs")
Set CNam = Sheets("CaNam")
r = Application.WorksheetFunction.Match(MaSoHs, MaSo, 0) + 2
For C = 3 To 15
  dtb = CNam.Cells(r, C)
  If dtb < 5 And dtb <> "" Then
    DiemTb = DiemTb & CNam.Cells(2, C) & "=" & dtb & ", "
    sm = sm + 1
  End If
Next
MonKTL = sm & " M" & ChrW(244) & "n: " & DiemTb
If MaSoHs = "" Then MonKTL = ""
End Function
Cột điểm trung bình cuối cùng là O là cột 15 sao Boyxin ghi là For ... To 16 ?
 
Upvote 0
Trước tiên em xin chân thành cảm ơn các bác

Mình viết cho bạn thêm 1 Function Tìm tên theo mã như sau:
PHP:
Option Explicit
Function MonTL(MHS As String) As String
 Dim Rng As Range
 Dim lR As Long, Ww As Long
 lR = Sheets("LyLich").[a65500].End(xlUp).Row
 MonTL = Sheets("LyLich").Range("A1:A" & lR).Find(what:=MHS, _
           LookIn:=xlValues).Offset(, 2).Value   
End Function
Có nghĩa là bạn có thể ghép nối 2 hàm này hay tự viết 1 hàm khác từ tham khảo này.
Chú í:
1*/ Mình rất ưa xài Option Eplixit đó nha!
2*/ Phương thức Find thay cho vòng lặp sẽ tăng tốc chương trình nhiều hơn, mong vậy!
Chúc vui!
Em dùng Fun này để từ MaHS -> TênHS, rồi dùng hàm cũ từ TênHS-> Các môn Thi Lại => Khi có 2 HS trùng tên thì vẫn gặp lỗi

Tôi đã xem qua và có nhận xét rằng:
-cái Function ấy không giống Function lắm, có vẽ giống Sub hơn!
-Đã là Function thì các vùng chọn phải độc lập, không phụ thuộc gì vào name cả
- Hi, đó là do chuyển từ Sub to Fun
- Fun trên không đả động gì tới Mã HS mà chỉ quan tâm đến Họ tên HS => có 2 học sinh trùng tên là Fun chịu không biết làm già cả => muốn thay đối tượng của Fun là Mã HS để giải quyết vấn đề này

Một cách giải từ hàm của Boyxin:
PHP:
Public Function MonKTL(MaSoHs As String) As String
Dim MaSo As Range, CaNam As Range, sm As Byte, DiemTb As String
Set MaSo = Sheets("LyLich").Range("MaHs")
Set CNam = Sheets("CaNam")
r = Application.WorksheetFunction.Match(MaSoHs, MaSo, 0) + 2
For C = 3 To 15
  dtb = CNam.Cells(r, C)
  If dtb < 5 And dtb <> "" Then
    DiemTb = DiemTb & CNam.Cells(2, C) & "=" & dtb & ", "
    sm = sm + 1
  End If
Next
MonKTL = sm & " M" & ChrW(244) & "n: " & DiemTb
If MaSoHs = "" Then MonKTL = ""
End Function
Cột điểm trung bình cuối cùng là O là cột 15 sao Boyxin ghi là For ... To 16 ?
Hi, em đã nói rồi, em có biết gì về VBA đâu. Cứ thấy cho kết quả đúng ý thì tưởng là được rồi
Sau vụ này chắc phải mua sách của PhanTuHuong để học thôi

Em đang Test đoạn code này. bước đầu chưa thấy trường hợp nào báo lỗi. nhưng khi ráp vào file chính của em thì có vẻ làm tiến độ tính toán của toàn file của em chạy ì ạch, phải đếm % (máy đồng bộ Compaq PenIII-866, 256MR) đang chờ kết quả ở máy cấu hình cao hơn chút

Một lần nữa cảm ơn các bác đã nhiệt tình giúp đỡ
 
Lần chỉnh sửa cuối:
Upvote 0
Em dùng Fun này để từ MaHS -> TênHS, rồi dùng hàm cũ từ TênHS-> Các môn Thi Lại => Khi có 2 HS trùng tên thì vẫn gặp lỗi
Cách nào thì cách, bên Sheets("CaNam") cũng phải có [MaHS] để khắc phục tên trùng trong DSách. Và như vậy cột họ tên trong đó là 'thừa' - ta có thể xóa cũng không sao(!)
Và như vậy, Hàm của bạn không phải sửa nhiều đâu, nhỉ?!
 
Upvote 0
- Hi, đó là do chuyển từ Sub to Fun
- Fun trên không đả động gì tới Mã HS mà chỉ quan tâm đến Họ tên HS => có 2 học sinh trùng tên là Fun chịu không biết làm già cả => muốn thay đối tượng của Fun là Mã HS để giải quyết vấn đề này
Thì trong Function của tôi, bạn chỉ cần thay VungTen thành VungMa là đựoc rồi... thậm chí cứ để yên vậy cũng không sao, chỉ cần khi quét chọn thì hãy quét chọn VungMa và thay Ten thành Ma là xong
Hàm viết rồi còn phải để cho ngừoi khác xài với chứ... chả lẽ giới thiệu cho các thầy cô khác xài cũng bắt buột ngừoi ta đặt name và tên sheet y chang như file của bạn thì hàm mới chạy đựoc à
Hic...
 
Upvote 0
Cách nào thì cách, bên Sheets("CaNam") cũng phải có [MaHS] để khắc phục tên trùng trong DSách. Và như vậy cột họ tên trong đó là 'thừa' - ta có thể xóa cũng không sao(!)
Và như vậy, Hàm của bạn không phải sửa nhiều đâu, nhỉ?!

Function của bác phamduylong chạy tốt theo ý đồ của em
  1. Từ MaHS dồi chiếu theo name MaHS bên sheet LyLich lấy dòng của MaHS cần xét
  2. Từ con số (số dòng) thu được đó xác định Vùng cần tìn kiếm bên sheet CaNam (chỉ 1 dòng của HS cần xét) để thống kê
Còn việc sheet CaNam cần có cột Tên HS là để in bảng tổng hợp phát cho phụ huynh khi họp cuối năm (không có cũng vẫn thống kê được phần môn TL)

Em vẫn cảm thấy có gì đó chưa ổn nên làm cho tiến trình tính toán của cả file có vẻ chậm hơn so với việc không dùng VBA mà dùng công thức với 1 số cột phụ nhưng không biết tại đâu

Đã nói trước
không biết gì về VBA đâu. các bác làm hoàn thiện giúp em nha (đoạn code trên em có được cũng là nhờ các bác trên GPE giúp)
Lại còn thế này
Thì trong Function của tôi, bạn chỉ cần thay VungTen thành VungMa là đựoc rồi... thậm chí cứ để yên vậy cũng không sao, chỉ cần khi quét chọn thì hãy quét chọn VungMa và thay Ten thành Ma là xong
Xong rồi lại còn thế này nữa
Hàm viết rồi còn phải để cho ngừoi khác xài với chứ... chả lẽ giới thiệu cho các thầy cô khác xài cũng bắt buột ngừoi ta đặt name và tên sheet y chang như file của bạn thì hàm mới chạy đựoc à
Hic...
hiiiiiiiiiiiiiiiiiiiiiiiiiiii
 
Upvote 0
trời ơi sao mà phức tạp quá zậy?,không có cách nào đỡ dài dòng mà dễ hiểu hơn ạ????Em đọc chẳng hiểu gì hết
cho em xin cách nào dài dòng hơn cũng được nhưng chỉ sử dụng những hàm cơ bản thôi được không ạ????
Em cám ơn nhìu nhìu

From BNTT:
Bạn có xem bài này đang nằm ở đâu không? Nó đang nằm trong Box: Các hàm tự tạo cho worksheet, mà đã nói đến các hàm tự tạo, thì chắc chắn đó không phải là những hàm cơ bản. Nếu trong Box này mà viết bài bàn đến những hàm cơ bản, thì chắc chắn bài đó sẽ bị xóa ngay, vì gửi không đúng chỗ.
__________________
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT

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

Back
Top Bottom