Excel для комбинаций - PullRequest
       3

Excel для комбинаций

0 голосов
/ 23 апреля 2020

У меня есть 2 столбца:

Столбец 1: A B C D E F G H I J

Столбец 2: 1 2 3 4 5 6. , , 31

Мне нужно создать 6 групп по 5 в каждой из максимум 2 строк из столбца 2, убедившись, что каждая строка в столбце 2 не повторяется со строками в столбце 1 в группе. Можно ли это сделать только с помощью функций Excel? Или это потребует некоторого количества кодирования?

1 Ответ

0 голосов
/ 23 апреля 2020

Я думаю, вы говорите о каком-то коде комбинации или, возможно, коде перестановки. Трудно сказать, что вы хотите, основываясь только на вашем описании / комментариях. Может быть, вы можете проверить это и посмотреть, работает ли он.

Sub ListCombinations()

Dim col As New Collection
Dim c As Range, sht As Worksheet, res
Dim i As Long, arr, numCols As Long

    Set sht = ActiveSheet
    For Each c In sht.Range("A1:B1").Cells
        col.Add Application.Transpose(sht.Range(c, c.End(xlDown)))
        numCols = numCols + 1
    Next c

    res = Combine(col, "~~")

    For i = 0 To UBound(res)
        arr = Split(res(i), "~~")
        sht.Range("H1").Offset(i, 0).Resize(1, numCols) = arr
    Next i

End Sub


'create combinations from a collection of string arrays
Function Combine(col As Collection, SEP As String) As String()

    Dim rv() As String
    Dim pos() As Long, lengths() As Long, lbs() As Long, ubs() As Long
    Dim t As Long, i As Long, n As Long, ub As Long
    Dim numIn As Long, s As String, r As Long

    numIn = col.Count
    ReDim pos(1 To numIn)
    ReDim lbs(1 To numIn)
    ReDim ubs(1 To numIn)
    ReDim lengths(1 To numIn)
    t = 0
    For i = 1 To numIn  'calculate # of combinations, and cache bounds/lengths
        lbs(i) = LBound(col(i))
        ubs(i) = UBound(col(i))
        lengths(i) = (ubs(i) - lbs(i)) + 1
        pos(i) = lbs(i)
        t = IIf(t = 0, lengths(i), t * lengths(i))
    Next i
    ReDim rv(0 To t - 1) 'resize destination array

    For n = 0 To (t - 1)
        s = ""
        For i = 1 To numIn
            s = s & IIf(Len(s) > 0, SEP, "") & col(i)(pos(i)) 'build the string
        Next i
        rv(n) = s

        For i = numIn To 1 Step -1
            If pos(i) <> ubs(i) Then   'Not done all of this array yet...
                pos(i) = pos(i) + 1    'Increment array index
                For r = i + 1 To numIn 'Reset all the indexes
                    pos(r) = lbs(r)    '   of the later arrays
                Next r
                Exit For
            End If
        Next i
    Next n

    Combine = rv
End Function

Вся заслуга Тима Уильямса !!

Я нашел код здесь:

VBA - записать все возможные комбинации из 4 столбцов данных

enter image description here

Это просто длинный выстрел. Я действительно не знаю, что вы хотите. Конечно, вы можете Google 'excel vba combinations' или 'excel vba permutations' и посмотреть, что вы можете придумать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...