QuáchThiênLong
Thành viên mới

- Tham gia
- 31/10/18
- Bài viết
- 8
- Được thích
- 0
Em có 4 chữ cái: A, B, C, D (Bảng 1). Em muốn excel hiện bảng liệt kê kết hợp lần lượt 2 chữ cái và không trùng nhau (Bảng 2). Cao nhân giúp em với
Tác giả Nguyễn Ngọc Thu Hiền có đoạn mã sau rất hay nhưng cái này là tổ hợp, em không biết chỉnh thế nào. Các bạn giúp em với
Option Explicit
'****************************************
'Tac gia: Nguyen Ngoc Thu Hien
'Fb: https://www.facebook.com/profile.php?id=100011406609466
'YouTube: https://www.youtube.com/channel/UC-k00RkGYpeHnFRcafeD2YQ
'Chuc nang: Liet ke to hop chap k cua n phan tu
'Ngay Tao: 30/11/2017
'Version:1.1
'Thanh phan di kem:
'+
'+
'+
'****************************************
Sub ToHop(k As Long, sArr As Variant, ByVal rDes As Range)
'sArr: mang hai chieu chua cac phan tu can to hop
'rDes: vi tri cua o bat dau chua ket qua
Dim vaData, vaDataCurrentRow
Dim lIndex As Long, vTemp As Variant
Dim lNumItem As Long, lNumRe As Long, lNumCol As Long, lRowStartSheet As Long, lrowMaxSheet As Long
Dim lngaMin() As Long, lngaMax() As Long, lngaCurrent() As Long, vaKQ() As Variant
Dim lngRowInPage As Long
Dim lngRowPageCurrent As Long
Dim lngRowMinPage As Long
Dim lngRowMaxPage As Long
Dim lngComVisitMax As Long
ReDim vaData(1 To (UBound(sArr) - LBound(sArr) + 1) * (UBound(sArr, 2) + 1 - LBound(sArr)))
lngRowInPage = 60000
lIndex = 1
For Each vTemp In sArr
vaData(lIndex) = vTemp
lIndex = lIndex + 1
Next
lNumItem = UBound(vaData)
lNumCol = k
lNumRe = Application.WorksheetFunction.Combin(lNumItem, lNumCol)
ReDim lngaMin(1 To lNumCol) As Long
ReDim lngaMax(1 To lNumCol) As Long
ReDim lngaCurrent(1 To lNumCol) As Long
ReDim vaKQ(1 To lngRowInPage, 1 To lNumCol)
ReDim vaDataCurrentRow(1 To lNumCol) As Variant
For lIndex = 1 To lNumCol
lngaMin(lIndex) = lIndex
lngaCurrent(lIndex) = lIndex
lngaMax(lIndex) = (lNumItem - lNumCol) + lIndex ' + 1
vaDataCurrentRow(lIndex) = vaData(lIndex)
Next
rDes = rDes.Cells(1, 1)
lRowStartSheet = rDes.Row
lrowMaxSheet = rDes.Worksheet.Rows.Count
lngaCurrent(lNumCol) = lngaCurrent(lNumCol) - 1 'dich xuong mot phan tu
Do While (1)
lngRowMinPage = lngRowMaxPage + 1
lngRowMaxPage = lngRowMinPage + lngRowInPage - 1
If lngRowMaxPage > lNumRe Then
lngRowMaxPage = lNumRe
End If
For lngRowPageCurrent = 1 To lngRowMaxPage - lngRowMinPage + 1
For lIndex = lNumCol To 1 Step -1
If lngaCurrent(lIndex) = lngaMax(lIndex) Then
lngComVisitMax = lIndex
Else
lngaCurrent(lIndex) = lngaCurrent(lIndex) + 1
vaDataCurrentRow(lIndex) = vaData(lngaCurrent(lIndex))
Exit For
End If
Next
If lngComVisitMax <> 0 Then
For lIndex = lngComVisitMax To lNumCol
lngaCurrent(lIndex) = lngaCurrent(lIndex - 1) + 1
vaDataCurrentRow(lIndex) = vaData(lngaCurrent(lIndex))
Next
lngComVisitMax = 0
End If
For lIndex = 1 To lNumCol
vaKQ(lngRowPageCurrent, lIndex) = vaDataCurrentRow(lIndex)
Next
Next
lIndex = lngRowMaxPage - lngRowMinPage + 1 'so du lieu ti nh duoc
If lrowMaxSheet - rDes.Row + 1 < lIndex Then
Set rDes = rDes.Worksheet.Cells(lRowStartSheet, rDes.Column + lNumCol + 2)
End If
rDes.Resize(lIndex, lNumCol).Value = vaKQ
Set rDes = rDes.Offset(lIndex)
If lngRowMaxPage >= lNumRe Then Exit Do
Loop
Erase vaData
Erase vaDataCurrentRow
Erase vaKQ
Erase lngaMax
Erase lngaMin
Erase lngaCurrent
End Sub
Sub EnumCombination()
Dim rN As Range
Dim vN As Variant
Dim lngK As Long
Dim lngNumN As Long
Dim rDes As Range
On Error Resume Next
Set rN = Application.InputBox("Chon vung chua cac phan tu:", "Select n", Type:=8)
If Err.Number <> 0 Then Exit Sub
vN = rN.Value
If IsArray(vN) = False Then
ReDim vN(1 To 1, 1 To 1) As Variant
vN(1, 1) = rN.Value
End If
lngNumN = rN.Rows.Count * rN.Columns.Count
On Error GoTo 0
lngK = Application.InputBox("Liet ke to hop chap k cua " & Str(lngNumN) & vbCrLf & "k=?", "k", lngNumN, Type:=1)
If lngK = 0 Then
Exit Sub 'nhap ko, hoac canncel
End If
On Error Resume Next
Set rDes = Application.InputBox("Chon vung chua ket qua?", "Vung chua ket qua", Type:=8)
If Err.Number <> 0 Then Exit Sub
On Error GoTo LoiThucThi
DoEvents
Application.EnableEvents = False
Application.ScreenUpdating = False
Call ToHop(lngK, vN, rDes)
Thoat:
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
LoiThucThi:
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox Err.Description
Resume Thoat
End Sub

Bài đã được tự động gộp:
Tác giả Nguyễn Ngọc Thu Hiền có đoạn mã sau rất hay nhưng cái này là tổ hợp, em không biết chỉnh thế nào. Các bạn giúp em với
Option Explicit
'****************************************
'Tac gia: Nguyen Ngoc Thu Hien
'Fb: https://www.facebook.com/profile.php?id=100011406609466
'YouTube: https://www.youtube.com/channel/UC-k00RkGYpeHnFRcafeD2YQ
'Chuc nang: Liet ke to hop chap k cua n phan tu
'Ngay Tao: 30/11/2017
'Version:1.1
'Thanh phan di kem:
'+
'+
'+
'****************************************
Sub ToHop(k As Long, sArr As Variant, ByVal rDes As Range)
'sArr: mang hai chieu chua cac phan tu can to hop
'rDes: vi tri cua o bat dau chua ket qua
Dim vaData, vaDataCurrentRow
Dim lIndex As Long, vTemp As Variant
Dim lNumItem As Long, lNumRe As Long, lNumCol As Long, lRowStartSheet As Long, lrowMaxSheet As Long
Dim lngaMin() As Long, lngaMax() As Long, lngaCurrent() As Long, vaKQ() As Variant
Dim lngRowInPage As Long
Dim lngRowPageCurrent As Long
Dim lngRowMinPage As Long
Dim lngRowMaxPage As Long
Dim lngComVisitMax As Long
ReDim vaData(1 To (UBound(sArr) - LBound(sArr) + 1) * (UBound(sArr, 2) + 1 - LBound(sArr)))
lngRowInPage = 60000
lIndex = 1
For Each vTemp In sArr
vaData(lIndex) = vTemp
lIndex = lIndex + 1
Next
lNumItem = UBound(vaData)
lNumCol = k
lNumRe = Application.WorksheetFunction.Combin(lNumItem, lNumCol)
ReDim lngaMin(1 To lNumCol) As Long
ReDim lngaMax(1 To lNumCol) As Long
ReDim lngaCurrent(1 To lNumCol) As Long
ReDim vaKQ(1 To lngRowInPage, 1 To lNumCol)
ReDim vaDataCurrentRow(1 To lNumCol) As Variant
For lIndex = 1 To lNumCol
lngaMin(lIndex) = lIndex
lngaCurrent(lIndex) = lIndex
lngaMax(lIndex) = (lNumItem - lNumCol) + lIndex ' + 1
vaDataCurrentRow(lIndex) = vaData(lIndex)
Next
rDes = rDes.Cells(1, 1)
lRowStartSheet = rDes.Row
lrowMaxSheet = rDes.Worksheet.Rows.Count
lngaCurrent(lNumCol) = lngaCurrent(lNumCol) - 1 'dich xuong mot phan tu
Do While (1)
lngRowMinPage = lngRowMaxPage + 1
lngRowMaxPage = lngRowMinPage + lngRowInPage - 1
If lngRowMaxPage > lNumRe Then
lngRowMaxPage = lNumRe
End If
For lngRowPageCurrent = 1 To lngRowMaxPage - lngRowMinPage + 1
For lIndex = lNumCol To 1 Step -1
If lngaCurrent(lIndex) = lngaMax(lIndex) Then
lngComVisitMax = lIndex
Else
lngaCurrent(lIndex) = lngaCurrent(lIndex) + 1
vaDataCurrentRow(lIndex) = vaData(lngaCurrent(lIndex))
Exit For
End If
Next
If lngComVisitMax <> 0 Then
For lIndex = lngComVisitMax To lNumCol
lngaCurrent(lIndex) = lngaCurrent(lIndex - 1) + 1
vaDataCurrentRow(lIndex) = vaData(lngaCurrent(lIndex))
Next
lngComVisitMax = 0
End If
For lIndex = 1 To lNumCol
vaKQ(lngRowPageCurrent, lIndex) = vaDataCurrentRow(lIndex)
Next
Next
lIndex = lngRowMaxPage - lngRowMinPage + 1 'so du lieu ti nh duoc
If lrowMaxSheet - rDes.Row + 1 < lIndex Then
Set rDes = rDes.Worksheet.Cells(lRowStartSheet, rDes.Column + lNumCol + 2)
End If
rDes.Resize(lIndex, lNumCol).Value = vaKQ
Set rDes = rDes.Offset(lIndex)
If lngRowMaxPage >= lNumRe Then Exit Do
Loop
Erase vaData
Erase vaDataCurrentRow
Erase vaKQ
Erase lngaMax
Erase lngaMin
Erase lngaCurrent
End Sub
Sub EnumCombination()
Dim rN As Range
Dim vN As Variant
Dim lngK As Long
Dim lngNumN As Long
Dim rDes As Range
On Error Resume Next
Set rN = Application.InputBox("Chon vung chua cac phan tu:", "Select n", Type:=8)
If Err.Number <> 0 Then Exit Sub
vN = rN.Value
If IsArray(vN) = False Then
ReDim vN(1 To 1, 1 To 1) As Variant
vN(1, 1) = rN.Value
End If
lngNumN = rN.Rows.Count * rN.Columns.Count
On Error GoTo 0
lngK = Application.InputBox("Liet ke to hop chap k cua " & Str(lngNumN) & vbCrLf & "k=?", "k", lngNumN, Type:=1)
If lngK = 0 Then
Exit Sub 'nhap ko, hoac canncel
End If
On Error Resume Next
Set rDes = Application.InputBox("Chon vung chua ket qua?", "Vung chua ket qua", Type:=8)
If Err.Number <> 0 Then Exit Sub
On Error GoTo LoiThucThi
DoEvents
Application.EnableEvents = False
Application.ScreenUpdating = False
Call ToHop(lngK, vN, rDes)
Thoat:
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
LoiThucThi:
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox Err.Description
Resume Thoat
End Sub
Lần chỉnh sửa cuối: