Xếp lịch trực 1 nămAnh HieuCD ơi, anh có thể giúp em vấn đề này được ko ạ?
		Mã:
		
	
	Option Explicit
Sub LichTrucNam()
  Application.ScreenUpdating = False
  Range("B7:F372").ClearContents
  Call CreateDate
  Call LichNam
  Application.ScreenUpdating = True
End Sub
Private Sub LichNam()
  Dim aNV(), Arr, Res(), nam
  Dim sRow&, N&, i&, k&, k2&, j&, j2&
  Const Nu& = 9 'So NV Nu
 
  With Sheets("Sheet1")
    nam = .Range("C2").Value
    aNV = .Range("N3:O78").Value
  End With
  sRow = UBound(aNV)
  N = DateSerial(nam + 1, 1, 1) - DateSerial(nam, 1, 1)
  ReDim Res(1 To N, 1 To 4)
  Arr = UniqueRand(sRow, Nu)
  For i = 1 To N
    If k = sRow Then k = 1 Else k = k + 1
    Res(i, 1) = Arr(k)
    If k = sRow Then k = 1 Else k = k + 1
    Res(i, 2) = Arr(k)
  Next i
  For i = 1 To N
    k = Res(i, 1): k2 = Res(i, 2)
    If aNV(k, 2) = "Nam" Then j = 3: j2 = 1 Else j = 1: j2 = 3
      Res(i, j) = aNV(k, 1)
      Res(i, j + 1) = aNV(k, 2)
      Res(i, j2) = aNV(k2, 1)
      Res(i, j2 + 1) = aNV(k2, 2)
    Next i
  Sheets("Sheet1").Range("C7").Resize(N, 4) = Res
End Sub
Private Sub CreateDate()
  Dim aNgay(), fDay As Date, nam, i&
 
  With Sheets("Sheet1")
    nam = .Range("C2").Value
    If Not IsNumeric(nam) Or nam = Empty Then nam = Year(Date): .Range("C2") = nam
    fDay = DateSerial(nam, 1, 1)
    ReDim aNgay(0 To 366, 1 To 1)
    For i = 0 To 400
      aNgay(i, 1) = fDay + i
      If Year(fDay + i + 1) > nam Then Exit For
    Next i
    .Range("B7").Resize(i + 1) = aNgay
    .Range("B7").Resize(i + 1).NumberFormat = "dd/mm/yyyy"
  End With
End Sub
Function UniqueRand(ByVal sRow&, ByVal Nu&) As Variant
  Dim Arr&(), tArr&(), N&, i&, RndNum&, tmp&, k&
  ReDim Arr(1 To sRow): ReDim tArr(1 To sRow - Nu)
  Randomize
  For i = 1 To Nu
TroLai:
    RndNum = Int((sRow - 2) * Rnd() + 2)
    If (RndNum Mod 2) = 1 And Arr(RndNum) = 0 Then Arr(RndNum) = i Else GoTo TroLai
  Next i
  N = sRow - Nu
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If tArr(RndNum) = 0 Then tmp = RndNum Else tmp = tArr(RndNum)
    If tArr(N) = 0 Then tArr(RndNum) = N Else tArr(RndNum) = tArr(N)
    tArr(N) = tmp
    N = N - 1
  Next i
  For i = 1 To sRow
    If Arr(i) = 0 Then
      k = k + 1
      Arr(i) = tArr(k) + Nu
    End If
  Next i
  UniqueRand = Arr
End Function 
	 
	  


 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		

 
 
		 
 
		 
 
		 
 
		

 
 
		 
 
		 
 
		