Страницы: 1
RSS
Генерация вариантов из заданного диапазона чисел
 
Доброго времени суток!  
Есть такая задача,  есть числа в 20-ти ячейках, от 1 до 20.   Нужно сгенерировать из этих чисел все возможные комбинации по 5 чисел, то есть 1 2 3 4 5, 23456 и так далее...    При этом порядок цифр в комбинациях не важен, то есть комбинация 12345 и комбинация 54321, а так же 12354 и так далее - это  должно считаться как одна комбинация.   С Экселем знаком хорошо, а вот с VBA не очень..  точнее практически не знаю его.  Кто нибудь может помочь в написании макроса, или хотя бы подскажет в каком направлении копать?!   Заранее благодарен.    
 
Код
Sub MyCombin()
    Dim a&(), i&, j&, m&, n&, p&
    n = Val(InputBox("n =", , 20))
    m = Val(InputBox("m =", , 5))
    If n < m Or m < 1 Then Exit Sub

    ReDim a&(1 To m), b&(1 To WorksheetFunction.Combin(n, m), 1 To m)
    For i = 1 To m: a(i) = i: Next i
    If m = n Then p = 1 Else p = m
    
    Range("a1").CurrentRegion.ClearContents
    Do
        j = j + 1
        For i = 1 To m: b(j, i) = a(i): Next i
        If a(m) = n Then p = p - 1 Else p = m
        If p Then
            For i = m To p Step -1
                a(i) = a(p) + i - p + 1
            Next i
        End If
    Loop While p
    [a1].Resize(UBound(b), m) = b
End Sub
 
Огромное спасибо, все работает.  Сейчас попробую проанализировать скрипт и понять, что и как работает.
Еще один маленький вопросик, как сделать чтобы он заполнял колонки по 50 000 строк например?   Ну если я увеличиваю например до 40 чисел, то у меня в одну колонку не помещается.          
Изменено: Stranstvuyshiy - 20.11.2013 22:00:15 (Дополнение. )
 
Пытаюсь немного видоизменить код под свою задачу, и у меня на строке
Код
ReDim a&(1 To m), b&(1 To WorksheetFunction.Combin(n, m), 1 To m)

выдает ошибку "overflow'.

Единственное что поменяла пока в коде - это 3-ю и 4-ю строки:
Код
 n = Cells(Rows.Count, 1).End(xlUp).Row
 m = Cells(Rows.Count, 3).End(xlUp).Row
Значения переменных n, m в процессе выполнения 41 и 22 соответственно.

Подскажите, пожалуйста, в чем причина ошибки и как исправить?
 
Цитата
Liliya777 написал:
Значения переменных n, m в процессе выполнения 41 и 22 соответственно.
ЧИСЛКОМБ(41;22) = 244662670200
Это число неприлично большое, объявить массив в 244 млрд. строк в VBA невозможно, да и сохранить на листе Excel такое количество комбинаций нельзя, да и зачем, что потом нужно делать с полученными комбинациями чисел?
Изменено: MCH - 02.06.2017 17:10:05
 
MCH, спасибо. Получается этот макрос вообще не подходит, я недопоняла его действие. Вообще, задача - соединить все фразы из одного столбца с фразами из второго. На данный момент код такой, он нормально работает, но меня не устраивает, что встречаются одинаковые комбинации с разным порядком (к примеру, если бы это были числа, то мне не нужно, чтобы встречалось и (1, 2) и (2, 1):
Код
Sub ФормированиеКомбинаций()
Sheets("Комбинации").Select
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lLastRow
Kombin2 = Cells(i, 1).Text
Fraza = Cells(i, 1).Text
Tema = Cells(i, 2).Text
lLastRow1 = Cells(Rows.Count, 3).End(xlUp).Row
For y = 2 To lLastRow1
If Cells(y, 4).Text <> Tema Then
lLastRow2 = Cells(Rows.Count, 6).End(xlUp).Row
Cells(lLastRow2 + 1, 6).Value = Kombin2 & " " & Cells(y, 3).Text
Cells(lLastRow2 + 1, 7).Value = Tema & ", " & Cells(y, 4).Text
End If
Next
Next
End Sub
Изменено: Liliya777 - 02.06.2017 17:21:19 (форматирование)
 
Liliya777, делайте предварительную обработку комбинаций (внести её в массив, массив отсортировать, объединить в строку), а чтобы не было дублей, то используйте словарь.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Читают тему
Наверх