Рон знает, что он может использовать функцию COMBIN, чтобы определить количество комбинаций, которые могут быть составлены из числа цифр. Однако ему интересно, есть ли способ вывести список всех комбинаций.
В Excel нет встроенного способа составления списка комбинаций. Однако вы можете создать макрос, который сделает список за вас. Если вы хотите найти уникальные комбинации в наборе последовательных чисел, начинающихся с 1, то следующий набор макросов поможет. Все, что вам нужно сделать, это запустить функцию TestCNR, и вы получите «матрицу» ячеек, которая представляет количество 4-значных комбинаций в последовательном наборе значений от 1 до 10.
Sub TestCNR () Cnr 10, 4End Sub Sub Cnr (n, r) i = 1 For j = 1 To r Cells (i, j). Value = j Next Do until Finished (n, r, i) j = FindFirstSmall (n, r, i) Для k = от 1 до j — 1 ячеек (i + 1, k). Value = Cells (i, k). Value Next Cells (i + 1). , j) .Value = Cells (i, j) .Value + 1 For k = j + 1 To r Cells (i + 1, k) .Value = Cells (i + 1, k — 1) .Value + 1 Next i = i + 1 LoopEnd Sub Функция завершена (n, r, i) Temp = True For j = r To 1 Step -1 If Cells (i, j). Value j + (n — r) Then Temp = False End If Next Finished = TempEnd Function Function FindFirstSmall (n, r, i) j = r Do until Cells (i, j). Value j + (n — r) j = j — 1 цикл FindFirstSmall = jEnd Function
Макрос перезаписывает все, что находится на вашем листе, поэтому убедитесь, что вы запустили тест с отображением пустого рабочего листа. Если вы хотите изменить размер набора или количество элементов в подмножестве, просто измените значения, переданные в подпрограмме TestCNR.
Если вы хотите получить уникальные комбинации из строки символов (например, буквы алфавита), то вам нужно использовать другой набор макросов. Следующее будет работать нормально; предполагается, что символы, которые вы хотите использовать в качестве «вселенной», находятся в ячейке A1, а число, которое вы хотите использовать в каждой уникальной комбинации, находится в ячейке A2.
Sub FindSets () Dim iA () As Integer Dim sUniv As String Dim iWanted As Integer Dim j As Integer Dim k As Integer sUniv = Cells (1, 1). Value iWanted = Cells (2, 1) .Value ReDim iA (iWanted) For j = 1 To iWanted iA ( j) = j Next j iRow = PutRow (iA, sUniv, 1) Do until DoneYet (iA, Len (sUniv)) j = WorkHere (iA, Len (sUniv)) iA (j) = iA (j) + 1 For k = j + 1 To iWanted iA (k) = iA (k — 1) + 1 Next k iRow = PutRow (iA, sUniv, iRow) LoopEnd Sub Функция DoneYet (iB, n) As Boolean iMax = UBound (iB) Temp = True For j = iMax To 1 Step -1 Если iB (j) j + (n — iMax) Then Temp = False End If Next DoneYet = TempEnd Function Функция работает здесь (iB, n) как целое число iMax = UBound (iB) j = iMax Do до iB (j) j + (n — iMax) j = j — 1 цикл WorkHere = jEnd Function Функция PutRow (iB, sUniv, i) iMax = UBound (iB) sTemp = » «Для j = 1 До iMax sTemp = sTemp & Mid (sUniv, iB (j), 1) Следующие j ячеек (i, 2). Value = sTemp PutRow = i + 1End Function
Запустите макрос FindSets, и различные желаемые комбинации окажутся в столбце 2. Однако будьте осторожны при запуске макроса. Количество комбинаций может очень быстро стать очень большим. Например, если вы поместите 26 букв (от A до Z) в ячейку A1 и значение 5 в ячейку A2, макрос выйдет из строя. Почему? Потому что существует 65 780 возможных комбинаций из пяти символов и всего 65 536 строк для их размещения.
Источник: