Thống kê số lượng nhân viên cần làm việc trong khoảng thời gian bằng VBA

Liên hệ QC

thao nguyen01

Thành viên thường trực
Tham gia
8/12/19
Bài viết
214
Được thích
25
Kính gửi anh/chị trên diễn đàn,

Em bị vướng vấn đề sau ạ: Em muốn tính số lượng nhân viên làm việc trong khoảng thời gian từ ngày, đến ngày ạ. Em có mô tả kết quả trong file đính kèm ạ. Anh/chị xem giúp em ạ. Vì em muốn học hỏi thêm về code VBA, nếu có thể, anh/chị hướng dẫn em làm bài này theo VBA ạ. Em cảm ơn anh/chị nhiều ạ.
 

File đính kèm

  • Book1.xlsb
    12.7 KB · Đọc: 14
Kính gửi anh/chị trên diễn đàn,

Em bị vướng vấn đề sau ạ: Em muốn tính số lượng nhân viên làm việc trong khoảng thời gian từ ngày, đến ngày ạ. Em có mô tả kết quả trong file đính kèm ạ. Anh/chị xem giúp em ạ. Vì em muốn học hỏi thêm về code VBA, nếu có thể, anh/chị hướng dẫn em làm bài này theo VBA ạ. Em cảm ơn anh/chị nhiều ạ.
Kết quả mình tính là 11 ?
Mã:
Function SoLuongNhanVien(ByVal ThoiGian As Range, ByVal SoLuong As Range, ByVal fDay&, ByVal eDay&) As Long
  Dim tmp(), sRow&, i&, j&, fR&, eR&, Res&
  ReDim tmp(fDay To eDay)
  sRow = ThoiGian.Rows.Count
  For i = 1 To sRow
    If ThoiGian(i, 1) <= eDay And ThoiGian(i, 2) >= fDay Then
      If ThoiGian(i, 1) >= fDay Then fR = ThoiGian(i, 1) Else fR = fDay
      If ThoiGian(i, 2) <= eDay Then eR = ThoiGian(i, 2) Else eR = eDay
        For j = fR To eR
          tmp(j) = tmp(j) + SoLuong(i, 1)
        Next j
    End If
  Next i
  For j = fDay To eDay
    If Res < tmp(j) Then Res = tmp(j)
  Next j
  SoLuongNhanVien = Res
End Function
Xem cách dùng function trong file
 

File đính kèm

  • Book1.xlsb
    16 KB · Đọc: 11
Upvote 0
Kết quả mình tính là 11 ?
Mã:
Function SoLuongNhanVien(ByVal ThoiGian As Range, ByVal SoLuong As Range, ByVal fDay&, ByVal eDay&) As Long
  Dim tmp(), sRow&, i&, j&, fR&, eR&, Res&
  ReDim tmp(fDay To eDay)
  sRow = ThoiGian.Rows.Count
  For i = 1 To sRow
    If ThoiGian(i, 1) <= eDay And ThoiGian(i, 2) >= fDay Then
      If ThoiGian(i, 1) >= fDay Then fR = ThoiGian(i, 1) Else fR = fDay
      If ThoiGian(i, 2) <= eDay Then eR = ThoiGian(i, 2) Else eR = eDay
        For j = fR To eR
          tmp(j) = tmp(j) + SoLuong(i, 1)
        Next j
    End If
  Next i
  For j = fDay To eDay
    If Res < tmp(j) Then Res = tmp(j)
  Next j
  SoLuongNhanVien = Res
End Function
Xem cách dùng function trong file

Dạ, em cảm ơn Thầy ạ. Em thử lại với thời gian từ 17/01/2020 đến 30/01/2020, kết quả em nghĩ là 26. Nhưng khi dùng VBA thì ra 16 ạ. Thầy xem giúp em ạ.
 

File đính kèm

  • Book1.xlsb
    15.6 KB · Đọc: 8
Upvote 0
Kính gửi anh/chị trên diễn đàn,

Em bị vướng vấn đề sau ạ: Em muốn tính số lượng nhân viên làm việc trong khoảng thời gian từ ngày, đến ngày ạ. Em có mô tả kết quả trong file đính kèm ạ. Anh/chị xem giúp em ạ. Vì em muốn học hỏi thêm về code VBA, nếu có thể, anh/chị hướng dẫn em làm bài này theo VBA ạ. Em cảm ơn anh/chị nhiều ạ.
Cột "số lượng nhân viên cần": là tổng số nhân viên cho toàn bộ 1 công việc?
 
Upvote 0
Dạ, công việc A 1 ngày cần 6 người, với 6 người đó làm công việc A sẽ mất 10 ngày (từ 15 đến 24/01) ạ.
Thử một cách khác
Mã:
Sub CongNv()
Dim Nguon
Dim Dau, Cuoi
Dim t1, t2, d1, d2
Dim Tk
Dim i, j, k, x, z, t
With Sheet1
    Nguon = .Range("A2").CurrentRegion
    Dau = .Range("K2")
    Cuoi = .Range("K3")
End With
ReDim Tk(1 To 12, 1 To 31)
For i = 2 To UBound(Nguon)
    t = Nguon(i, 5)
    
    d1 = Day(Nguon(i, 3))
    t1 = Month(Nguon(i, 3))
    d2 = Day(Nguon(i, 4))
    t2 = Month(Nguon(i, 4))
    For x = t1 To t2
        For z = d1 To d2
            Tk(x, z) = t
        Next z
    Next x
Next i
d1 = Day(Dau)
t1 = Month(Dau)
d2 = Day(Cuoi)
t2 = Month(Cuoi)
For i = t1 To t2
    For j = d1 To d2
        k = k + Tk(i, j)
    Next j
Next i
Sheet1.Range("K5") = k
End Sub
 
Upvote 0
Thử một cách khác
Mã:
Sub CongNv()
Dim Nguon
Dim Dau, Cuoi
Dim t1, t2, d1, d2
Dim Tk
Dim i, j, k, x, z, t
With Sheet1
    Nguon = .Range("A2").CurrentRegion
    Dau = .Range("K2")
    Cuoi = .Range("K3")
End With
ReDim Tk(1 To 12, 1 To 31)
For i = 2 To UBound(Nguon)
    t = Nguon(i, 5)
   
    d1 = Day(Nguon(i, 3))
    t1 = Month(Nguon(i, 3))
    d2 = Day(Nguon(i, 4))
    t2 = Month(Nguon(i, 4))
    For x = t1 To t2
        For z = d1 To d2
            Tk(x, z) = t
        Next z
    Next x
Next i
d1 = Day(Dau)
t1 = Month(Dau)
d2 = Day(Cuoi)
t2 = Month(Cuoi)
For i = t1 To t2
    For j = d1 To d2
        k = k + Tk(i, j)
    Next j
Next i
Sheet1.Range("K5") = k
End Sub

Dạ, anh ơi, kết quả từ 17/01 đến 30/01 em chạy code ra 63 lận ạ. Em thử chỉ là 26 ạ. Anh xem giúp em ạ. Em cảm ơn anh nhiều ạ.
 
Upvote 0
Dạ, anh ơi, kết quả từ 17/01 đến 30/01 em chạy code ra 63 lận ạ. Em thử chỉ là 26 ạ. Anh xem giúp em ạ. Em cảm ơn anh nhiều ạ.
Công việc B là trong 10 ngày, mỗi ngày 4 người => Công việc B đã là 40 người rồi bạn
---
Dạ, công việc A 1 ngày cần 6 người, với 6 người đó làm công việc A sẽ mất 10 ngày (từ 15 đến 24/01) ạ.
 
Upvote 0
Công việc B là trong 10 ngày, mỗi ngày 4 người => Công việc B đã là 40 người rồi bạn
---

Dạ, do em giải thích hơi khó hiểu ạ. Công việc A giao cho 6 người làm và không thuê thêm ai khác ạ. Vì vậy dù 10 ngày nhưng công việc A vẫn là 6 người làm anh. Về bản chất là anh nói đúng ạ, nếu 6 người/ngày, 10 ngày sẽ là 60 người ạ. Nhưng vì không thuê thêm 6 người đó sẽ làm trong 10 ngày luôn ạ.
Bài đã được tự động gộp:

Thử file này xem sao nhé.

Dạ, con cảm ơn Bác nhiều ạ.
 
Upvote 0

File đính kèm

  • Book1 (1).xlsb
    16.7 KB · Đọc: 5
Upvote 0
Kính gửi anh/chị trên diễn đàn,

Em bị vướng vấn đề sau ạ: Em muốn tính số lượng nhân viên làm việc trong khoảng thời gian từ ngày, đến ngày ạ. Em có mô tả kết quả trong file đính kèm ạ. Anh/chị xem giúp em ạ. Vì em muốn học hỏi thêm về code VBA, nếu có thể, anh/chị hướng dẫn em làm bài này theo VBA ạ. Em cảm ơn anh/chị nhiều ạ.
Nếu bạn muốn học cách giải quyết vấn đề bằng VBA thì bạn nên học kỹ cách trình bày quy trình và lô gic trước. Qua đến bài thứ 10 ròi mà vẫn chưa giải quyết xong thì không phải do kỹ năng code mà do kỹ năng trình bày của bạn còn quá yếu.

Nếu bạn muốn trau dồi kỹ năng VBA thì chọn bài này là sai đề tài. Nên kiếm bài nào sử dụng:
1. lô gic và các cấu trúc nhiều. Hoặc:
2. các COM/API nhiều.
 
Upvote 0
Mình nghỉ 16 người có ý nghĩa hơn 26 người
View attachment 237191

Dạ. Em nghĩ bài này em trình bày sai và có vấn đề ạ. Em nhìn bảng của Thầy em nhận ra em sai ạ. Vì khi nghỉ và làm luân phiên thì số người làm không phải tổng ạ. Em cảm ơn Thầy nhiều ạ.
Bài đã được tự động gộp:

Nếu bạn muốn học cách giải quyết vấn đề bằng VBA thì bạn nên học kỹ cách trình bày quy trình và lô gic trước. Qua đến bài thứ 10 ròi mà vẫn chưa giải quyết xong thì không phải do kỹ năng code mà do kỹ năng trình bày của bạn còn quá yếu.

Nếu bạn muốn trau dồi kỹ năng VBA thì chọn bài này là sai đề tài. Nên kiếm bài nào sử dụng:
1. lô gic và các cấu trúc nhiều. Hoặc:
2. các COM/API nhiều.

Dạ, em cảm ơn Thầy đã góp ý cho em ạ. Dạ, do cách trình bày của em sai và có vấn đề ạ. Em sẽ rút kinh nghiệm ạ. Em cảm ơn Thầy nhiều ạ.
 
Upvote 0
Web KT
Back
Top Bottom