Подпрограмма Excel для создания всех возможных комбинаций из набора данных, за исключением дубликатов - PullRequest
0 голосов
/ 08 октября 2018

Кто-нибудь знает процедуру получения набора данных, состоящего из 7 столбцов, во все возможные комбинации?

комбинация состоит из 7 чисел, подобных этой -> 1 | 3 | 8 | 10 |35 | 40 | 50

Подпрограмма должна просмотреть первую таблицу и составить список всех возможных комбинаций, исключая повторяющиеся числа из комбинации во второй таблице.Пожалуйста, см. Рисунок.

Таблица слева содержит комбинацию, которую необходимо перетасовать, в таблицу справа, которая содержит все возможные комбинации.

enter image description here

1 Ответ

0 голосов
/ 08 октября 2018

Я бы сделал что-то вроде:

Количество опций - 6 ^ 7, так что будет много случаев: 279936 Чтобы получить все это, вы должны просмотреть их.Сначала мы должны найти все варианты.Чтобы сгенерировать все возможные комбинации, включая дубликаты, проблема та же, что и получить все 7-значные цифры мая в базе 6 (так как у нас есть 6 цифр в каждом столбце)

в более новых случаях, вы можете использовать BASEФункционально, но если вы не можете получить к нему доступ, вы можете использовать это: если вы можете немного изменить код, вы можете вызвать значение исходной таблицы вместо цифр 0-5.

Затем просто удалите дубликаты.

Sub generateAllBase6()
Dim i As Double 'number tries
Dim n As String ' the number of item from the column 1-7

For i = 0 To 279936 - 1
n = ConvertBase10(i, "012345")
    For k = 1 To 7
        If Len(n) < k Then
            Cells(i + 2, k) = 0
        Else
            Cells(i + 2, k) = Right(Left(n, k), 1)
        End If
    Next k
Next i
End Sub


Public Function ConvertBase10(ByVal d As Double, ByVal sNewBaseDigits As String) As String
    Dim S As String, tmp As Double, i As Integer, lastI As Integer
    Dim BaseSize As Integer
    BaseSize = Len(sNewBaseDigits)
    Do While Val(d) <> 0
        tmp = d
        i = 0
        Do While tmp >= BaseSize
            i = i + 1
            tmp = tmp / BaseSize
        Loop
        If i <> lastI - 1 And lastI <> 0 Then S = S & String(lastI - i - 1, Left(sNewBaseDigits, 1)) 'get the zero digits inside the number
        tmp = Int(tmp) 'truncate decimals
        S = S + Mid(sNewBaseDigits, tmp + 1, 1)
        d = d - tmp * (BaseSize ^ i)
        lastI = i
    Loop
    S = S & String(i, Left(sNewBaseDigits, 1)) 'get the zero digits at the end of the number
    ConvertBase10 = S
End Function

Я нашел здесь функцию: http://www.freevbcode.com/ShowCode.asp?ID=6604

...