Как подобрать из ряда чисел в Excel нужную сумму: от простых формул до VBA

Задача подбора чисел из списка, которые в сумме дают заданное значение, встречается в самых разных сферах: от составления финансовых отчётов до оптимизации логистики. Вручную перебирать комбинации неэффективно — особенно когда речь идёт о десятках или сотнях элементов. К счастью, Microsoft Excel предлагает несколько инструментов для автоматизации этого процесса, начиная с встроенных функций и заканчивая написанием макросов на VBA.

Многие пользователи ошибочно полагают, что для решения такой задачи обязательно нужен опыт программирования. На самом деле даже базовые знания формул (СУММЕСЛИ, ПОИСКРЕЗ) позволяют найти частичные решения, а надстройка «Поиск решения» (Solver) справится с большинством практических сценариев без единой строки кода. В этой статье мы разберём все доступные методы — от самых простых до продвинутых, — а также покажем, как адаптировать их под конкретные задачи.

Если вам нужно не просто найти любые числа, а оптимизировать их количество или вес (например, при упаковке товаров), то без VBA не обойтись. Но не пугайтесь: мы предоставим готовые скрипты с подробными комментариями, которые можно скопировать и использовать «как есть». А для тех, кто предпочитает визуальные инструменты, рассмотрим надстройки от сторонних разработчиков, упрощающие работу с большими массивами данных.

📊 Как часто вам приходится подбирать комбинации чисел в Excel?
Ежедневно
Несколько раз в неделю
Редко, но методы пригодятся
Никогда не сталкивался

1. Простой подбор с помощью фильтрации и функции СУММЕСЛИ

Самый доступный способ — использовать комбинацию фильтра данных и функции СУММЕСЛИ (или её аналога SUMIF в английской версии). Этот метод подходит для небольших списков (до 50–100 элементов) и когда не требуется найти все возможные комбинации, а достаточно хотя бы одной подходящей.

Допустим, у вас есть столбец с числами A1:A20, и вы хотите найти среди них такие, которые в сумме дают, например, 150. Алгоритм действий:

  1. Добавьте справа вспомогательный столбец (например, B) и введите в B1 формулу:
    =СУММЕСЛИ($A$1:$A$20;">0";$A$1:$A$20) - А1

    Эта формула рассчитывает сумму всех чисел, кроме текущей строки.

  2. Растяните формулу на весь столбец B.
  3. Добавьте ещё один столбец (C) с формулой проверки:
    =ЕСЛИ(B1=150; "Подходит"; "")
  4. Отфильтруйте столбец C по значению «Подходит» — оставшиеся строки в столбце A и будут искомыми числами.

⚠️ Ограничение метода: он находит только комбинации из двух чисел. Для трёх и более элементов потребуется вложенная формула или другой подход.

Создайте копию исходного списка чисел|Добавьте вспомогательные столбцы для формул|Проверьте отсутствие пустых ячеек|Примените автофильтр (Данные → Фильтр)

-->

2. Поиск решения (Solver): универсальный инструмент для сложных задач

Надстройка «Поиск решения» (Solver Add-in) — это самый мощный встроенный инструмент Excel для оптимизационных задач, включая подбор чисел по сумме. Она позволяет:

  • 🔹 Находить комбинации из любого количества чисел (не только пары).
  • 🔹 Учитывать дополнительные ограничения (например, «использовать не более 5 чисел»).
  • 🔹 Максимизировать или минимизировать количество элементов в комбинации.

Чтобы воспользоваться Solver, сначала активируйте надстройку:

  1. Перейдите в Файл → Параметры → Надстройки.
  2. Внизу окна выберите Перейти (кнопка рядом с «Управление»).
  3. Отметьте флажок Поиск решения и нажмите OK.

Теперь надстройка появится в меню Данные → Анализ → Поиск решения.

⚠️ Внимание: Solver может не справиться с задачами, где требуется найти все возможные комбинации — он вернёт только одно решение (оптимальное по заданным критериям). Для полного перебора потребуется VBA.

Пример настройки Solver для подбора чисел

1. Введите целевую сумму в ячейку (например, D1=150).

2. Создайте столбец с бинарными переменными (0 или 1), где 1 означает «включить число в комбинацию».

3. В отдельной ячейке (E1) рассчитайте сумму выбранных чисел формулой =СУММПРОИЗВ(A1:A20; B1:B20), где B1:B20 — столбец с 0/1.

4. В Solver укажите:

- Целевая ячейка: $E$1

- Значение: 150 (равно)

- Изменяя ячейки: $B$1:$B$20

- Ограничения: $B$1:$B$20 = бинарное (0 или 1).

3. Использование Power Query для генерации комбинаций

Power Query (в новых версиях ExcelДанные → Получить данные) позволяет генерировать все возможные комбинации чисел и затем отфильтровывать те, что дают нужную сумму. Этот метод подходит для списков до 20–30 элементов (при большем количестве комбинаций Excel может замедлиться).

Алгоритм:

  1. Импортируйте исходный список чисел в Power Query (Данные → Из таблицы/диапазона).
  2. Добавьте пользовательский столбец с формулой, создающей все пары (или тройки) чисел. Например, для пар:
    = Table.AddColumn(#"Предыдущий шаг", "Комбинация", each Text.Combine({Text.From([Число1]), Text.From([Число2])}, ","))
  3. Добавьте ещё один столбец с суммой чисел в комбинации.
  4. Отфильтруйте таблицу по столбцу с суммой, оставив только строки с целевым значением.

⚠️ Внимание: При генерации комбинаций из 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 чисел.

Как использовать:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. Вставьте новый модуль (Insert → Module).
  3. Скопируйте туда следующий код:
    Sub FindCombinations()
    

    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

  4. Запустите макрос на выполнение (F5).

Критическое замечание: при переборе комбинаций из 20+ чисел время выполнения может превысить несколько минут. Для ускорения уменьшите параметр maxCombo или разбейте исходный список на части.

5. Сторонние надстройки: Excel Solver и другие инструменты

Если вам регулярно приходится решать задачи подбора чисел, стоит рассмотреть специализированные надстройки. Они предлагают более удобный интерфейс и дополнительные функции по сравнению со встроенными инструментами Excel.

Популярные решения:

  • 📊 Solver Studio — расширенная версия стандартного Solver с поддержкой нелинейных задач и мультицелевой оптимизации.
  • 🔢 Excel What-If Analysis ToolPak — пакет инструментов для анализа «что-если», включающий усовершенствованный Solver.
  • 🧮 Analytic Solver Platform — платная надстройка для сложных оптимизационных задач (поддерживает до 8000 переменных).

⚠️ Внимание: Перед установкой сторонних надстроек проверьте их совместимость с вашей версией Excel (особенно если используете Excel 2016 или старше). Некоторые инструменты требуют .NET Framework 4.8 или более новой версии.

Надстройка Макс. количество переменных Поддержка нелинейных задач Цена (USD)
Solver (встроенный) 200 Частично Бесплатно
Solver Studio 500 Да От $99
Analytic Solver Platform 8000 Да От $299

6. Практический пример: подбор товаров для заказа

Рассмотрим реальную задачу: у вас есть список товаров с ценами, и вам нужно подобрать набор, чтобы его общая стоимость была как можно ближе к 10 000 рублей, но не превышала эту сумму. Дополнительно требуется максимизировать количество единиц товаров (например, для оптовой скидки).

Решение с помощью Solver:

  1. Создайте таблицу с товарами и их ценами (столбцы A и B).
  2. Добавьте столбец C с количеством каждого товара (изначально заполните нулями).
  3. В ячейке D1 рассчитайте общую сумму:
    =СУММПРОИЗВ(B1:B20; C1:C20)
  4. В ячейке D2 рассчитайте общее количество товаров:
    =СУММ(C1:C20)
  5. Запустите 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 и ранее) могут возникнуть проблемы с производительностью при больших объёмах данных.