- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,725
- 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: 
			
		
	
								
								
									
	
								
							
							 
	 
	  
 
 
		
 
 
		
 ,sếp giữ sức khỏe giùm em.
 ,sếp giữ sức khỏe giùm em. 
 
		 
 
		
 
 
		 
 
		 
 
		 
 
		
 
 
		