Hỏi về cách làm bảng chấm công tự động (1 người xem)

Liên hệ QC

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

ducmagic88

Thành viên chính thức
Tham gia
14/4/20
Bài viết
65
Được thích
4
Em chào các bác! Em đang có vấn đề về bảng chấm công muốn được các bác giúp đỡ ạ. Em muốn nhập dữ liệu vào ô đã tô vàng trong file từ đó sẽ tự động đánh số công như thông tin mình đã điền vào ô vàng ạ, các bác trợ giúp em với, em cảm ơn các bác nhiều ạ!
 

File đính kèm

Em chào các bác! Em đang có vấn đề về bảng chấm công muốn được các bác giúp đỡ ạ. Em muốn nhập dữ liệu vào ô đã tô vàng trong file từ đó sẽ tự động đánh số công như thông tin mình đã điền vào ô vàng ạ, các bác trợ giúp em với, em cảm ơn các bác nhiều ạ!
Cho hỏi nha, Chủ nhật cũng chấm công nữa hả bạn?
Và CN có 5 cái trong tháng là dữ lắm, nhưng bạn tính sao thành 6 ngày vậy?
 
Lần chỉnh sửa cuối:
Upvote 0
Và CN có 5 cái trong tháng là dữ lắm, nhưng bạn tính sao thành 6 ngày vậy?
Nếu ngày đầu tháng là CN thì ngày CN cuối cùng của tháng đó sẽ là ngày 29 & như thế chỉ 5 cái CN thôi.
Nhưng chắc tác giả bài đăng tính cả ngày nghỉ lễ nên thành 6 CN chăng(?!). Nếu đúng như mình nghĩ thì đó là tháng 3 (mùa con ong đi lấy mật. . . .!)

Thường là tạo ra bảng chấm công này để đối phó với CQ quản lý LĐ; Lúc đó chả cần tính toán gì sất, lấy tờ chấm công mẫu ra mà phết vô thôi.
 
Upvote 0
Cho hỏi nha, Chủ nhật cũng chấm công nữa hả bạn?
Và CN có 5 cái trong tháng là dữ lắm, nhưng bạn tính sao thành 6 ngày vậycBác ơi, em bấm nhầm bác ạ
Có nơi lại làm chủ nhật nghỉ thứ bảy bác ạ.
Còn chỗ chủ nhật là em nhìn nhầm ạ, xin lỗi các bác!
 
Upvote 0
Có nơi lại làm chủ nhật nghỉ thứ bảy bác ạ.
Còn chỗ chủ nhật là em nhìn nhầm ạ, xin lỗi các bác!
1633011321865.png

Nghỉ ngày T7, CN vậy nghỉ ngày thường nhét vào đâu? Ngày lễ và ngày phép để chung cột nghỉ nguyên lương à? Tổng số ngày được tính lương bao gồm ngày phép và ngày lễ? Ngày lễ nếu làm việc có nhân hệ số không?
 
Upvote 0

File đính kèm

Upvote 0
dạ không hưởng lương ạ, xem như mình có việc mình xin nghỉ thôi ạ
1) Hàng 1, tại ô A1 bạn chỉ gõ ngày 1/12/2020 (nói chung là ngày đầu tháng của một tháng nào đó), tôi đã định dạng cho nó thành "BẢNG CHẤM CÔNG THÁNG " mm/yyyy, như thế bạn không phải gõ gì thêm.
2) Bạn chỉ cần gõ tại ô A1 như thế thì hàng 3, các cột ngày sẽ tự động điều chỉnh theo ngày trong tháng.
3) Hàng 4 các cột thứ tôi cũng đã làm công thức theo ngày của hàng 3: =IF(WEEKDAY(E3)=1,"CN","Thứ " & WEEKDAY(E3))
4) Còn lại là các công thức theo yêu cầu của bạn.
 

File đính kèm

Upvote 0
1) Hàng 1, tại ô A1 bạn chỉ gõ ngày 1/12/2020 (nói chung là ngày đầu tháng của một tháng nào đó), tôi đã định dạng cho nó thành "BẢNG CHẤM CÔNG THÁNG " mm/yyyy, như thế bạn không phải gõ gì thêm.
2) Bạn chỉ cần gõ tại ô A1 như thế thì hàng 3, các cột ngày sẽ tự động điều chỉnh theo ngày trong tháng.
3) Hàng 4 các cột thứ tôi cũng đã làm công thức theo ngày của hàng 3: =IF(WEEKDAY(E3)=1,"CN","Thứ " & WEEKDAY(E3))
4) Còn lại là các công thức theo yêu cầu của bạn.
Bác ơi, hình như bác hiểu nhầm ý em rồi ạ. Em muốn làm bài toán ngược ấy bác ạ, điền hết các ngày công, nghỉ lễ, nghỉ phép rồi sau đó bấm là chạy ngược ra đánh "x", "x/2", "P",... sao cho phù hợp với thông tin mình đã điền ở ô bôi vàng ấy bác ạ
 
Upvote 0
Bác ơi, hình như bác hiểu nhầm ý em rồi ạ. Em muốn làm bài toán ngược ấy bác ạ, điền hết các ngày công, nghỉ lễ, nghỉ phép rồi sau đó bấm là chạy ngược ra đánh "x", "x/2", "P",... sao cho phù hợp với thông tin mình đã điền ở ô bôi vàng ấy bác ạ
Bạn cho tôi biết nếu như x/2 thì sẽ được nhét vào ngày nào?
Số ngày nghỉ (phép, lễ, riêng) sẽ nhét vào đâu?
Xin lỗi, tôi không có khả năng truy ngược được.
 
Upvote 0
Bạn cho tôi biết nếu như x/2 thì sẽ được nhét vào ngày nào?
Số ngày nghỉ (phép, lễ, riêng) sẽ nhét vào đâu?
Xin lỗi, tôi không có khả năng truy ngược được.
Bác ơi, vậy có cách nào đơn giản chỉ cần đánh số ngẫu nhiên theo ngày công không ạ, ví dụ là 26 thì nó tự đánh ngẫu nhiên 26 "x" cho mình không ạ, không cần phải theo từng trường hợp nữa ạ
 
Upvote 0
Trước tiên phải nói rằng:
Bộ LĐ TB & XH có ban hành BCC (bảng chấm công chuẩn), trong đó có các loại công F, CO, Ô, TN, RC, H (. . .) là các công có lương (được trả từ BHXH hay BHYT)
Ở các cơ sở tư nhân thì có thể ghi trong thỏa ước răng nghỉ việc 1 vài ngày phải xin phép & là không lương, cái này qui định của Bộ là RO (nghỉ không lương); Nhưng họ vẫn quen gọi F (không lương)

(Có thể xem như cố tình xài từ ngữ nhập nhèm nhằm mục đích gì đó (có trời mới biết))

Thứ đến: Đây là BCC để đối phó, nhưng công trình lớn hàng vạn CNV, nên mới cần tự động tạo ra nhưng BCC trời ơi như thế;
Nếu ngay từ đầu nói rõ ra thì đã xong từ lâu rồi, cứ nhập nhèm chi cho tốn thời gian;
Cách đây vài năm mình có làm file 'BCC láo' này trên diễn đàn rồi; Giờ mình không muốn tìm lại được vì khả năng 'tìm' của mình là hữu hạn.
Còn làm mới theo iêu cầu tối thiểu như #12 thì OK, hãy đợi đấy,. . . . . (tuy hơi dài)!
Bác ơi, vậy có cách nào đơn giản chỉ cần đánh số ngẫu nhiên theo ngày công không ạ, ví dụ là 26 thì nó tự đánh ngẫu nhiên 26 "x" cho mình không ạ, không cần phải theo từng trường hợp nữa ạ

Phương án mình nghỉ là vầy:
(*) (Số liệu ban đầu) cần xác định là tháng cân chấm công có bao nhiêu ngày & bao nhiêu trong ý là ngày CN
Tạo vòng lặp duyệt từ đầu tháng, ngày nào là CN thì bỏ ra, còn ngày thường thì biến thành chuỗi & nối lại như kiểu
'010203040607,. . . . .2527282930' (Tháng 04/2020)
Như vậy ta biết độ dài của chuỗi & đối chiếu với số công được vẽ ra trong tháng đó có còn đủ thì ấn vô;
Tinh vi hơn thì ấn ngẫu nhiên các công RO vô trước & chịu khó duyệt lại lần 2 cho công 'X' & 'X/2'

Chúc các bạn khỏe & vui!
 
Lần chỉnh sửa cuối:
Upvote 0
Bác ơi, vậy có cách nào đơn giản chỉ cần đánh số ngẫu nhiên theo ngày công không ạ, ví dụ là 26 thì nó tự đánh ngẫu nhiên 26 "x" cho mình không ạ, không cần phải theo từng trường hợp nữa ạ
Khó cái là 11 ngày lễ, trong đó những ngày lễ âm lịch như Giỗ Tổ Hùng Vương, Tết Nguyên Đán thì làm sao mà biết ngày nào mà chấm? Giờ lễ Quốc khánh lại có thêm 1 ngày, chẳng biết nó là ngày 1/9 hay 3/9, rồi nghỉ bù lễ như thế nào v.v...
 
Upvote 0
Khó cái là 11 ngày lễ, trong đó những ngày lễ âm lịch như Giỗ Tổ Hùng Vương, Tết Nguyên Đán thì làm sao mà biết ngày nào mà chấm? Giờ lễ Quốc khánh lại có thêm 1 ngày, chẳng biết nó là ngày 1/9 hay 3/9, rồi nghỉ bù lễ như thế nào v.v...
Tất tần tật các ngày lễ đều phải qui chuyển về dương lịch;
Còn nghỉ vô ngày 1/09 hay 3/09 Ô. nhà nước đã giao cho cấp dưới tùy xử rồi, có nghĩa là sao cũng OK & chỉ là 1 ngày; Nếu kỹ chút thì ngày nào gần CN hơn thì lấy sẽ là OK;
& các ngày lễ này có danh sách riêng để tra & loại ra;
Thêm nữa, CQ phải làm BCC láo này thường là ngành XD, & như vậy 'Làm' xuyên lễ là chuyện bình thường, khỏi lăn tăn ai bắt bẽ, cự nự được với mấy ông nội này! Zây với họ (riêng chuyện này) sẽ đâm ngu ra!
. . . . . . . .
 
Upvote 0
- Em sửa lại rồi ạ
- Ngày lễ không nhân hệ số ạ
Theo file không xét ngày lể
Code bắt sự kiện sheet data
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim j&
  If Target.Address = "$A$1" Then
    If IsDate(Target.Value) Then
      Application.EnableEvents = False
      Target.Value = Target.Value - Day(Target.Value) + 1
      j = DateAdd("m", 1, Range("E3")) - Range("E3")
      Range("AF3:AI3").EntireColumn.Hidden = False
      If j < 31 Then Range("E3").Offset(, j).Resize(, 31 - j).EntireColumn.Hidden = True
      Application.EnableEvents = True
    End If
  End If
End Sub
Code chấm công ngẫu nhiên
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1
      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1
      aT7(k2) = j
    Else
      k3 = k3 + 1
      aThuong(k3) = j
    End If
  Next j
  For i = 1 To sRow
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox ("So ngay nghi T7 hoac CN sai!"): Exit Sub
'Ngay thuong
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - Int(sArr(i, 4) + 0.5) - Int(sArr(i, 5) + 0.5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox ("So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
    arr = UniqueRand(NgayThuong)
    k = 0
    For j = 1 To NgayLV       '1 Ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To NuaNgay      'Nua ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X/2"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi khong luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "0"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi co luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "L"
    Next j
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X/2"
    Next j
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X/2"
    Next j
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
 

File đính kèm

Upvote 0
Theo file không xét ngày lể
Code bắt sự kiện sheet data
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim j&
  If Target.Address = "$A$1" Then
    If IsDate(Target.Value) Then
      Application.EnableEvents = False
      Target.Value = Target.Value - Day(Target.Value) + 1
      j = DateAdd("m", 1, Range("E3")) - Range("E3")
      Range("AF3:AI3").EntireColumn.Hidden = False
      If j < 31 Then Range("E3").Offset(, j).Resize(, 31 - j).EntireColumn.Hidden = True
      Application.EnableEvents = True
    End If
  End If
End Sub
Code chấm công ngẫu nhiên
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1
      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1
      aT7(k2) = j
    Else
      k3 = k3 + 1
      aThuong(k3) = j
    End If
  Next j
  For i = 1 To sRow
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox ("So ngay nghi T7 hoac CN sai!"): Exit Sub
'Ngay thuong
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - Int(sArr(i, 4) + 0.5) - Int(sArr(i, 5) + 0.5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox ("So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
    arr = UniqueRand(NgayThuong)
    k = 0
    For j = 1 To NgayLV       '1 Ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To NuaNgay      'Nua ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X/2"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi khong luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "0"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi co luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "L"
    Next j
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X/2"
    Next j
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X/2"
    Next j
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
Chà, dài ơi là dài.
 
Upvote 0
Rút gọn lại và điều chỉnh vài lệnh sai
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1:      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1:      aT7(k2) = j
    Else
      k3 = k3 + 1:      aThuong(k3) = j               'Mang ngay thuong
    End If
  Next j
  For i = 1 To sRow
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox ("So ngay nghi T7 hoac CN sai!"): Exit Sub
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - sArr(i, 4) - sArr(i, 5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox ("So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
'Ngay thuong
    arr = UniqueRand(NgayThuong)
    k = 0
    Call AddRes(res, aThuong, arr, k, i, NgayLV, "X") '1 Ngay
    Call AddRes(res, aThuong, arr, k, i, NuaNgay, "X/2") 'Nua ngay
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 2), "0") 'Nghi khong luong
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 3), "L") 'Nghi co luong
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    Call AddRes(res, aT7, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aT7, arr, k, i, M - N, "X/2") 'Nua ngay
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    Call AddRes(res, aCN, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aCN, arr, k, i, M - N, "X/2") 'Nua ngay
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Private Sub AddRes(res, sArr, arr, k, i, ByVal sCol&, ByVal strRes$)
  Dim j&
  For j = 1 To sCol
    k = k + 1
    res(i, sArr(arr(k))) = strRes
  Next j
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
 

File đính kèm

Upvote 0
Rút gọn lại và điều chỉnh vài lệnh sai
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1:      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1:      aT7(k2) = j
    Else
      k3 = k3 + 1:      aThuong(k3) = j               'Mang ngay thuong
    End If
  Next j
  For i = 1 To sRow
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox ("So ngay nghi T7 hoac CN sai!"): Exit Sub
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - sArr(i, 4) - sArr(i, 5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox ("So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
'Ngay thuong
    arr = UniqueRand(NgayThuong)
    k = 0
    Call AddRes(res, aThuong, arr, k, i, NgayLV, "X") '1 Ngay
    Call AddRes(res, aThuong, arr, k, i, NuaNgay, "X/2") 'Nua ngay
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 2), "0") 'Nghi khong luong
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 3), "L") 'Nghi co luong
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    Call AddRes(res, aT7, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aT7, arr, k, i, M - N, "X/2") 'Nua ngay
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    Call AddRes(res, aCN, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aCN, arr, k, i, M - N, "X/2") 'Nua ngay
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Private Sub AddRes(res, sArr, arr, k, i, ByVal sCol&, ByVal strRes$)
  Dim j&
  For j = 1 To sCol
    k = k + 1
    res(i, sArr(arr(k))) = strRes
  Next j
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
Chà chà, gọn ơi là gọn anh ơi.
 
Upvote 0
Rút gọn lại và điều chỉnh vài lệnh sai
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1:      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1:      aT7(k2) = j
    Else
      k3 = k3 + 1:      aThuong(k3) = j               'Mang ngay thuong
    End If
  Next j
  For i = 1 To sRow
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox ("So ngay nghi T7 hoac CN sai!"): Exit Sub
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - sArr(i, 4) - sArr(i, 5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox ("So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
'Ngay thuong
    arr = UniqueRand(NgayThuong)
    k = 0
    Call AddRes(res, aThuong, arr, k, i, NgayLV, "X") '1 Ngay
    Call AddRes(res, aThuong, arr, k, i, NuaNgay, "X/2") 'Nua ngay
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 2), "0") 'Nghi khong luong
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 3), "L") 'Nghi co luong
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    Call AddRes(res, aT7, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aT7, arr, k, i, M - N, "X/2") 'Nua ngay
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    Call AddRes(res, aCN, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aCN, arr, k, i, M - N, "X/2") 'Nua ngay
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Private Sub AddRes(res, sArr, arr, k, i, ByVal sCol&, ByVal strRes$)
  Dim j&
  For j = 1 To sCol
    k = k + 1
    res(i, sArr(arr(k))) = strRes
  Next j
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
Em cảm ơn bác ạ! file chạy tốt rồi ạ
 
Upvote 0
Rút gọn lại và điều chỉnh vài lệnh sai
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1:      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1:      aT7(k2) = j
    Else
      k3 = k3 + 1:      aThuong(k3) = j               'Mang ngay thuong
    End If
  Next j
  For i = 1 To sRow
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox ("So ngay nghi T7 hoac CN sai!"): Exit Sub
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - sArr(i, 4) - sArr(i, 5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox ("So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
'Ngay thuong
    arr = UniqueRand(NgayThuong)
    k = 0
    Call AddRes(res, aThuong, arr, k, i, NgayLV, "X") '1 Ngay
    Call AddRes(res, aThuong, arr, k, i, NuaNgay, "X/2") 'Nua ngay
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 2), "0") 'Nghi khong luong
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 3), "L") 'Nghi co luong
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    Call AddRes(res, aT7, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aT7, arr, k, i, M - N, "X/2") 'Nua ngay
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    Call AddRes(res, aCN, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aCN, arr, k, i, M - N, "X/2") 'Nua ngay
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Private Sub AddRes(res, sArr, arr, k, i, ByVal sCol&, ByVal strRes$)
  Dim j&
  For j = 1 To sCol
    k = k + 1
    res(i, sArr(arr(k))) = strRes
  Next j
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
Mình thử thay số <15 thì không chạy được, mong bạn điều chỉnh để có những người chí có 10 ngày công cũng được hiển thị
Trân trọng
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Rút gọn lại và điều chỉnh vài lệnh sai
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1:      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1:      aT7(k2) = j
    Else
      k3 = k3 + 1:      aThuong(k3) = j               'Mang ngay thuong
    End If
  Next j
  For i = 1 To sRow
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox ("So ngay nghi T7 hoac CN sai!"): Exit Sub
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - sArr(i, 4) - sArr(i, 5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox ("So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
'Ngay thuong
    arr = UniqueRand(NgayThuong)
    k = 0
    Call AddRes(res, aThuong, arr, k, i, NgayLV, "X") '1 Ngay
    Call AddRes(res, aThuong, arr, k, i, NuaNgay, "X/2") 'Nua ngay
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 2), "0") 'Nghi khong luong
    Call AddRes(res, aThuong, arr, k, i, sArr(i, 3), "L") 'Nghi co luong
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    Call AddRes(res, aT7, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aT7, arr, k, i, M - N, "X/2") 'Nua ngay
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    Call AddRes(res, aCN, arr, k, i, N, "X") '1 ngay
    Call AddRes(res, aCN, arr, k, i, M - N, "X/2") 'Nua ngay
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Private Sub AddRes(res, sArr, arr, k, i, ByVal sCol&, ByVal strRes$)
  Dim j&
  For j = 1 To sCol
    k = k + 1
    res(i, sArr(arr(k))) = strRes
  Next j
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
Mình thử ngày công là 14 hoặc ít hơn thì không chạy, mong bạn kiểm tra
 
Upvote 0
Code viết theo yêu cầu của file là phải nhập đầy đủ và hợp lý các giá trị, nếu bỏ qua tham số ngày nghỉ thì tìm file dạng khác
việc đi làm vẫn có trường hợp người lao động nghỉ việc không làm đủ số ngày trong tháng mà anh, với lại em thấy file này là đỉnh nhất rồi, các file khác không bằng được
 
Lần chỉnh sửa cuối:
Upvote 0
(/ậy bài 29 bạn chưa đọc hay sao? Hay bạn chờ được dọn cỗ khác thi vị hơn?!?
 
Upvote 0
(/ậy bài 29 bạn chưa đọc hay sao? Hay bạn chờ được dọn cỗ khác thi vị hơn?!?
dạ em chưa đọc được bài này bác ạ, nếu có thể bác vui lòng cho em xin link, còn vấn đề cỗ bàn thì em không chờ gì cả, khi đọc được bài này em thấy các bác xây dựng rất hay nên em thấy nếu hoàn thiện được thì tốt hơn cho cộng đồng cũng như bản thân em cũng được nhờ. vì nói thẳng em không giỏi lập trình nên mới lên tiếng nhờ các bác cao nhân. Nếu bác nào cảm thấy bị lợi dụng thì thôi không phải trả lời em đâu ạ
 
Upvote 0
Cần xác định các ngày không làm do nguyên nhân gì, nghỉ có phép hay không phép, hoặc do nguyên nhân khác
Một câu của bác đã làm em thấy trời xanh, xin cảm ơn Bác và các vị cao nhân đã tạo ra sản phẩm này.
Một lần nữa xin cảm ơn và chúc các Bác mạnh khoẻ ạ
 
Lần chỉnh sửa cuối:
Upvote 0
dạ vẫn trên file cũ, khi em thử thay ngày công là 11 hoặc 12 tức là những số nhỏ hơn 16 thì code báo lỗi, mong các bác bổ xung ạ
Thêm thông báo số ngày làm việc và ngày nghỉ quá nhỏ
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&, dong$
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  Range("E7").Resize(sRow + 1, 31) = Empty
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1
      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1
      aT7(k2) = j
    Else
      k3 = k3 + 1
      aThuong(k3) = j
    End If
  Next j

  For i = 1 To sRow
    dong = "Dong:    " & i + 6 & Chr(10) & Chr(10)
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox (dong & "So ngay nghi T7 hoac CN sai!"): Exit Sub
'Ngay thuong
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - Int(sArr(i, 4) + 0.5) - Int(sArr(i, 5) + 0.5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox (dong & "So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    If NgayLV < 0 Then MsgBox (dong & "So ngay Lam Viec va Ngay Nghi qua nho!"): Exit Sub
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
    arr = UniqueRand(NgayThuong)
    k = 0
    For j = 1 To NgayLV       '1 Ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To NuaNgay      'Nua ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X/2"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi khong luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "0"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi co luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "L"
    Next j
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X/2"
    Next j
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X/2"
    Next j
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
 
Upvote 0
Thêm thông báo số ngày làm việc và ngày nghỉ quá nhỏ
Mã:
Sub XYZAB()
  Dim sArr(), aNgay(), aThuong(), aT7(), aCN(), arr, res()
  Dim soNgay&, NgayThuong&, soT7&, soCN&, dong$
  Dim NgayLV&, lvCH&, lvT7&, NuaNgay#
  Dim sRow&, i&, j&, k&, k2&, k3&, N&, M&

  Randomize
  soNgay = DateAdd("m", 1, Range("E3")) - Range("E3")
  aNgay = Range("E3").Resize(, soNgay)
  sArr = Range("AJ7:AN" & Range("B1000").End(xlUp).Row).Value
  sRow = UBound(sArr)
  Range("E7").Resize(sRow + 1, 31) = Empty
  ReDim res(1 To sRow + 1, 1 To 31)
  ReDim aThuong(1 To soNgay)
  ReDim aT7(1 To 10):  ReDim aCN(1 To 10)
 
  For j = 1 To soNgay
    res(sRow + 1, j) = Weekday(aNgay(1, j), vbMonday)
    If res(sRow + 1, j) = 7 Then
      soCN = soCN + 1                                 'So ngay CN
      k = k + 1
      aCN(k) = j
    ElseIf res(sRow + 1, j) = 6 Then
      soT7 = soT7 + 1                                 'So ngay Thu 7
      k2 = k2 + 1
      aT7(k2) = j
    Else
      k3 = k3 + 1
      aThuong(k3) = j
    End If
  Next j

  For i = 1 To sRow
    dong = "Dong:    " & i + 6 & Chr(10) & Chr(10)
    If sArr(i, 4) > soT7 Or sArr(i, 5) > soCN Then _
        MsgBox (dong & "So ngay nghi T7 hoac CN sai!"): Exit Sub
'Ngay thuong
    NgayThuong = soNgay - soT7 - soCN                     'So ngay thuong
    sArr(i, 4) = soT7 - sArr(i, 4)                        'So ngay lam viec thu 7
    sArr(i, 5) = soCN - sArr(i, 5)                        'So ngay lam viec CN
    sArr(i, 1) = sArr(i, 1) - Int(sArr(i, 4) + 0.5) - Int(sArr(i, 5) + 0.5)
    NuaNgay = NgayThuong - sArr(i, 1) - sArr(i, 2) - sArr(i, 3)             'So ngay thuong lam nua ngay
    If NuaNgay < 0 Then MsgBox (dong & "So ngay Lam Viec va Nghi qua lon!"): Exit Sub
    NgayLV = sArr(i, 1) - NuaNgay                         'So ngay thuong lam 1 ngay
    If NgayLV < 0 Then MsgBox (dong & "So ngay Lam Viec va Ngay Nghi qua nho!"): Exit Sub
    NuaNgay = NuaNgay * 2                                 'So ngay thuong lam nua ngay
    arr = UniqueRand(NgayThuong)
    k = 0
    For j = 1 To NgayLV       '1 Ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To NuaNgay      'Nua ngay
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "X/2"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi khong luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "0"
    Next j
    For j = 1 To sArr(i, 2)   'Nghi co luong
      k = k + 1
      jcol = aThuong(arr(k))
      res(i, jcol) = "L"
    Next j
'Thu 7
    k = 0
    N = Int(sArr(i, 4))
    M = Int(sArr(i, 4) + 0.5)
    arr = UniqueRand(soT7)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aT7(arr(k))
      res(i, jcol) = "X/2"
    Next j
'Chu nhat
    k = 0
    N = Int(sArr(i, 5))
    M = Int(sArr(i, 5) + 0.5)
    arr = UniqueRand(soCN)
    For j = 1 To N            '1 ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X"
    Next j
    For j = 1 To M - N        'Nua ngay
      k = k + 1
      jcol = aCN(arr(k))
      res(i, jcol) = "X/2"
    Next j
  Next i
  Range("E7").Resize(sRow, 31) = res
End Sub

Function UniqueRand(ByVal N As Long) As Variant
Dim arr() As Long, i As Long, RndNum As Long, tmp As Long
ReDim arr(1 To N)
'Randomize
For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
Next i
UniqueRand = arr
End Function
Dạ, em cảm ơn Bác nhiều ạ, kính chúc Bác luôn mạnh khoẻ và nhiều niềm vui ạ
 
Upvote 0
Xin hỏi bảng chấm công này dùng cho mục đích gì vậy mọi người
Những cơ quan như ngành xây dựng,. . . cần bảng chấm công để đối phó với ngành LĐ, TB & Xã hội.
Cụ thể là cần có 1 bảng chấm công 'Láo' để báo cáo theo yêu cầu í mà!
 
Upvote 0
Những cơ quan như ngành xây dựng,. . . cần bảng chấm công để đối phó với ngành LĐ, TB & Xã hội.
Cụ thể là cần có 1 bảng chấm công 'Láo' để báo cáo theo yêu cầu í mà!
Chẳng may có anh nào trong bảng chấm công chấm ngẫu nhiên đi làm nhưng thực tế anh đó nghỉ, ra ngoài đường gì gì đó... ai chịu trách nhiệm nhỉ, em ko dám nghĩ nữa bác SA_DQ ạ. nếu ai đó ngành chức năng kiểm tra bảng chấm công này mà OK thì 1 số đơn vị đang phát triển công nghệ 4.0 để chấm công chờ đất dụng võ còn chờ dài dài.
 
Upvote 0
Chẳng may có anh nào trong bảng chấm công chấm ngẫu nhiên đi làm nhưng thực tế anh đó nghỉ, ra ngoài đường gì gì đó... ai chịu trách nhiệm nhỉ, em ko dám nghĩ nữa bác SA_DQ ạ. nếu ai đó ngành chức năng kiểm tra bảng chấm công này mà OK thì 1 số đơn vị đang phát triển công nghệ 4.0 để chấm công chờ đất dụng võ còn chờ dài dài.
Bác SA_DQ đã nói ở trên đây là bảng chấm công "láo", hàng pha-ke (Fake) chỉ để bổ sung cho báo cáo đối phó, làm cho hợp lệ một thủ tục gì đó thôi chứ có phải sử dụng để tính lương thực tế đâu mà bạn lo a bờ cờ, không có đất dụng võ...
Vụ này nó như "chuyện thường ngày ở huyện" đó mà. Chắc bạn đó giờ chưa biết "múa" báo cáo hay sao đó.
 
Upvote 0
Bác SA_DQ đã nói ở trên đây là bảng chấm công "láo", hàng pha-ke (Fake) chỉ để bổ sung cho báo cáo đối phó, làm cho hợp lệ một thủ tục gì đó thôi chứ có phải sử dụng để tính lương thực tế đâu mà bạn lo a bờ cờ, không có đất dụng võ...
Vụ này nó như "chuyện thường ngày ở huyện" đó mà. Chắc bạn đó giờ chưa biết "múa" báo cáo hay sao đó.
À bởi vì bên mình thường xuyên sử dụng bảng chấm công có đầy đủ giờ vào, giờ ra, đầy đủ các loại công: Thời gian, sản phẩm, L, P, TS, TN, Ô, Cô, Ro, VR, H, QS....và chỉ cần trong ngày có tổng giờ làm việc lớn hơn 8h 15' thì đã phải tính lương giờ làm thêm cho công nhân rồi, ngoài các cơ quan quản lý nhà nước kiểm tra còn có các tổ chức đánh giá và kiểm tra tới cả bảng chấm công trong ngày hiện tại xem có chính xác với công nhân đang làm việc trong giờ hay không, đâu có thể để đến hết tháng mới kiểm tra mà lập bảng "láo" như vậy. có chăng chỉ gian lận chút giờ làm thêm thôi chứ ngày chủ nhật làm mà chấm không đúng công nhân họ kiện họ đòi quyền lợi cho không thiếu 1 xu.
 
Upvote 0
Thường cái này trong ngành xây dựng, thực hiện quyết toán công trình; Lúc cần hạch toàn thì phải theo khuôn mẫu trời ơi nào đó có đủ các iếu tố: Ca mày, nhân công, . . . .
 
Upvote 0
Thường cái này trong ngành xây dựng, thực hiện quyết toán công trình; Lúc cần hạch toàn thì phải theo khuôn mẫu trời ơi nào đó có đủ các iếu tố: Ca mày, nhân công, . . . .
Ra vậy. Thảo nào có chuyện bên thuế họ khui ra vấn đề khi quyết toán nhân công xây dựng, nhà thầu mượn CMND hoặc lấy số CMND đã có sẵn trước đó để quyết toán nhân công cho cả người đã chết nhiều năm
 
Upvote 0

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

Back
Top Bottom