Generating subsets of k elements out of a set of n elements

%3CLINGO-SUB%20id%3D%22lingo-sub-2288499%22%20slang%3D%22en-US%22%3EGenerating%20subsets%20of%20k%20elements%20out%20of%20a%20set%20of%20n%20elements%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2288499%22%20slang%3D%22en-US%22%3E%3CP%3EIn%20Excel%2C%20how%20do%20you%20do%20generate%2C%20for%20example%20all%20subsets%20of%203%20elements%20out%20of%20a%20set%20of%2010%20elements.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2288499%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EExcel%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2288646%22%20slang%3D%22en-US%22%3ERe%3A%20Generating%20subsets%20of%20k%20elements%20out%20of%20a%20set%20of%20n%20elements%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2288646%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F1036274%22%20target%3D%22_blank%22%3E%40stpolgar%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EHere%20is%20some%20VBA%20code%20adapted%20from%20%3CA%20href%3D%22https%3A%2F%2Fwww.get-digital-help.com%2Freturn-all-combinations%2F%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%3EReturn%20all%20combinations%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-visual%22%3E%3CCODE%3E'Dimension%20public%20variable%20and%20declare%20data%20type%0APublic%20result()%20As%20Variant%0A%0A'Name%20User%20Defined%20Function%0AFunction%20Combinations(rng%20As%20Range%2C%20n%20As%20Single)%0A%20%20%20%20Dim%20rng1%0A%20%20%20%20'Save%20values%20from%20cell%20range%20rng%20to%20array%20variable%20rng1%0A%20%20%20%20rng1%20%3D%20rng.Value%0A%20%20%20%20'Redimension%20array%20variable%20result%0A%20%20%20%20ReDim%20result(n%20-%201%2C%200)%0A%20%20%20%20'Start%20User%20Defined%20Function%20Recursive%20with%20paramters%20rng1%2C%20n%2C%201%2C%200%0A%20%20%20%20Call%20Recursive(rng1%2C%20n%2C%201%2C%200)%0A%20%20%20%20'Remove%20a%20column%20of%20values%20from%20array%20variable%20result%0A%20%20%20%20ReDim%20Preserve%20result(UBound(result%2C%201)%2C%20UBound(result%2C%202)%20-%201)%0A%20%20%20%20'Transpose%20values%20in%20variable%20result%20and%20then%20return%20result%20to%20User%20Defined%20Function%20on%20worksheet%0A%20%20%20%20Combinations%20%3D%20Application.Transpose(result)%0AEnd%20Function%0A%0A'Name%20User%20Defined%20Function%20and%20paramters%0AFunction%20Recursive(r%20As%20Variant%2C%20c%20As%20Single%2C%20d%20As%20Single%2C%20e%20As%20Single)%0A%20%20%20%20'Dimension%20variables%20and%20declare%20data%20types%0A%20%20%20%20Dim%20f%20As%20Long%2C%20g%20As%20Long%0A%20%20%20%20'For%20...%20Next%20statement%0A%20%20%20%20For%20f%20%3D%20d%20To%20UBound(r%2C%201)%0A%20%20%20%20%20%20%20%20'Save%20value%20in%20array%20variable%20r%20row%20f%20column%201%20to%20array%20variable%20result%20row%20e%20and%20last%20column%0A%20%20%20%20%20%20%20%20result(e%2C%20UBound(result%2C%202))%20%3D%20r(f%2C%201)%0A%20%20%20%20%20%20%20%20'If%20...%20Then%20...%20Else%20...%20End%20If%20statement%0A%20%20%20%20%20%20%20%20'Check%20if%20variable%20in%20e%20is%20equal%20to%20c%20-1%0A%20%20%20%20%20%20%20%20If%20e%20%3D%20(c%20-%201)%20Then%0A%20%20%20%20%20%20%20%20%20%20%20%20'Add%20another%20column%20to%20array%20variable%20result%0A%20%20%20%20%20%20%20%20%20%20%20%20ReDim%20Preserve%20result(UBound(result%2C%201)%2C%20UBound(result%2C%202)%20%2B%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20'For%20...%20Next%20statement%0A%20%20%20%20%20%20%20%20%20%20%20%20For%20g%20%3D%200%20To%20UBound(result%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'Save%20value%20in%20array%20variable%20result%20row%20g%20second%20last%20column%20to%20result%20row%20g%20last%20column%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result(g%2C%20UBound(result%2C%202))%20%3D%20result(g%2C%20UBound(result%2C%202)%20-%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20Next%20g%0A%20%20%20%20%20%20%20%20'Continue%20here%20if%20e%20is%20not%20equal%20to%20c%20-%201%0A%20%20%20%20%20%20%20%20Else%0A%20%20%20%20%20%20%20%20%20%20%20%20'Start%20User%20Defined%20Function%20Recursive%20with%20parameters%20r%2C%20c%2C%20f%20%2B%201%2C%20e%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20Call%20Recursive(r%2C%20c%2C%20f%20%2B%201%2C%20e%20%2B%201)%0A%20%20%20%20%20%20%20%20End%20If%0A%20%20%20%20Next%20f%0AEnd%20Function%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3EUse%20like%20this%3A%3C%2FP%3E%0A%3CP%3EEnter%20the%20elements%20in%20a%20range%2C%20for%20example%20A1%3AA10.%3C%2FP%3E%0A%3CP%3ESelect%20a%20range%20large%20enough%20for%20the%20output%20(in%20Excel%20in%20Microsoft%20365%20you%20only%20need%20to%20select%20the%20top%20left%20cell).%3C%2FP%3E%0A%3CP%3EEnter%20the%20formula%20%3DCombinations(A1%3AA10%2C3)%3C%2FP%3E%0A%3CP%3EIf%20you're%20not%20on%20Microsoft%20365%2C%20confirm%20the%20formula%20with%20Ctrl%2BShift%2BEnter.%3C%2FP%3E%3C%2FLINGO-BODY%3E
Occasional Visitor

In Excel, how do you do generate, for example all subsets of 3 elements out of a set of 10 elements.

1 Reply

@stpolgar 

Here is some VBA code adapted from Return all combinations 

'Dimension public variable and declare data type
Public result() As Variant

'Name User Defined Function
Function Combinations(rng As Range, n As Single)
    Dim rng1
    'Save values from cell range rng to array variable rng1
    rng1 = rng.Value
    'Redimension array variable result
    ReDim result(n - 1, 0)
    'Start User Defined Function Recursive with paramters rng1, n, 1, 0
    Call Recursive(rng1, n, 1, 0)
    'Remove a column of values from array variable result
    ReDim Preserve result(UBound(result, 1), UBound(result, 2) - 1)
    'Transpose values in variable result and then return result to User Defined Function on worksheet
    Combinations = Application.Transpose(result)
End Function

'Name User Defined Function and paramters
Function Recursive(r As Variant, c As Single, d As Single, e As Single)
    'Dimension variables and declare data types
    Dim f As Long, g As Long
    'For ... Next statement
    For f = d To UBound(r, 1)
        'Save value in array variable r row f column 1 to array variable result row e and last column
        result(e, UBound(result, 2)) = r(f, 1)
        'If ... Then ... Else ... End If statement
        'Check if variable in e is equal to c -1
        If e = (c - 1) Then
            'Add another column to array variable result
            ReDim Preserve result(UBound(result, 1), UBound(result, 2) + 1)
            'For ... Next statement
            For g = 0 To UBound(result, 1)
                'Save value in array variable result row g second last column to result row g last column
                result(g, UBound(result, 2)) = result(g, UBound(result, 2) - 1)
            Next g
        'Continue here if e is not equal to c - 1
        Else
            'Start User Defined Function Recursive with parameters r, c, f + 1, e + 1
            Call Recursive(r, c, f + 1, e + 1)
        End If
    Next f
End Function

Use like this:

Enter the elements in a range, for example A1:A10.

Select a range large enough for the output (in Excel in Microsoft 365 you only need to select the top left cell).

Enter the formula =Combinations(A1:A10,3)

If you're not on Microsoft 365, confirm the formula with Ctrl+Shift+Enter.