Nhờ thầy, cô, anh, chị lập code giúp - học phí và tính lương cho môn học với nhiều điều kiện.

Liên hệ QC

hoangminh2018

Thành viên chính thức
Tham gia
31/10/18
Bài viết
58
Được thích
4
Em có file dữ liệu gồm 3 sheets (DMGV, DSMonHoc, BangTinh)
Trong sheet BangTinh thì từ cột A đến cột G là em tự nhâp vào cột H và cột I Thì em nhờ thầy, cô, anh, chị giúp em lập code VBA cho tự chạy vào (trong VD là em làm thủ công)

Điều kiện có săn trong sheet (BangTinh)
Em cảm ơn mọi người nhiều.

Diễn Giải Cách tính học phí và lương.
Học phí được lấy từ sheet DSMonHoc
Lương môn học lý hóa được tính bình thường (theo tỉ lệ trong sheet DMGV) riêng các môn


Toán:​
từ 1 - 5 HV thì lương là 250.000 (chỉ tính lương cho 1 hv đầu các học viên còn lại từ 2-5 là 0)
từ học viên thứ 6 đến hv thứ 9 là lương 40.000/hv,
từ học viên thứ 10 trở lên là tính theo tỉ lệ lương (trong bảng DMGV - 30%)
Anh Văn:​
Từ 1 - 5 HV thì tính lương theo tỉ lệ 1 (trong bảng DMGV - 30%)
Từ 6 - 15 HV thì tính lương theo tỉ lệ 2 (trong bảng DMGV - 25%)
Từ 16 hV trở lên thì trả lương cố định 25.000/HV
Sinh:​
Nếu buổi học từ 1 - 5 HV thì lương là 200.000 (chỉ tính lương cho 1 hv đầu các học viên còn lại từ 2-5 là 0)
Nếu buổi học có trên 6 học viên thì tính lương theo tỉ lệ (bảng DMGV)
 

File đính kèm

  • hoi code tinh luong mon hoc.xlsm
    29.8 KB · Đọc: 11
Cái này bạn chịu khó IF một hồi là ra. Mình gởi lại bạn, đây là công thức ô tính lương, bên cạnh đó mình cũng đã thêm công thức bên cột stt (Xem File)
Mã:
=IF(D15="Toan",IF(J15=1,250000,IF(AND(J15>=6,J15<10),40000,IF(J15>=10,H15*DMGV!$F$3,""))),IF(D15="AV",IF(J15<=5,H15*DMGV!$F$7,IF(AND(BangTinh!J15>=6,BangTinh!J15<=15),BangTinh!H15*DMGV!$G$7,IF(BangTinh!J15>=16,25000,""))),IF(D15="Sinh",IF(AND(J15<=5,J15=1),200000,IF(J15>5,H15*DMGV!$F$6,"")),IF(D15="Hoa",H15*DMGV!$F$3,IF(BangTinh!D15="Ly",BangTinh!H15*DMGV!$F$4,"")))))
 

File đính kèm

  • hoi code tinh luong mon hoc.xlsm
    35.5 KB · Đọc: 5
Upvote 0
Cái này bạn chịu khó IF một hồi là ra. Mình gởi lại bạn, đây là công thức ô tính lương, bên cạnh đó mình cũng đã thêm công thức bên cột stt (Xem File)
Mã:
=IF(D15="Toan",IF(J15=1,250000,IF(AND(J15>=6,J15<10),40000,IF(J15>=10,H15*DMGV!$F$3,""))),IF(D15="AV",IF(J15<=5,H15*DMGV!$F$7,IF(AND(BangTinh!J15>=6,BangTinh!J15<=15),BangTinh!H15*DMGV!$G$7,IF(BangTinh!J15>=16,25000,""))),IF(D15="Sinh",IF(AND(J15<=5,J15=1),200000,IF(J15>5,H15*DMGV!$F$6,"")),IF(D15="Hoa",H15*DMGV!$F$3,IF(BangTinh!D15="Ly",BangTinh!H15*DMGV!$F$4,"")))))
Cảm ơn bạn đã trả lời nhưng bên minh dữ liệu nhiều viết bằng excel thì chạy chậm nên mình mới nhờ các cao thủ viết code vba chạy cho nhanh.
 
Upvote 0
Cảm ơn bạn đã trả lời nhưng bên minh dữ liệu nhiều viết bằng excel thì chạy chậm nên mình mới nhờ các cao thủ viết code vba chạy cho nhanh.
Nhiều nhiêu dòng lận bạn. bạn thử các cách giảm dung lượng file như chuyển định dạng file sang .xlsb hay bỏ các Object, công thức không cần thiết thử xem. Nếu không được mình sẽ thử code cho bạn
 
Upvote 0
Nhiều nhiêu dòng lận bạn. bạn thử các cách giảm dung lượng file như chuyển định dạng file sang .xlsb hay bỏ các Object, công thức không cần thiết thử xem. Nếu không được mình sẽ thử code cho bạn
Ước chừng khoảng 3000 dòng bạn ơi với lại mình cũng muốn học hỏi thêm code VBA nếu bạn viết được code thì giúp mình với để mình có thể hiểu biết thêm..
 
Upvote 0
Không khó, nhưng yêu cầu không rỏ ràng
Tiền lương tính theo môn học hay theo giáo viên ???
Dạ vừa tính theo môn học vừa tính theo giáo viên vd: GV Nguyễn Văn Anh dạy 2 môn môn Hóa thì tính theo tỉ lệ bình thường còn môn toán thì tính theo điều kiện của môn toán.
 
Upvote 0
Em có file dữ liệu gồm 3 sheets (DMGV, DSMonHoc, BangTinh)
Trong sheet BangTinh thì từ cột A đến cột G là em tự nhâp vào cột H và cột I Thì em nhờ thầy, cô, anh, chị giúp em lập code VBA cho tự chạy vào (trong VD là em làm thủ công)

Điều kiện có săn trong sheet (BangTinh)
Em cảm ơn mọi người nhiều.

Diễn Giải Cách tính học phí và lương.
Học phí được lấy từ sheet DSMonHoc
Lương môn học lý hóa được tính bình thường (theo tỉ lệ trong sheet DMGV) riêng các môn

Toán:​
từ 1 - 5 HV thì lương là 250.000 (chỉ tính lương cho 1 hv đầu các học viên còn lại từ 2-5 là 0)
từ học viên thứ 6 đến hv thứ 9 là lương 40.000/hv,
từ học viên thứ 10 trở lên là tính theo tỉ lệ lương (trong bảng DMGV - 30%)
Anh Văn:​
Từ 1 - 5 HV thì tính lương theo tỉ lệ 1 (trong bảng DMGV - 30%)
Từ 6 - 15 HV thì tính lương theo tỉ lệ 2 (trong bảng DMGV - 25%)
Từ 16 hV trở lên thì trả lương cố định 25.000/HV
Sinh:​
Nếu buổi học từ 1 - 5 HV thì lương là 200.000 (chỉ tính lương cho 1 hv đầu các học viên còn lại từ 2-5 là 0)
Nếu buổi học có trên 6 học viên thì tính lương theo tỉ lệ (bảng DMGV)
Tạo mới bảng học phí và tỷ lệ lương
Mã:
  Dim aDinhMuc(), Res()
  Dim fR&, eR&, i&, ik&
Sub LungTung()
  Dim aData(), Dic As Object, eRow&, sRow&, MaMH$
  Set Dic = CreateObject("scripting.dictionary")
  With Sheets("DSMonHoc")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDinhMuc = .Range("B2:F" & eRow).Value
    sRow = UBound(aDinhMuc)
    For i = 1 To sRow
      MaMH = UCase(aDinhMuc(i, 1))
      If Len(MaMH) > 0 Then Dic.Item(MaMH) = i
    Next i
  End With
 
  With Sheets("BangTinh")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 15 Then MsgBox ("Khong co du lieu"): Exit Sub
    aData = .Range("A15:G" & eRow + 1).Value
    sRow = UBound(aData)
  End With
 
  ReDim Res(1 To sRow - 1, 1 To 2)
  fR = 1
  For i = 2 To sRow
    MaMH = UCase(aData(i - 1, 4))
    ik = Dic.Item(MaMH)
    Res(i - 1, 1) = aDinhMuc(ik, 3)
    If aData(i, 1) <> aData(i - 1, 1) Or aData(i, 2) <> aData(i - 1, 2) Or aData(i, 2) <> aData(i - 1, 2) Then
        eR = i - 1
        If MaMH = "TOAN" Then
          Call MonToan
        ElseIf MaMH = "AV" Then
          Call MonAnhVan
        ElseIf MaMH = "SINH" Then
          Call MonSinh
        Else
          Call MonKhac
        End If
        fR = i
      End If
  Next i
  Range("H15").Resize(sRow - 1, 2) = Res
End Sub
Private Sub MonToan()
  Dim k&, TyLe As Double
  Const Luong As Double = 250000
  Const Luong2 As Double = 40000
 
  TyLe = aDinhMuc(ik, 4)
  Res(fR, 2) = Luong
  For i = fR + 1 To eR
    k = k + 1
    If k < 5 Then
      Res(i, 2) = 0
    ElseIf k < 9 Then
      Res(i, 2) = Luong2
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
End Sub
Private Sub MonAnhVan()
  Dim k&, TyLe As Double, TyLe2 As Double
  TyLe = aDinhMuc(ik, 4)
  TyLe2 = aDinhMuc(ik, 5)
  Const Luong As Double = 25000
 
  For i = fR To eR
    k = k + 1
    If k <= 5 Then
      Res(i, 2) = Res(i, 1) * TyLe
    ElseIf k <= 15 Then
      Res(i, 2) = Res(i, 1) * TyLe2
    Else
      Res(i, 2) = Luong
    End If
  Next i
End Sub
Private Sub MonSinh()
  Dim k&, TyLe As Double
  Const Luong As Double = 200000
 
  TyLe = aDinhMuc(ik, 4)
  Res(fR, 2) = Luong
  For i = fR + 1 To eR
    k = k + 1
    If k < 5 Then
      Res(i, 2) = 0
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
End Sub
Private Sub MonKhac()
  Dim k&, TyLe As Double
 
  TyLe = aDinhMuc(ik, 4)
  For i = fR To eR
    Res(i, 2) = Res(i, 1) * TyLe
  Next i
End Sub
 

File đính kèm

  • hoi code tinh luong mon hoc.xlsm
    31.8 KB · Đọc: 9
Upvote 0
Tạo mới bảng học phí và tỷ lệ lương
Mã:
  Dim aDinhMuc(), Res()
  Dim fR&, eR&, i&, ik&
Sub LungTung()
  Dim aData(), Dic As Object, eRow&, sRow&, MaMH$
  Set Dic = CreateObject("scripting.dictionary")
  With Sheets("DSMonHoc")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDinhMuc = .Range("B2:F" & eRow).Value
    sRow = UBound(aDinhMuc)
    For i = 1 To sRow
      MaMH = UCase(aDinhMuc(i, 1))
      If Len(MaMH) > 0 Then Dic.Item(MaMH) = i
    Next i
  End With

  With Sheets("BangTinh")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 15 Then MsgBox ("Khong co du lieu"): Exit Sub
    aData = .Range("A15:G" & eRow + 1).Value
    sRow = UBound(aData)
  End With

  ReDim Res(1 To sRow - 1, 1 To 2)
  fR = 1
  For i = 2 To sRow
    MaMH = UCase(aData(i - 1, 4))
    ik = Dic.Item(MaMH)
    Res(i - 1, 1) = aDinhMuc(ik, 3)
    If aData(i, 1) <> aData(i - 1, 1) Or aData(i, 2) <> aData(i - 1, 2) Or aData(i, 2) <> aData(i - 1, 2) Then
        eR = i - 1
        If MaMH = "TOAN" Then
          Call MonToan
        ElseIf MaMH = "AV" Then
          Call MonAnhVan
        ElseIf MaMH = "SINH" Then
          Call MonSinh
        Else
          Call MonKhac
        End If
        fR = i
      End If
  Next i
  Range("H15").Resize(sRow - 1, 2) = Res
End Sub
Private Sub MonToan()
  Dim k&, TyLe As Double
  Const Luong As Double = 250000
  Const Luong2 As Double = 40000

  TyLe = aDinhMuc(ik, 4)
  Res(fR, 2) = Luong
  For i = fR + 1 To eR
    k = k + 1
    If k < 5 Then
      Res(i, 2) = 0
    ElseIf k < 9 Then
      Res(i, 2) = Luong2
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
End Sub
Private Sub MonAnhVan()
  Dim k&, TyLe As Double, TyLe2 As Double
  TyLe = aDinhMuc(ik, 4)
  TyLe2 = aDinhMuc(ik, 5)
  Const Luong As Double = 25000

  For i = fR To eR
    k = k + 1
    If k <= 5 Then
      Res(i, 2) = Res(i, 1) * TyLe
    ElseIf k <= 15 Then
      Res(i, 2) = Res(i, 1) * TyLe2
    Else
      Res(i, 2) = Luong
    End If
  Next i
End Sub
Private Sub MonSinh()
  Dim k&, TyLe As Double
  Const Luong As Double = 200000

  TyLe = aDinhMuc(ik, 4)
  Res(fR, 2) = Luong
  For i = fR + 1 To eR
    k = k + 1
    If k < 5 Then
      Res(i, 2) = 0
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
End Sub
Private Sub MonKhac()
  Dim k&, TyLe As Double

  TyLe = aDinhMuc(ik, 4)
  For i = fR To eR
    Res(i, 2) = Res(i, 1) * TyLe
  Next i
End Sub
Em cảm ơn anh,
Các môn khác thì được rồi riêng môn sinh tại ngày 6/12 có 7 học sinh thì mình tính lương theo tỉ lệ 30%, anh xem lại giúp em, em cảm ơn anh nhiều lắm.
 
Upvote 0
Em cảm ơn anh,
Các môn khác thì được rồi riêng môn sinh tại ngày 6/12 có 7 học sinh thì mình tính lương theo tỉ lệ 30%, anh xem lại giúp em, em cảm ơn anh nhiều lắm.
Chỉnh lại
Mã:
Private Sub MonSinh()
  Dim k&, TyLe As Double
  Const Luong As Double = 200000
  TyLe = aDinhMuc(ik, 4)
  For i = fR To eR
    If eR - fR < 5 Then
      Res(i, 2) = 0
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
  If eR - fR < 5 Then Res(fR, 2) = Luong
End Sub
 
Upvote 0
Chỉnh lại
Mã:
Private Sub MonSinh()
  Dim k&, TyLe As Double
  Const Luong As Double = 200000
  TyLe = aDinhMuc(ik, 4)
  For i = fR To eR
    If eR - fR < 5 Then
      Res(i, 2) = 0
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
  If eR - fR < 5 Then Res(fR, 2) = Luong
End Sub
[/QUOTE
Quá tuyệt vời em cảm ơn anh nhiều.
Bài đã được tự động gộp:

Chỉnh lại
Mã:
Private Sub MonSinh()
  Dim k&, TyLe As Double
  Const Luong As Double = 200000
  TyLe = aDinhMuc(ik, 4)
  For i = fR To eR
    If eR - fR < 5 Then
      Res(i, 2) = 0
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
  If eR - fR < 5 Then Res(fR, 2) = Luong
End Sub
Quá tuyệt vời anh, em cảm ơn nhiều.
 
Upvote 0
Chỉnh lại
Mã:
Private Sub MonSinh()
  Dim k&, TyLe As Double
  Const Luong As Double = 200000
  TyLe = aDinhMuc(ik, 4)
  For i = fR To eR
    If eR - fR < 5 Then
      Res(i, 2) = 0
    Else
      Res(i, 2) = Res(i, 1) * TyLe
    End If
  Next i
  If eR - fR < 5 Then Res(fR, 2) = Luong
End Sub
Anh ơi em coi kỹ lại rồi, nếu mà mình để ngày lộn xộn thì phần tính lương bị lỗi (ra đáp án không đúng) - em gởi file đính kèm.
Với lại bên em có trường hợp cùng một môn học đó trả lương cho GV này thì 30% nhưng giáo viên lâu năm hơn trả lương 40%.
Em phiền anh quá, mong anh giúp em luôn lần này.
Em cảm ơn anh.
 

File đính kèm

  • hoi code tinh luong mon hoc tra loi.xlsm
    32 KB · Đọc: 4
Upvote 0
Anh ơi em coi kỹ lại rồi, nếu mà mình để ngày lộn xộn thì phần tính lương bị lỗi (ra đáp án không đúng) - em gởi file đính kèm.
Với lại bên em có trường hợp cùng một môn học đó trả lương cho GV này thì 30% nhưng giáo viên lâu năm hơn trả lương 40%.
Em phiền anh quá, mong anh giúp em luôn lần này.
Em cảm ơn anh.
Trong file chưa có dử liệu
"cùng một môn học đó trả lương cho GV này thì 30% nhưng giáo viên lâu năm hơn trả lương 40%"
Thêm dữ liệu và gởi lại file
 
Upvote 0
Chỉnh lại bảng lương
Mã:
  Dim aHocPhi(), aLuong(), TLe_Luong, Res()
  Dim i&, ik&, iR&, n&, HPhi As Double
Sub LungTungQua()
  Dim aData(), Dic As Object, eRow&, sRow&, MonHoc$, iKey As Variant
  Set Dic = CreateObject("scripting.dictionary")
  With Sheets("DSMonHoc")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    aHocPhi = .Range("B3:D" & eRow).Value
    sRow = UBound(aHocPhi)
    For i = 1 To sRow
      MonHoc = UCase(aHocPhi(i, 1))
      If Len(MonHoc) > 0 Then Dic.Item(MonHoc) = aHocPhi(i, 3)
    Next i
  End With
 
  With Sheets("DMGV")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    aLuong = .Range("B3:J" & eRow).Value
    sRow = UBound(aLuong)
    For i = 1 To sRow
      If Len(aLuong(i, 1)) > 0 And Len(aLuong(i, 4)) > 0 Then
        Dic.Item(UCase(aLuong(i, 1) & "#" & aLuong(i, 4))) = Array(aLuong(i, 6), aLuong(i, 7), aLuong(i, 8), aLuong(i, 9))
      End If
    Next i
  End With

  With Sheets("BangTinh")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 15 Then MsgBox ("Khong co du lieu"): Exit Sub
    aData = .Range("A15:D" & eRow).Value
    sRow = UBound(aData)
    ReDim Res(1 To sRow, 1 To 2)
    For i = 1 To sRow
      iKey = CLng(aData(i, 1)) & "|" & UCase(aData(i, 2) & "|" & aData(i, 4))
      Dic.Item(iKey) = Dic.Item(iKey) & "," & i
    Next i
  End With
 
  For Each iKey In Dic.keys
    If InStr(1, iKey, "|") > 0 Then
      S = Split(Dic.Item(iKey), ",")
      MonHoc = UCase(aData(CLng(S(1)), 4))
      HPhi = Dic.Item(MonHoc)
      TLe_Luong = Dic.Item(UCase(aData(CLng(S(1)), 2)) & "#" & MonHoc)
      If TypeName(TLe_Luong) = "Variant()" Then
        If MonHoc = "TOAN" Then
          Call MonToan(S)
        ElseIf MonHoc = "AV" Then
          Call MonAnhVan(S)
        ElseIf MonHoc = "SINH" Then
          Call MonSinh(S)
        Else
          Call MonKhac(S)
        End If
      Else
        MsgBox ("Nhan vien: " & aData(CLng(S(1)), 2) & " Khong day mon: " & MonHoc)
      End If
    End If
  Next iKey
  Sheets("BangTinh").Range("H15").Resize(sRow, 2) = Res
End Sub
Private Sub MonToan(S)
  For i = 1 To UBound(S)
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    If i <= 5 Then
      Res(iR, 2) = 0
    ElseIf i <= 9 Then
      Res(iR, 2) = TLe_Luong(3)
    Else
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
    End If
  Next i
  Res(CLng(S(1)), 2) = TLe_Luong(2)
End Sub
Private Sub MonAnhVan(S)
  For i = 1 To UBound(S)
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    If i <= 5 Then
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
    ElseIf i <= 15 Then
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(1)
    Else
      Res(iR, 2) = TLe_Luong(3)
    End If
  Next i
End Sub
Private Sub MonSinh(S)
  n = UBound(S)
  For i = 1 To n
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    If n < 5 Then
      Res(iR, 2) = 0
    Else
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
    End If
  Next i
  If n < 5 Then Res(CLng(S(1)), 2) = TLe_Luong(2)
End Sub
Private Sub MonKhac(S)
  For i = 1 To UBound(S)
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
  Next i
End Sub
 

File đính kèm

  • hoi code tinh luong mon hoc (1).xlsm
    34.1 KB · Đọc: 8
Upvote 0
Chỉnh lại bảng lương
Mã:
  Dim aHocPhi(), aLuong(), TLe_Luong, Res()
  Dim i&, ik&, iR&, n&, HPhi As Double
Sub LungTungQua()
  Dim aData(), Dic As Object, eRow&, sRow&, MonHoc$, iKey As Variant
  Set Dic = CreateObject("scripting.dictionary")
  With Sheets("DSMonHoc")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    aHocPhi = .Range("B3:D" & eRow).Value
    sRow = UBound(aHocPhi)
    For i = 1 To sRow
      MonHoc = UCase(aHocPhi(i, 1))
      If Len(MonHoc) > 0 Then Dic.Item(MonHoc) = aHocPhi(i, 3)
    Next i
  End With

  With Sheets("DMGV")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    aLuong = .Range("B3:J" & eRow).Value
    sRow = UBound(aLuong)
    For i = 1 To sRow
      If Len(aLuong(i, 1)) > 0 And Len(aLuong(i, 4)) > 0 Then
        Dic.Item(UCase(aLuong(i, 1) & "#" & aLuong(i, 4))) = Array(aLuong(i, 6), aLuong(i, 7), aLuong(i, 8), aLuong(i, 9))
      End If
    Next i
  End With

  With Sheets("BangTinh")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow < 15 Then MsgBox ("Khong co du lieu"): Exit Sub
    aData = .Range("A15:D" & eRow).Value
    sRow = UBound(aData)
    ReDim Res(1 To sRow, 1 To 2)
    For i = 1 To sRow
      iKey = CLng(aData(i, 1)) & "|" & UCase(aData(i, 2) & "|" & aData(i, 4))
      Dic.Item(iKey) = Dic.Item(iKey) & "," & i
    Next i
  End With

  For Each iKey In Dic.keys
    If InStr(1, iKey, "|") > 0 Then
      S = Split(Dic.Item(iKey), ",")
      MonHoc = UCase(aData(CLng(S(1)), 4))
      HPhi = Dic.Item(MonHoc)
      TLe_Luong = Dic.Item(UCase(aData(CLng(S(1)), 2)) & "#" & MonHoc)
      If TypeName(TLe_Luong) = "Variant()" Then
        If MonHoc = "TOAN" Then
          Call MonToan(S)
        ElseIf MonHoc = "AV" Then
          Call MonAnhVan(S)
        ElseIf MonHoc = "SINH" Then
          Call MonSinh(S)
        Else
          Call MonKhac(S)
        End If
      Else
        MsgBox ("Nhan vien: " & aData(CLng(S(1)), 2) & " Khong day mon: " & MonHoc)
      End If
    End If
  Next iKey
  Sheets("BangTinh").Range("H15").Resize(sRow, 2) = Res
End Sub
Private Sub MonToan(S)
  For i = 1 To UBound(S)
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    If i <= 5 Then
      Res(iR, 2) = 0
    ElseIf i <= 9 Then
      Res(iR, 2) = TLe_Luong(3)
    Else
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
    End If
  Next i
  Res(CLng(S(1)), 2) = TLe_Luong(2)
End Sub
Private Sub MonAnhVan(S)
  For i = 1 To UBound(S)
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    If i <= 5 Then
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
    ElseIf i <= 15 Then
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(1)
    Else
      Res(iR, 2) = TLe_Luong(3)
    End If
  Next i
End Sub
Private Sub MonSinh(S)
  n = UBound(S)
  For i = 1 To n
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    If n < 5 Then
      Res(iR, 2) = 0
    Else
      Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
    End If
  Next i
  If n < 5 Then Res(CLng(S(1)), 2) = TLe_Luong(2)
End Sub
Private Sub MonKhac(S)
  For i = 1 To UBound(S)
    iR = CLng(S(i))
    Res(iR, 1) = HPhi
    Res(iR, 2) = Res(iR, 1) * TLe_Luong(0)
  Next i
End Sub
Dạ em cảm ơn anh
Em đã test bị báo lỗi. tại vì chỗ em có nhiều cái đặt biệt quá một thầy có thể dạy nhiều môn làm cho anh tốn thời gian.

1573526110511.png
 
Upvote 0
Dạ em cảm ơn anh
Em đã test bị báo lỗi. tại vì chỗ em có nhiều cái đặt biệt quá một thầy có thể dạy nhiều môn làm cho anh tốn thời gian.

View attachment 228180
Trời ạ! thông báo nhắc nhở bạn phải xem lại khai báo sheet DMGV thiếu dòng nhân viên "NVA" môn "Hoa" nên không tính lương được, bạn phải khai báo thêm mới ra kết quả đầy đủ
 
Upvote 0
Web KT
Back
Top Bottom