Option Explicit
Dim MangMau
Dim Kq
Sub vba_abv()
Dim TongNgang
Dim TongDoc
Dim Dong, Cot, MangTT
Dim MauCh
Dim MauNgang
Dim Tam
Dim i, j, k, x, z, t, Tm
Tm = Timer
With Sheet1
TongNgang = .Range("a2:a5")
TongDoc = .Range("b1:e1")
Dong = UBound(TongNgang)
Cot = UBound(TongDoc, 2)
k = 5
End With
Sheet2.UsedRange.Clear
ReDim MangMau(1 To k ^ Cot, 1 To 1)
ReDim MauCh(Cot - 1)
Call CHP(ByVal 0, ByVal Cot, ByVal MauCh, ByVal 0, Cot, 0)
ReDim MauNgang(1 To Dong, 1 To 1)
For i = 1 To Dong
ReDim Tam(UBound(MangMau))
t = 0
For Each x In MangMau
k = 0
For Each j In x
k = k + j
Next j
If k = TongNgang(i, 1) Then
Tam(t) = x
t = t + 1
End If
Next x
ReDim Preserve Tam(t - 1)
MauNgang(i, 1) = Tam
Next i
ReDim MangTT(1 To Dong, 1 To Cot)
Call Test(TongDoc, ByVal MangTT, MauNgang, ByVal 1)
Sheet2.Range("a1") = Timer - Tm
Beep
End Sub
Sub CHP(ByVal Dau, ByVal Cuoi, ByVal Mang, ByVal Chap, Spt, r)
Dim i
If Chap = Spt Then
r = r + 1
MangMau(r, 1) = Mang
Else
For i = Dau To Cuoi
Mang(Chap) = i
Call CHP(ByVal Dau, ByVal Cuoi, ByVal Mang, ByVal Chap + 1, Spt, r)
Next i
End If
End Sub
Sub Test(Doc, ByVal Mang, MCHP, ByVal r)
Dim MCon
Dim i, j, k, n, d
If r = UBound(Mang) + 1 Then
For j = 1 To UBound(Mang, 2)
k = 0
For i = 1 To UBound(Mang)
k = k + Mang(i, j)
Next i
If k = Doc(1, j) Then
d = d + 1
Else
Exit For
End If
Next j
If d = UBound(Mang, 2) Then
Sheet2.Range("a1000000").End(xlUp).Offset(2).Resize(UBound(Mang), UBound(Mang, 2)) = Mang
Sheet2.Range("a1000000").End(xlUp).Select
End If
Else
For Each MCon In MCHP(r, 1)
For j = 1 To UBound(Mang, 2)
Mang(r, j) = MCon(j - 1)
Next j
Call Test(Doc, ByVal Mang, MCHP, ByVal r + 1)
Next MCon
End If
End Sub