Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сгенерировать размещения без повторений - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сгенерировать размещения без повторений (Макросы/Sub)
Сгенерировать размещения без повторений
Mexo Дата: Понедельник, 04.12.2017, 05:56 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Здравствуйте! Есть 4 элемента (A, B, C, D) . Помогите сгенерировать в VBA все возможные комбинации из них в лексикографическом порядке по выбранному числу? Например если по 2, тогда должно быть 12 комбинаций (4!/(4-2)!=12):

если по 3, тогда должно быть 24 комбинации (4!/(4-3)!=24):

На самом деле элементов 10, указал меньше для упрощения.
 
Ответить
СообщениеЗдравствуйте! Есть 4 элемента (A, B, C, D) . Помогите сгенерировать в VBA все возможные комбинации из них в лексикографическом порядке по выбранному числу? Например если по 2, тогда должно быть 12 комбинаций (4!/(4-2)!=12):

если по 3, тогда должно быть 24 комбинации (4!/(4-3)!=24):

На самом деле элементов 10, указал меньше для упрощения.

Автор - Mexo
Дата добавления - 04.12.2017 в 05:56
buchlotnik Дата: Понедельник, 04.12.2017, 09:36 | Сообщение № 2
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
Цитата
На самом деле элементов 10, указал меньше для упрощения
упрощения чего? где файл с этими элементами, по сколько их нужно размещать?
 
Ответить
Сообщение
Цитата
На самом деле элементов 10, указал меньше для упрощения
упрощения чего? где файл с этими элементами, по сколько их нужно размещать?

Автор - buchlotnik
Дата добавления - 04.12.2017 в 09:36
nilem Дата: Понедельник, 04.12.2017, 09:41 | Сообщение № 3
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Mexo, привет
такой вот нашелся примерчик, попробуйте
К сообщению приложен файл: 2921507.xlsm (18.7 Kb)


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеMexo, привет
такой вот нашелся примерчик, попробуйте

Автор - nilem
Дата добавления - 04.12.2017 в 09:41
Mexo Дата: Понедельник, 04.12.2017, 21:13 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
упрощения чего?

Что бы мне проще было показать пример всех возможных комб.
где файл с этими элементами

Мне хотелось бы чтобы эти комбинации генерировались в массиве vba, на лист выводить их не обязательно, файл не нужен имхо.
по сколько их нужно размещать?

По сколько элементов размещать, хотелось бы заказывать в параметрах этой функции(процедуры) при ее вызове.
Вообще все гораздо сложнее, а это как бы первый шаг на пути решения задачи.
nilem, Спасибо! Попробую разобраться.
 
Ответить
Сообщение
упрощения чего?

Что бы мне проще было показать пример всех возможных комб.
где файл с этими элементами

Мне хотелось бы чтобы эти комбинации генерировались в массиве vba, на лист выводить их не обязательно, файл не нужен имхо.
по сколько их нужно размещать?

По сколько элементов размещать, хотелось бы заказывать в параметрах этой функции(процедуры) при ее вызове.
Вообще все гораздо сложнее, а это как бы первый шаг на пути решения задачи.
nilem, Спасибо! Попробую разобраться.

Автор - Mexo
Дата добавления - 04.12.2017 в 21:13
Mexo Дата: Понедельник, 04.12.2017, 23:22 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
nilem, спасибо, пример генерирует как надо, только долго думает когда выбираю максимальное для моей задачи число элементов (9) и максимальное число размещений (8). Есть ли какой нибудь способ ускорить эту генерацию? Может быть как то сделать цикл на каждый элемент или еще как нибудь...?
 
Ответить
Сообщениеnilem, спасибо, пример генерирует как надо, только долго думает когда выбираю максимальное для моей задачи число элементов (9) и максимальное число размещений (8). Есть ли какой нибудь способ ускорить эту генерацию? Может быть как то сделать цикл на каждый элемент или еще как нибудь...?

Автор - Mexo
Дата добавления - 04.12.2017 в 23:22
Mexo Дата: Вторник, 05.12.2017, 08:16 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
только долго думает

Понял, это из-за нехватки ячеек.
Еще пришел к выводу что мне будет достаточно перестановок без размещения по количеству элементов.
Остановился на таком варианте:

Подскажите как поправить код, чтобы комбинации выводились не на лист а в vba массив?
К сообщению приложен файл: MyGen.xlsm (17.1 Kb)


Сообщение отредактировал Mexo - Вторник, 05.12.2017, 08:19
 
Ответить
Сообщение
только долго думает

Понял, это из-за нехватки ячеек.
Еще пришел к выводу что мне будет достаточно перестановок без размещения по количеству элементов.
Остановился на таком варианте:

Подскажите как поправить код, чтобы комбинации выводились не на лист а в vba массив?

Автор - Mexo
Дата добавления - 05.12.2017 в 08:16
nilem Дата: Вторник, 05.12.2017, 09:12 | Сообщение № 7
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
"Понял, это из-за нехватки ячеек." :)
Ячеек там более 1 млн (и это только в одном столбце!). Просто Integer замените на Long
Вот с массивом, который выводится на лист


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение"Понял, это из-за нехватки ячеек." :)
Ячеек там более 1 млн (и это только в одном столбце!). Просто Integer замените на Long
Вот с массивом, который выводится на лист

Автор - nilem
Дата добавления - 05.12.2017 в 09:12
MCH Дата: Вторник, 05.12.2017, 14:39 | Сообщение № 8
Группа: Админы
Ранг: Старожил
Сообщений: 2002
Репутация: 751 ±
Замечаний: ±

Есть несколько вопросов:
1. Какова конечная цель?
2. Нужны размещения или достаточно только перестановок?
Если нужны размещения, то обязательно ли их генерировать в лексикографическом порядке?
Можно использовать двойной подход: генерируем сочетания и для каждого сочетания генерируем перестановки, но не получится лексикографического порядка
3. обязательно ли работать со строковыми переменными или можно работать с числами в массиве?
 
Ответить
СообщениеЕсть несколько вопросов:
1. Какова конечная цель?
2. Нужны размещения или достаточно только перестановок?
Если нужны размещения, то обязательно ли их генерировать в лексикографическом порядке?
Можно использовать двойной подход: генерируем сочетания и для каждого сочетания генерируем перестановки, но не получится лексикографического порядка
3. обязательно ли работать со строковыми переменными или можно работать с числами в массиве?

Автор - MCH
Дата добавления - 05.12.2017 в 14:39
MCH Дата: Вторник, 05.12.2017, 16:59 | Сообщение № 9
Группа: Админы
Ранг: Старожил
Сообщений: 2002
Репутация: 751 ±
Замечаний: ±

вариант генератора размещений с массивом чисел выгружаемых на лист
UPD: сделал два варианта
К сообщению приложен файл: NextSet.xlsm (20.5 Kb)
 
Ответить
Сообщениевариант генератора размещений с массивом чисел выгружаемых на лист
UPD: сделал два варианта

Автор - MCH
Дата добавления - 05.12.2017 в 16:59
Mexo Дата: Вторник, 05.12.2017, 23:25 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
1. Какова конечная цель?
2. Нужны размещения или достаточно только перестановок?
Если нужны размещения, то обязательно ли их генерировать в лексикографическом порядке?
Можно использовать двойной подход: генерируем сочетания и для каждого сочетания генерируем перестановки, но не получится лексикографического порядка
3. обязательно ли работать со строковыми переменными или можно работать с числами в массиве?

1.Сделать функцию, генерирующую комбинации из слагаемых выражений:
т.е. чтобы не записывать все варианты в формуле а подставить функцию со ссылкой на ячейки с числами (элементы перестановок).
В формуле F6*(D8/(D4-D6))*(D5/(D4-D6-D8)) - это одна (из 72) комбинация состоящая из 3х элементов (между элементами знак умножения). Вычитаемое второго элемента зависит от первого элемента (D6), а вычитаемые 3го элемента зависят от 1 и 2 элементов (D6 и D8).
2.Достаточно перестановок и лексикографический порядок не обязателен.
3.Как написал выше функция нужна для работы с числами.


Сообщение отредактировал Mexo - Среда, 06.12.2017, 02:17
 
Ответить
Сообщение
1. Какова конечная цель?
2. Нужны размещения или достаточно только перестановок?
Если нужны размещения, то обязательно ли их генерировать в лексикографическом порядке?
Можно использовать двойной подход: генерируем сочетания и для каждого сочетания генерируем перестановки, но не получится лексикографического порядка
3. обязательно ли работать со строковыми переменными или можно работать с числами в массиве?

1.Сделать функцию, генерирующую комбинации из слагаемых выражений:
т.е. чтобы не записывать все варианты в формуле а подставить функцию со ссылкой на ячейки с числами (элементы перестановок).
В формуле F6*(D8/(D4-D6))*(D5/(D4-D6-D8)) - это одна (из 72) комбинация состоящая из 3х элементов (между элементами знак умножения). Вычитаемое второго элемента зависит от первого элемента (D6), а вычитаемые 3го элемента зависят от 1 и 2 элементов (D6 и D8).
2.Достаточно перестановок и лексикографический порядок не обязателен.
3.Как написал выше функция нужна для работы с числами.

Автор - Mexo
Дата добавления - 05.12.2017 в 23:25
Mexo Дата: Среда, 06.12.2017, 14:44 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Или все таки нужны размещения (не перестановки), всех запутал и себя, простите!
И еще нужно чтобы один элемент находился на последней позиции как в этой формуле D5.


Сообщение отредактировал Mexo - Среда, 06.12.2017, 14:54
 
Ответить
СообщениеИли все таки нужны размещения (не перестановки), всех запутал и себя, простите!
И еще нужно чтобы один элемент находился на последней позиции как в этой формуле D5.

Автор - Mexo
Дата добавления - 06.12.2017 в 14:44
MCH Дата: Среда, 06.12.2017, 14:52 | Сообщение № 12
Группа: Админы
Ранг: Старожил
Сообщений: 2002
Репутация: 751 ±
Замечаний: ±

Или все таки нужны размещения

см. сообщение № 9, там два варианта реализации.
Сделаны функции по генерации следующего сочетания, следующей перестановки и следующего размещения из исходного массива
Можно не генерировать весь массив для выгрузки на лист, а последовательно перебирать все размещения (или перестановки или сочетания).
Реализовано без рекурсий, поэтому не нужно использовать глобальные переменные.
 
Ответить
Сообщение
Или все таки нужны размещения

см. сообщение № 9, там два варианта реализации.
Сделаны функции по генерации следующего сочетания, следующей перестановки и следующего размещения из исходного массива
Можно не генерировать весь массив для выгрузки на лист, а последовательно перебирать все размещения (или перестановки или сочетания).
Реализовано без рекурсий, поэтому не нужно использовать глобальные переменные.

Автор - MCH
Дата добавления - 06.12.2017 в 14:52
Mexo Дата: Четверг, 07.12.2017, 10:42 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Спасибо! Как теперь мне сконструировать код в примере (модуль2) на "Лист2" чтобы вместо цифр были значения ячеек из диапазона "elements"? И как еще можно добавить параметр "элемент на последней позиции"?
Например в ячейку "last pos" ввожу цифру, которая соответствует порядковому номеру ячейки из диапазона "elements" допустим 3. И сгенерируются только те комбинации, где значение из ячейки L12 будет на последней позиции.
К сообщению приложен файл: 8558309.xlsm (27.2 Kb)


Сообщение отредактировал Mexo - Четверг, 07.12.2017, 10:44
 
Ответить
СообщениеСпасибо! Как теперь мне сконструировать код в примере (модуль2) на "Лист2" чтобы вместо цифр были значения ячеек из диапазона "elements"? И как еще можно добавить параметр "элемент на последней позиции"?
Например в ячейку "last pos" ввожу цифру, которая соответствует порядковому номеру ячейки из диапазона "elements" допустим 3. И сгенерируются только те комбинации, где значение из ячейки L12 будет на последней позиции.

Автор - Mexo
Дата добавления - 07.12.2017 в 10:42
MCH Дата: Понедельник, 11.12.2017, 13:20 | Сообщение № 14
Группа: Админы
Ранг: Старожил
Сообщений: 2002
Репутация: 751 ±
Замечаний: ±

Вариант во вложении
К сообщению приложен файл: 1745860.xlsm (32.1 Kb)
 
Ответить
СообщениеВариант во вложении

Автор - MCH
Дата добавления - 11.12.2017 в 13:20
Mexo Дата: Вторник, 12.12.2017, 12:02 | Сообщение № 15
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Спасибо!
 
Ответить
СообщениеСпасибо!

Автор - Mexo
Дата добавления - 12.12.2017 в 12:02
Mexo Дата: Четверг, 14.12.2017, 05:18 | Сообщение № 16
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Помогите разобраться.
[vba]
Код
ReDim el(1 To n - (lp > 0)) As Long
[/vba]
При n=4; lp=3. Почему получается массив el (1 to 5)? Ведь по моей логике должен быть el(1 to (4-3=1)).
 
Ответить
СообщениеПомогите разобраться.
[vba]
Код
ReDim el(1 To n - (lp > 0)) As Long
[/vba]
При n=4; lp=3. Почему получается массив el (1 to 5)? Ведь по моей логике должен быть el(1 to (4-3=1)).

Автор - Mexo
Дата добавления - 14.12.2017 в 05:18
RAN Дата: Четверг, 14.12.2017, 06:34 | Сообщение № 17
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
При lp=3
(3 > o) = -1
4 - (-1) = ?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПри lp=3
(3 > o) = -1
4 - (-1) = ?

Автор - RAN
Дата добавления - 14.12.2017 в 06:34
Mexo Дата: Четверг, 14.12.2017, 09:43 | Сообщение № 18
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Ну да получается 5, а почему (3>0)= -1? Как я понял от n отнимаем lp при условии если lp>0.
 
Ответить
СообщениеНу да получается 5, а почему (3>0)= -1? Как я понял от n отнимаем lp при условии если lp>0.

Автор - Mexo
Дата добавления - 14.12.2017 в 09:43
Mexo Дата: Четверг, 14.12.2017, 09:47 | Сообщение № 19
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Еще вопрос как сложить все элементы массива? В примере записал так:
[vba]
Код
mainSetLostPos = WorksheetFunction.Sum(rplace)
[/vba]
но возвращает 0
К сообщению приложен файл: 7551409.xlsm (24.0 Kb)
 
Ответить
СообщениеЕще вопрос как сложить все элементы массива? В примере записал так:
[vba]
Код
mainSetLostPos = WorksheetFunction.Sum(rplace)
[/vba]
но возвращает 0

Автор - Mexo
Дата добавления - 14.12.2017 в 09:47
Mexo Дата: Четверг, 14.12.2017, 09:53 | Сообщение № 20
Группа: Пользователи
Ранг: Участник
Сообщений: 60
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Второй вопрос снят, несоответствие типов данных было.
 
Ответить
СообщениеВторой вопрос снят, несоответствие типов данных было.

Автор - Mexo
Дата добавления - 14.12.2017 в 09:53
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сгенерировать размещения без повторений (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!