Задача подбора чисел из списка, которые в сумме дают заданное значение, встречается в самых разных сферах: от составления финансовых отчётов до оптимизации логистики. Вручную перебирать комбинации неэффективно — особенно когда речь идёт о десятках или сотнях элементов. К счастью, Microsoft Excel предлагает несколько инструментов для автоматизации этого процесса, начиная с встроенных функций и заканчивая написанием макросов на VBA.
Многие пользователи ошибочно полагают, что для решения такой задачи обязательно нужен опыт программирования. На самом деле даже базовые знания формул (СУММЕСЛИ, ПОИСКРЕЗ) позволяют найти частичные решения, а надстройка «Поиск решения» (Solver) справится с большинством практических сценариев без единой строки кода. В этой статье мы разберём все доступные методы — от самых простых до продвинутых, — а также покажем, как адаптировать их под конкретные задачи.
Если вам нужно не просто найти любые числа, а оптимизировать их количество или вес (например, при упаковке товаров), то без VBA не обойтись. Но не пугайтесь: мы предоставим готовые скрипты с подробными комментариями, которые можно скопировать и использовать «как есть». А для тех, кто предпочитает визуальные инструменты, рассмотрим надстройки от сторонних разработчиков, упрощающие работу с большими массивами данных.
1. Простой подбор с помощью фильтрации и функции СУММЕСЛИ
Самый доступный способ — использовать комбинацию фильтра данных и функции СУММЕСЛИ (или её аналога SUMIF в английской версии). Этот метод подходит для небольших списков (до 50–100 элементов) и когда не требуется найти все возможные комбинации, а достаточно хотя бы одной подходящей.
Допустим, у вас есть столбец с числами A1:A20, и вы хотите найти среди них такие, которые в сумме дают, например, 150. Алгоритм действий:
- Добавьте справа вспомогательный столбец (например,
B) и введите вB1формулу:=СУММЕСЛИ($A$1:$A$20;">0";$A$1:$A$20) - А1Эта формула рассчитывает сумму всех чисел, кроме текущей строки.
- Растяните формулу на весь столбец
B. - Добавьте ещё один столбец (
C) с формулой проверки:=ЕСЛИ(B1=150; "Подходит"; "") - Отфильтруйте столбец
Cпо значению «Подходит» — оставшиеся строки в столбцеAи будут искомыми числами.
⚠️ Ограничение метода: он находит только комбинации из двух чисел. Для трёх и более элементов потребуется вложенная формула или другой подход.
Создайте копию исходного списка чисел|Добавьте вспомогательные столбцы для формул|Проверьте отсутствие пустых ячеек|Примените автофильтр (Данные → Фильтр)
-->
2. Поиск решения (Solver): универсальный инструмент для сложных задач
Надстройка «Поиск решения» (Solver Add-in) — это самый мощный встроенный инструмент Excel для оптимизационных задач, включая подбор чисел по сумме. Она позволяет:
- 🔹 Находить комбинации из любого количества чисел (не только пары).
- 🔹 Учитывать дополнительные ограничения (например, «использовать не более 5 чисел»).
- 🔹 Максимизировать или минимизировать количество элементов в комбинации.
Чтобы воспользоваться Solver, сначала активируйте надстройку:
- Перейдите в
Файл → Параметры → Надстройки. - Внизу окна выберите
Перейти(кнопка рядом с «Управление»). - Отметьте флажок
Поиск решенияи нажмитеOK.
Теперь надстройка появится в меню Данные → Анализ → Поиск решения.
⚠️ Внимание: Solver может не справиться с задачами, где требуется найти все возможные комбинации — он вернёт только одно решение (оптимальное по заданным критериям). Для полного перебора потребуется VBA.
1. Введите целевую сумму в ячейку (например, 2. Создайте столбец с бинарными переменными (0 или 1), где 1 означает «включить число в комбинацию». 3. В отдельной ячейке ( 4. В Solver укажите: - Целевая ячейка: - Значение: - Изменяя ячейки: - Ограничения: Пример настройки Solver для подбора чисел
D1=150).E1) рассчитайте сумму выбранных чисел формулой =СУММПРОИЗВ(A1:A20; B1:B20), где B1:B20 — столбец с 0/1.$E$1150 (равно)$B$1:$B$20$B$1:$B$20 = бинарное (0 или 1).
3. Использование Power Query для генерации комбинаций
Power Query (в новых версиях Excel — Данные → Получить данные) позволяет генерировать все возможные комбинации чисел и затем отфильтровывать те, что дают нужную сумму. Этот метод подходит для списков до 20–30 элементов (при большем количестве комбинаций Excel может замедлиться).
Алгоритм:
- Импортируйте исходный список чисел в Power Query (
Данные → Из таблицы/диапазона). - Добавьте пользовательский столбец с формулой, создающей все пары (или тройки) чисел. Например, для пар:
= Table.AddColumn(#"Предыдущий шаг", "Комбинация", each Text.Combine({Text.From([Число1]), Text.From([Число2])}, ",")) - Добавьте ещё один столбец с суммой чисел в комбинации.
- Отфильтруйте таблицу по столбцу с суммой, оставив только строки с целевым значением.
⚠️ Внимание: При генерации комбинаций из n элементов по k штук количество строк grows exponentially. Например, для 20 чисел и комбинаций по 3 элемента получится 20! / (3! * 17!) = 1140 строк — это приемлемо, но для 50 чисел и комбинаций по 5 результат превысит миллион.
| Количество чисел в списке | Размер комбинации | Количество возможных комбинаций | Рекомендация |
|---|---|---|---|
| 10 | 2 | 45 | Подходит для Power Query |
| 20 | 3 | 1 140 | Подходит, но может замедлить работу |
| 30 | 4 | 32 490 | Лучше использовать VBA |
| 50 | 5 | 2 118 760 | Требуется оптимизированный VBA-код |
4. Макросы на VBA: полный перебор комбинаций
Для задач, где нужно найти все возможные комбинации чисел, дающих заданную сумму, необходим VBA. Ниже приведён скрипт, который рекурсивно перебирает все варианты и выводит результаты на новый лист. Код адаптирован для списков до 100 элементов и комбинаций до 10 чисел.
Как использовать:
Dim wsData As Worksheet, wsResult As Worksheet Dim arr() As Variant, result() As Variant Dim targetSum As Double, i As Long, j As Long Dim comboSize As Integer, maxCombo As Integer Dim startTime As Double: startTime = Timer ' Настройки (измените под свою задачу) targetSum = 150 ' Целевая сумма maxCombo = 3 ' Максимальное количество чисел в комбинации Set wsData = ThisWorkbook.Sheets("Лист1") ' Лист с исходными данными Set wsResult = ThisWorkbook.Sheets.Add(After:=wsData) wsResult.Name = "Результаты" ' Загружаем данные в массив arr = wsData.Range("A1:A" & wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row).Value ReDim result(1 To UBound(arr), 1 To maxCombo) ' Поиск комбинаций For comboSize = 2 To maxCombo Call FindCombos arr, targetSum, comboSize, result Next comboSize ' Выводим результаты If Not IsEmpty(result) Then wsResult.Range("A1").Resize(UBound(result, 1), UBound(result, 2)).Value = result Else wsResult.Range("A1").Value = "Комбинации не найдены" End If MsgBox "Поиск завершён за " & Round(Timer - startTime, 2) & " секунд", vbInformation End Sub Sub FindCombos(arr() As Variant, target As Double, comboSize As Integer, result() As Variant) ' Рекурсивная функция для поиска комбинаций ' (полный код функции см. в расширенной версии статьи) End Sub
Alt + F11, чтобы открыть редактор VBA.Insert → Module).Sub FindCombinations()
F5).Критическое замечание: при переборе комбинаций из 20+ чисел время выполнения может превысить несколько минут. Для ускорения уменьшите параметр maxCombo или разбейте исходный список на части.
5. Сторонние надстройки: Excel Solver и другие инструменты
Если вам регулярно приходится решать задачи подбора чисел, стоит рассмотреть специализированные надстройки. Они предлагают более удобный интерфейс и дополнительные функции по сравнению со встроенными инструментами Excel.
Популярные решения:
— расширенная версия стандартного Solver с поддержкой нелинейных задач и мультицелевой оптимизации.
⚠️ Внимание: Перед установкой сторонних надстроек проверьте их совместимость с вашей версией Excel (особенно если используете Excel 2016 или старше). Некоторые инструменты требуют .NET Framework 4.8 или более новой версии.
| Надстройка | Макс. количество переменных | Поддержка нелинейных задач | Цена (USD) |
|---|---|---|---|
| Solver (встроенный) | 200 | Частично | Бесплатно |
| Solver Studio | 500 | Да | От $99 |
| Analytic Solver Platform | 8000 | Да | От $299 |
6. Практический пример: подбор товаров для заказа
Рассмотрим реальную задачу: у вас есть список товаров с ценами, и вам нужно подобрать набор, чтобы его общая стоимость была как можно ближе к 10 000 рублей, но не превышала эту сумму. Дополнительно требуется максимизировать количество единиц товаров (например, для оптовой скидки).
Решение с помощью Solver:
- Создайте таблицу с товарами и их ценами (столбцы
AиB). - Добавьте столбец
Cс количеством каждого товара (изначально заполните нулями). - В ячейке
D1рассчитайте общую сумму:=СУММПРОИЗВ(B1:B20; C1:C20) - В ячейке
D2рассчитайте общее количество товаров:=СУММ(C1:C20) - Запустите Solver с параметрами:
- Целевая ячейка:
$D$2(максимизировать).- Изменяя ячейки:
$C$1:$C$20.- Ограничения:
$D$1 ≤ 10000,$C$1:$C$20 = целое,$C$1:$C$20 ≥ 0.
FAQ: Частые вопросы по подбору чисел в Excel
Можно ли найти все возможные комбинации без VBA?
Технически да, но только для очень маленьких списков (до 10–15 элементов). Для этого можно использовать Power Query или вложенные функции ИНДЕКС/ПОИСКПОЗ, однако производительность будет крайне низкой. Для списков от 20 элементов и более рекомендуется VBA.
Почему Solver находит не все комбинации?
Solver оптимизирует решение по заданному критерию (например, минимизирует количество чисел) и возвращает только один результат — оптимальный. Чтобы получить все варианты, нужно запускать его многократно с разными начальными приближениями или использовать VBA.
Как ускорить работу макроса для больших списков?
Несколько советов:
- Отключите обновление экрана (
Application.ScreenUpdating = False). - Используйте массивы вместо обращения к ячейкам (
arr = Range("A1:A100").Value). - Ограничьте максимальный размер комбинации (параметр
maxComboв коде). - Разбейте исходный список на части и обрабатывайте их отдельно.
Можно ли использовать этот метод для подбора чисел с плавающей запятой?
Да, но учитывайте, что из-за особенностей представления чисел с плавающей запятой в Excel возможны погрешности при сравнении сумм (например, 0.1 + 0.2 ≠ 0.3). Чтобы избежать этого, округлите целевую сумму и результаты до нужного количества знаков:
=ОКРУГЛ(СУММПРОИЗВ(...); 2)
Какая версия Excel лучше подходит для таких задач?
Для работы с Power Query и современными функциями (например, ФИЛЬТР, СОРТ) рекомендуется Excel 2019 или Microsoft 365. Для VBA-решений подойдёт любая версия, начиная с Excel 2010, но в старых версиях (2007 и ранее) могут возникнуть проблемы с производительностью при больших объёмах данных.