- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,720
- Giới tính
- Nam
Chua thiệt nhưng vẫn làm thử cho bạn, kiểm tra xem có OK chưa!?Chuẩn thật, sếp suy nghĩ rất thấu đáo, em không nghĩ ra.
Nếu vậy thì sẽ đổ hết vào ngày làm việc gần nhất trước đó sếp ạ.. trường hợp cả tháng nghỉ mà chỉ có một ngày làm việc thì dồn hết vào ngày đó nếu không có ngày làm việc nào thì thôi exit sub luôn cho khoẻ sếp ạ.
PHP:
Sub PhanBo_UuTien_HTN_New()
Dim ObjDict As Object
Dim blnCheckHoliday As Boolean
Dim c As Byte, Cols As Byte, bteWkCol As Byte
Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
Dim arrPhanBo, arrTieuChuan, arrWorking, arrDuLieu(), arrCode()
Dim e As Long, r As Long, lngCol As Long, lngRow As Long
Dim dblSoMax As Double, dblRemain As Double, dblThayDoi As Double
Set shDuLieu = Sheets("DU_LIEU")
Set shTieuChuan = Sheets("TIEU_CHUAN")
Set ObjDict = CreateObject("Scripting.Dictionary")
shDuLieu.AutoFilterMode = False
shTieuChuan.AutoFilterMode = False
e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
arrTieuChuan = shTieuChuan.Range("B3:C" & e).Value
For r = 1 To UBound(arrTieuChuan)
ObjDict(arrTieuChuan(r, 1)) = arrTieuChuan(r, 2)
Next
arrWorking = shDuLieu.Range("G1:W1").Value
e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
arrPhanBo = shDuLieu.Range("F3:F" & e).Value
arrDuLieu = shDuLieu.Range("G3:W" & e).Value
arrCode = shDuLieu.Range("B3:B" & e).Value
lngRow = UBound(arrDuLieu, 1)
lngCol = UBound(arrDuLieu, 2)
For r = 1 To lngRow Step 2
dblRemain = arrPhanBo(r, 1)
dblSoMax = ObjDict(arrCode(r, 1))
For c = 1 To lngCol
blnCheckHoliday = False
arrDuLieu(r + 1, c) = ""
If LCase(arrWorking(1, c)) = "holiday" Then
blnCheckHoliday = True
Else
bteWkCol = c
End If
If dblRemain > 0 Then
If c < lngCol Then
If Not blnCheckHoliday Then
dblThayDoi = dblRemain + arrDuLieu(r, c)
If dblThayDoi > dblSoMax Then
arrDuLieu(r + 1, c) = dblSoMax
dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
Else
arrDuLieu(r + 1, c) = dblThayDoi
dblRemain = 0
End If
Else
dblRemain = dblRemain + arrDuLieu(r, c)
End If
Else
If Not blnCheckHoliday Then
arrDuLieu(r + 1, c) = dblRemain + arrDuLieu(r, c)
Else
arrDuLieu(r + 1, bteWkCol) = dblRemain + arrDuLieu(r, c) + arrDuLieu(r + 1, bteWkCol)
End If
End If
Else
If Not blnCheckHoliday Then
arrDuLieu(r + 1, c) = arrDuLieu(r, c)
Else
dblRemain = dblRemain + arrDuLieu(r, c)
End If
End If
Next c
Next r
Set ObjDict = Nothing
shDuLieu.Range("G3:W" & e).Value = arrDuLieu
shDuLieu.Range("A2:W2").AutoFilter
End Sub
Lần chỉnh sửa cuối: