Phần code:
Sub LapKeHoach()
Dim NgaySX As Date
Set wsData = Worksheets("Sheet1")
Set wsKH = Worksheets("KHSX")
lrData = wsData.Range("A" & Rows.Count).End(xlUp).Row
wsKH.Range("3:1000").Delete
'Dien cong thuc tinh chenh lech và ngày xét
For i = 3 To lrData
wsData.Cells(i, 7).Value = "=F" & i & "-E" & i
Next
wsData.Cells(3, 8).Value = wsData.Cells(3, 10).Value
'Tim dong min
MinDelta = Application.WorksheetFunction.Min(wsData.Range("G3:G" & lrData))
j = 3
Do While MinDelta < 1000
RowMin = wsData.Range("G3:G" & lrData).Find(MinDelta, , xlValues, xlWhole).Row
'Check dieu kien du thoi gian san xuat
If MinDelta < 0 Then
MsgBox ("Khong du thoi gian san xuat, tang san luong hoac gia han don hang " & wsData.Cells(RowMin, 1).Value)
Exit Sub
End If
wsKH.Cells(j, 2).Value = "=row()-2"
wsKH.Cells(j, 3).Value = wsData.Cells(RowMin, 1).Value
wsKH.Cells(j, 4).Value = wsData.Cells(RowMin, 2).Value
wsKH.Cells(j, 5).Value = wsData.Cells(RowMin, 4).Value
wsKH.Cells(j, 6).Value = wsData.Cells(RowMin, 3).Value
'Tim ngay bat dau
NgaySX = wsData.Cells(3, 8).Value
'Set c = wsData.Range("N3:N5").Find(NgaySX, , xlWhole)
Do While WorksheetFunction.Weekday(NgaySX) = 1 Or Not wsData.Range("N3:N5").Find(NgaySX, , xlValues, xlWhole) Is Nothing
NgaySX = NgaySX + 1
Loop
wsKH.Cells(j, 7).Value = NgaySX
'Tim ngay ket thuc
k = 0
Do While k < wsData.Range("E" & RowMin).Value
If WorksheetFunction.Weekday(NgaySX) <> 1 And wsData.Range("N3:N5").Find(NgaySX, , xlValues, xlWhole) Is Nothing Then
k = k + 1
End If
NgaySX = NgaySX + 1
Loop
wsKH.Cells(j, 8).Value = NgaySX - 1
'Doi du lieu cho vong loop tiep theo
wsData.Cells(3, 8).Value = NgaySX
wsData.Cells(RowMin, 7).Value = 1000
MinDelta = Application.WorksheetFunction.Min(wsData.Range("G3:G" & lrData))
j = j + 1
Loop
wsKH.Range("B3:H" & j - 1).Borders.LineStyle = xlContinuous
End Sub