Forum Discussion
stpolgar
Apr 25, 2021Copper Contributor
Generating subsets of k elements out of a set of n elements
In Excel, how do you do generate, for example all subsets of 3 elements out of a set of 10 elements.
HansVogelaar
Apr 25, 2021MVP
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.