Страницы: 1
RSS
Генерация комбинаций нескольких столбцов Excel с помощью VBA
 
Подскажите пожалуйста, у меня есть такой код который генерит все возможные комбинции из заданных значений в столбцах в Excel. Как брать рандомые строки и лимитировать количество резльтатов до 10000 к примеру? Спасибо

Код
Sub ListAllCombinations()
'Updateby Extendoffice
Dim xDRg1, xDRg2, xDRg3, xDRg4, xDRg5, xDRg6, xDRg7, xDRg8, xDRg9, xDRg0 As Range
Dim xRg  As Range
Dim xStr As String
Dim xFN1, xFN2, xFN3, xFN4, xFN5, xFN6, xFN7, xFN8, xFN9, xFN0  As Integer
Dim xSV1, xSV2, xSV3, xSV4, xSV5, xSV6, xSV7, xSV8, xSV9, xSV0 As String
Set xDRg1 = Range("A2:A8")  'First column data
Set xDRg2 = Range("C2:C170")  'Second column data
Set xDRg3 = Range("E2:E178")  'Third column data
Set xDRg4 = Range("G2:G35")
Set xDRg5 = Range("I2:I18")
Set xDRg6 = Range("K2:K15")
Set xDRg7 = Range("M2:M15")
Set xDRg8 = Range("O2:O10")
Set xDRg9 = Range("X2:X16")
Set xDRg0 = Range("Z2:Z3")
xStr = "-"   'Separator
Set xRg = Range("AF2")  'Output cell
For xFN1 = 1 To xDRg1.Count
    xSV1 = xDRg1.Item(xFN1).Text
    For xFN2 = 1 To xDRg2.Count
        xSV2 = xDRg2.Item(xFN2).Text
      For xFN3 = 1 To xDRg3.Count
          xSV3 = xDRg3.Item(xFN3).Text
            For xFN4 = 1 To xDRg4.Count
                xSV4 = xDRg4.Item(xFN4).Text
                For xFN5 = 1 To xDRg5.Count
                    xSV5 = xDRg5.Item(xFN5).Text
                    For xFN6 = 1 To xDRg6.Count
                        xSV6 = xDRg6.Item(xFN6).Text
                        For xFN7 = 1 To xDRg7.Count
                            xSV7 = xDRg7.Item(xFN7).Text
                            For xFN8 = 1 To xDRg8.Count
                                xSV8 = xDRg8.Item(xFN8).Text
                                For xFN9 = 1 To xDRg9.Count
                                    xSV9 = xDRg9.Item(xFN9).Text
                                    For xFN0 = 1 To xDRg0.Count
                                        xSV0 = xDRg0.Item(xFN0).Text
                                        xRg.Value = xSV1 & xStr & xSV2 & xStr & xSV3 & xStr & xSV4 & xStr & xSV5 & xStr & xSV6 & xStr & xSV7 & xStr & xSV8 & xStr & xSV9 & xStr & xSV0
                                        Set xRg = xRg.Offset(1, 0)
                                    Next
                                Next
                             Next
                        Next
                    Next
                Next
             Next
        Next
    Next
Next
End Sub
 
Как вариант.
Код
Option Explicit

Sub ListAllCombinations()
'Updateby Extendoffice
Dim xDRg1, xDRg2, xDRg3, xDRg4, xDRg5, xDRg6, xDRg7, xDRg8, xDRg9, xDRg0 As Range
Dim xRg  As Range
Dim xStr As String
Dim xFN1, xFN2, xFN3, xFN4, xFN5, xFN6, xFN7, xFN8, xFN9, xFN0  As Integer
Dim xSV1, xSV2, xSV3, xSV4, xSV5, xSV6, xSV7, xSV8, xSV9, xSV0 As String
Set xDRg1 = Range("A2:A8")  'First column data
Set xDRg2 = Range("C2:C170")  'Second column data
Set xDRg3 = Range("E2:E178")  'Third column data
Set xDRg4 = Range("G2:G35")
Set xDRg5 = Range("I2:I18")
Set xDRg6 = Range("K2:K15")
Set xDRg7 = Range("M2:M15")
Set xDRg8 = Range("O2:O10")
Set xDRg9 = Range("X2:X16")
Set xDRg0 = Range("Z2:Z3")
xStr = "-"   'Separator
Set xRg = Range("AF2")  'Output cell
Dim iCount As Long
Dim flag As Boolean
flag = True
For xFN1 = 1 To xDRg1.Count
    If flag Then
    xSV1 = xDRg1.Item(xFN1).Text
    For xFN2 = 1 To xDRg2.Count
        If flag Then
        xSV2 = xDRg2.Item(xFN2).Text
        For xFN3 = 1 To xDRg3.Count
            If flag Then
            xSV3 = xDRg3.Item(xFN3).Text
            For xFN4 = 1 To xDRg4.Count
                If flag Then
                xSV4 = xDRg4.Item(xFN4).Text
                For xFN5 = 1 To xDRg5.Count
                    If flag Then
                    xSV5 = xDRg5.Item(xFN5).Text
                    For xFN6 = 1 To xDRg6.Count
                        If flag Then
                        xSV6 = xDRg6.Item(xFN6).Text
                        For xFN7 = 1 To xDRg7.Count
                            If flag Then
                            xSV7 = xDRg7.Item(xFN7).Text
                            For xFN8 = 1 To xDRg8.Count
                                If flag Then
                                xSV8 = xDRg8.Item(xFN8).Text
                                For xFN9 = 1 To xDRg9.Count
                                    If flag Then
                                    xSV9 = xDRg9.Item(xFN9).Text
                                    For xFN0 = 1 To xDRg0.Count
                                        If flag Then
                                            If Rnd() > 0.5 Then
                                                xSV0 = xDRg0.Item(xFN0).Text
                                                xRg.Value = xSV1 & xStr & xSV2 & xStr & xSV3 & xStr & xSV4 & xStr & xSV5 & xStr & xSV6 & xStr & xSV7 & xStr & xSV8 & xStr & xSV9 & xStr & xSV0
                                                Set xRg = xRg.Offset(1, 0)
                                                iCount = iCount + 1
                                                If iCount > 10000 Then flag = False
                                            End If
                                        End If
                                    Next
                                    End If
                                Next
                                End If
                             Next
                             End If
                        Next
                        End If
                    Next
                    End If
                Next
                End If
             Next
             End If
        Next
        End If
    Next
    End If
Next
End Sub
 
Код
Sub ListAllCombinations()
'Updateby Extendoffice
Dim xDRg1, xDRg2, xDRg3, xDRg4, xDRg5, xDRg6, xDRg7, xDRg8, xDRg9, xDRg0 As Range
Dim xRg  As Range
Dim xStr As String
Dim xFN1, xFN2, xFN3, xFN4, xFN5, xFN6, xFN7, xFN8, xFN9, xFN0  As Integer
Dim xSV1, xSV2, xSV3, xSV4, xSV5, xSV6, xSV7, xSV8, xSV9, xSV0 As String
Set xDRg1 = Range("A2:A8")  'First column data
Set xDRg2 = Range("C2:C170")  'Second column data
Set xDRg3 = Range("E2:E178")  'Third column data
Set xDRg4 = Range("G2:G35")
Set xDRg5 = Range("I2:I18")
Set xDRg6 = Range("K2:K15")
Set xDRg7 = Range("M2:M15")
Set xDRg8 = Range("O2:O10")
Set xDRg9 = Range("X2:X16")
Set xDRg0 = Range("Z2:Z3")
xStr = "-"   'Separator
Set xRg = Range("AF2")  'Output cell
Dim iCount As Long
Dim flag As Boolean
flag = True
Randomize
Do
    If flag = False Then Exit Do
    xFN1 = 1 + Rnd() * (xDRg1.Count - 1)
    xFN2 = 1 + Rnd() * (xDRg2.Count - 1)
    xFN3 = 1 + Rnd() * (xDRg3.Count - 1)
    xFN4 = 1 + Rnd() * (xDRg4.Count - 1)
    xFN5 = 1 + Rnd() * (xDRg5.Count - 1)
    xFN6 = 1 + Rnd() * (xDRg6.Count - 1)
    xFN7 = 1 + Rnd() * (xDRg7.Count - 1)
    xFN8 = 1 + Rnd() * (xDRg8.Count - 1)
    xFN9 = 1 + Rnd() * (xDRg9.Count - 1)
    xFN0 = 1 + Rnd() * (xDRg0.Count - 1)
    
    xSV1 = xDRg1.Item(xFN1).Text
    xSV2 = xDRg2.Item(xFN2).Text
    xSV3 = xDRg3.Item(xFN3).Text
    xSV4 = xDRg4.Item(xFN4).Text
    xSV5 = xDRg4.Item(xFN5).Text
    xSV6 = xDRg6.Item(xFN6).Text
    xSV7 = xDRg7.Item(xFN7).Text
    xSV8 = xDRg8.Item(xFN8).Text
    xSV9 = xDRg9.Item(xFN9).Text
    xSV0 = xDRg0.Item(xFN0).Text
     
    xRg.Value = xSV1 & xStr & xSV2 & xStr & xSV3 & xStr & xSV4 & xStr & xSV5 & xStr & xSV6 & xStr & xSV7 & xStr & xSV8 & xStr & xSV9 & xStr & xSV0
    Set xRg = xRg.Offset(1, 0)
    iCount = iCount + 1
    If iCount > 10000 Then flag = False
     
Loop
End Sub
 
Так будет быстрее.
Код
Option Explicit

Sub ListAllCombinations()
'Updateby Extendoffice
Dim xDRg1, xDRg2, xDRg3, xDRg4, xDRg5, xDRg6, xDRg7, xDRg8, xDRg9, xDRg0 As Range
Dim xRg  As Range
Dim xStr As String
Dim xFN1, xFN2, xFN3, xFN4, xFN5, xFN6, xFN7, xFN8, xFN9, xFN0  As Integer
Dim xSV1, xSV2, xSV3, xSV4, xSV5, xSV6, xSV7, xSV8, xSV9, xSV0 As String
Set xDRg1 = Range("A2:A8")  'First column data
Set xDRg2 = Range("C2:C170")  'Second column data
Set xDRg3 = Range("E2:E178")  'Third column data
Set xDRg4 = Range("G2:G35")
Set xDRg5 = Range("I2:I18")
Set xDRg6 = Range("K2:K15")
Set xDRg7 = Range("M2:M15")
Set xDRg8 = Range("O2:O10")
Set xDRg9 = Range("X2:X16")
Set xDRg0 = Range("Z2:Z3")

Dim arr1 As Variant
Dim arr2 As Variant
Dim arr3 As Variant
Dim arr4 As Variant
Dim arr5 As Variant
Dim arr6 As Variant
Dim arr7 As Variant
Dim arr8 As Variant
Dim arr9 As Variant
Dim arr0 As Variant
arr1 = xDRg1
arr2 = xDRg2
arr3 = xDRg3
arr4 = xDRg4
arr5 = xDRg5
arr6 = xDRg6
arr7 = xDRg7
arr8 = xDRg8
arr9 = xDRg9
arr0 = xDRg0

xStr = "-"   'Separator
Set xRg = Range("AF2")  'Output cell
Dim iCount As Long
Dim arrOut As Variant
ReDim arrOut(1 To 10000, 1 To 1)

Randomize
Do
    xFN1 = 1 + Rnd() * (UBound(arr1, 1) - 1)
    xFN2 = 1 + Rnd() * (UBound(arr2, 1) - 1)
    xFN3 = 1 + Rnd() * (UBound(arr3, 1) - 1)
    xFN4 = 1 + Rnd() * (UBound(arr4, 1) - 1)
    xFN5 = 1 + Rnd() * (UBound(arr5, 1) - 1)
    xFN6 = 1 + Rnd() * (UBound(arr6, 1) - 1)
    xFN7 = 1 + Rnd() * (UBound(arr7, 1) - 1)
    xFN8 = 1 + Rnd() * (UBound(arr8, 1) - 1)
    xFN9 = 1 + Rnd() * (UBound(arr9, 1) - 1)
    xFN0 = 1 + Rnd() * (UBound(arr0, 1) - 1)
    
    xSV1 = arr1(xFN1, 1)
    xSV2 = arr2(xFN2, 1)
    xSV3 = arr3(xFN3, 1)
    xSV4 = arr4(xFN4, 1)
    xSV5 = arr5(xFN5, 1)
    xSV6 = arr6(xFN6, 1)
    xSV7 = arr7(xFN7, 1)
    xSV8 = arr8(xFN8, 1)
    xSV9 = arr9(xFN9, 1)
    xSV0 = arr0(xFN0, 1)
     
'    xRg.Value = xSV1 & xStr & xSV2 & xStr & xSV3 & xStr & xSV4 & xStr & xSV5 & xStr & xSV6 & xStr & xSV7 & xStr & xSV8 & xStr & xSV9 & xStr & xSV0
    'Set xRg = xRg.Offset(1, 0)
    iCount = iCount + 1
    If iCount > UBound(arrOut, 1) Then
        Exit Do
    Else
        arrOut(iCount, 1) = xSV1 & xStr & xSV2 & xStr & xSV3 & xStr & xSV4 & xStr & xSV5 & xStr & xSV6 & xStr & xSV7 & xStr & xSV8 & xStr & xSV9 & xStr & xSV0
    End If
     
Loop

xRg.Resize(UBound(arrOut, 1), 1) = arrOut
End Sub
 
Без повторов.
Код
Option Explicit

Sub ListAllCombinations()
'Updateby Extendoffice
Dim xDRg1, xDRg2, xDRg3, xDRg4, xDRg5, xDRg6, xDRg7, xDRg8, xDRg9, xDRg0 As Range
Dim xRg  As Range
Dim xStr As String
Dim xFN1, xFN2, xFN3, xFN4, xFN5, xFN6, xFN7, xFN8, xFN9, xFN0  As Integer
Dim xSV1, xSV2, xSV3, xSV4, xSV5, xSV6, xSV7, xSV8, xSV9, xSV0 As String
Set xDRg1 = Range("A2:A8")  'First column data
Set xDRg2 = Range("C2:C170")  'Second column data
Set xDRg3 = Range("E2:E178")  'Third column data
Set xDRg4 = Range("G2:G35")
Set xDRg5 = Range("I2:I18")
Set xDRg6 = Range("K2:K15")
Set xDRg7 = Range("M2:M15")
Set xDRg8 = Range("O2:O10")
Set xDRg9 = Range("X2:X16")
Set xDRg0 = Range("Z2:Z3")
 
Dim arr1 As Variant
Dim arr2 As Variant
Dim arr3 As Variant
Dim arr4 As Variant
Dim arr5 As Variant
Dim arr6 As Variant
Dim arr7 As Variant
Dim arr8 As Variant
Dim arr9 As Variant
Dim arr0 As Variant
arr1 = xDRg1
arr2 = xDRg2
arr3 = xDRg3
arr4 = xDRg4
arr5 = xDRg5
arr6 = xDRg6
arr7 = xDRg7
arr8 = xDRg8
arr9 = xDRg9
arr0 = xDRg0
 
xStr = "-"   'Separator
Set xRg = Range("AF2")  'Output cell
Dim iCount As Long
Dim dicOut As Object
Set dicOut = CreateObject("Scripting.Dictionary")
Dim sStr As String
Randomize
Do
    xFN1 = 1 + Rnd() * (UBound(arr1, 1) - 1)
    xFN2 = 1 + Rnd() * (UBound(arr2, 1) - 1)
    xFN3 = 1 + Rnd() * (UBound(arr3, 1) - 1)
    xFN4 = 1 + Rnd() * (UBound(arr4, 1) - 1)
    xFN5 = 1 + Rnd() * (UBound(arr5, 1) - 1)
    xFN6 = 1 + Rnd() * (UBound(arr6, 1) - 1)
    xFN7 = 1 + Rnd() * (UBound(arr7, 1) - 1)
    xFN8 = 1 + Rnd() * (UBound(arr8, 1) - 1)
    xFN9 = 1 + Rnd() * (UBound(arr9, 1) - 1)
    xFN0 = 1 + Rnd() * (UBound(arr0, 1) - 1)
     
    xSV1 = arr1(xFN1, 1)
    xSV2 = arr2(xFN2, 1)
    xSV3 = arr3(xFN3, 1)
    xSV4 = arr4(xFN4, 1)
    xSV5 = arr5(xFN5, 1)
    xSV6 = arr6(xFN6, 1)
    xSV7 = arr7(xFN7, 1)
    xSV8 = arr8(xFN8, 1)
    xSV9 = arr9(xFN9, 1)
    xSV0 = arr0(xFN0, 1)
      
'    xRg.Value = xSV1 & xStr & xSV2 & xStr & xSV3 & xStr & xSV4 & xStr & xSV5 & xStr & xSV6 & xStr & xSV7 & xStr & xSV8 & xStr & xSV9 & xStr & xSV0
    'Set xRg = xRg.Offset(1, 0)
    iCount = iCount + 1
    If iCount > 100000 Then Exit Do 'Выход по количеству всех попыток
    sStr = Join(Array(xSV1, xSV2, xSV3, xSV4, xSV5, xSV6, xSV7, xSV8, xSV9, xSV0), xStr)
    dicOut.Item(sStr) = 0
    If dicOut.Count > 10000 Then Exit Do    'Выход по количеству удачных попыток - без повторов.
     
Loop
 
If dicOut.Count > 0 Then
    xRg.Resize(dicOut.Count, 1) = Application.Transpose(dicOut.Keys())
End If
End Sub

Изменено: МатросНаЗебре - 08.12.2021 11:36:37
Страницы: 1
Наверх