Страницы: 1
RSS
Перебор значений для генерации маркировки
 
Добрый день, Ув. Форумчане!

Снова нужен совет специалистов.
Существует маркировка, которая состоит из 14 позиций. Каждой позиции может быть присвоено одно из значений (от 1 до 20 ед).
Необходимо перебрать все возможные варианты маркировок и создать список этих вариантов.
Первое, что приходит на ум - макрос с вложенными циклами (14 шт.).
Возможно есть более универсальные методы решения.
Буду благодарен за любую помощь или совет.
 
Цитата
Alexey0185 написал: Возможно есть более универсальные методы решения.
Да - рекурсия.
+++
Если я не ошибаюсь, то наборов получится 47 523 840. И что Вы со всеми ими будете делать???
Изменено: JayBhagavan - 17.12.2018 16:25:01

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:
Да - рекурсия
Это наверное самый короткий из полезных ответов, который я встречал на форумах.
 
Alexey0185, что в данной маркировке
AB-1/X1K1Y11Z4111/HL
стоит на 10-й позиции (1 или 11)
и на 11-й (11 или 1 - соответственно)
Или это не принципиально
 
Пример условный, поэтому в данном случае не принципиально.  
 
Решение на формулах, по номеру от 1 до 47 523 840 выдает его уникальный код.
Легко переделать на VBA, т.к. математика не сложная
 
Цитата
JayBhagavan написал:
Да - рекурсия.
Вот что-то не понял чем оно поможет.

с точки зрения решения формулами решение MCH,- более чем ок.,  но Alexey0185, чем вас циклы не устроили?
По вопросам из тем форума, личку не читаю.
 
ОГРОМНОЕ СПАСИБО, МСН!!!
Буду пробовать...
 
Ув. БМВ,  с циклов я как раз и начал. Все в принципе работает (если кому интересно - файл приложил).
Но хотелось найти какой-то "более элегантный" вариант.
 
JayBhagavan, Беру свои слова обратно, рекурсия поможет, хотя и не сильно.

Скрытый текст
Изменено: БМВ - 17.12.2018 21:59:10
По вопросам из тем форума, личку не читаю.
 
Спасибо, БМВ!
Пока не знаю как по скорости, а вот по длине и логике кода - точно намного лучше!!!
 
Цитата
Alexey0185 написал:
перебрать все возможные варианты маркировок и создать список этих вариантов.
Вот для конкретно вашего варианта -
Код
Sub main()
P 1
End Sub
 
Sub P(C As Integer, Optional S$ = "")
Dim R&
For R = 7 To 23
  If Cells(R, C) = "" Then Exit For
  If C = 14 Then
    Debug.Print S & Cells(R, C)
  Else
    P C + 1, S & Cells(R, C)
  End If
Next R
End Sub
Правда, в Dedug не влазит результат (можете перенаправить куда хотите), и конец вывода будете ждать ооочень долго.
 
вдогонку "купи слона" http://www.cyberforum.ru/vba/thread1409312.html
Изменено: Казанский - 17.12.2018 22:14:16
Страницы: 1
Наверх