Поиск нескольких комбинаций сумм в Excel - PullRequest
0 голосов
/ 05 ноября 2018

Я пытался что-то сделать в Excel, чтобы найти несколько комбинаций сумм.

У меня есть список чисел, которые нужно сложить вместе, чтобы они находились в пределах 500-510 или 450-460.

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

Я попробовал надстройку Solver и некоторые другие советы, которые я нашел на этом сайте, но не смог найти что-то, что дает несколько ответов.

Кто-нибудь знает, будет ли это возможно?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Я бы разбил это на 2 задачи. Сначала было бы просто сгенерировать все пары индексов для проверки во входном массиве. Это относительно просто с рекурсивной процедурой. Этот использует приватный Type для хранения пар, но он может быть адаптирован для использования другого метода хранения пар:

Private Type Tuple
    ValueOne As Long
    ValueTwo As Long
End Type

Private Sub FindCombinations(elements As Long, ByRef results() As Tuple, _
                             Optional ByVal iteration As Long = 0)
    If iteration = 0 Then ReDim results(0)
    Dim idx As Long
    For idx = iteration To elements - 1
        Dim combo As Tuple
        With combo
            .ValueOne = iteration
            .ValueTwo = idx
        End With
        results(UBound(results)) = combo
        If iteration <> elements And idx <> elements Then
            ReDim Preserve results(UBound(results) + 1)
        End If
    Next

    If iteration < elements Then FindCombinations elements, results, iteration + 1
End Sub

Затем вы используете процедуру «точки входа», чтобы сгенерировать комбинации индексов, использовать их для индексации в исходном массиве и применить критерии выбора:

Private Sub FindMatchingSets(testSet() As Long)
    Dim indices() As Tuple
    FindCombinations UBound(testSet) + 1, indices

    Dim idx As Long, results() As Tuple

    For idx = LBound(indices) To UBound(indices)
        Dim tupleSum As Long
        tupleSum = testSet(indices(idx).ValueOne) + testSet(indices(idx).ValueTwo)
        If indices(idx).ValueOne <> indices(idx).ValueTwo And _
           ((tupleSum >= 500 And tupleSum <= 510) Or _
           (tupleSum >= 450 And tupleSum <= 460)) Then
            Debug.Print testSet(indices(idx).ValueOne) & " + " & _
                testSet(indices(idx).ValueTwo) & " = " & tupleSum
        End If
    Next
End Sub

Не ясно, что вы намереваетесь сделать с результатами, поэтому это просто выводит рассчитанные значения в Immediate Window. Пример кода вызова:

Private Sub Example()
    Dim test(4) As Long
    test(0) = 100
    test(1) = 200
    test(2) = 250
    test(3) = 260
    test(4) = 400

    FindMatchingSets test
End Sub
0 голосов
/ 05 ноября 2018

Я думаю, что ваш вопрос должен быть немного яснее с точки зрения ожидаемого результата (хотите ли вы получить список комбинаций или просто посмотреть результаты?), Но вот мое решение.

combination of sums - potential solution

Я поместил список из 20 чисел в столбец Y и назначил им все буквы (от a до t) в столбце X

Затем я построил матрицу комбинаций от a до t и ввел следующую формулу (ниже для ячейки C3, но ее можно скопировать и вставить во все части матрицы)

=IF(C$2=$B3,"x",VLOOKUP(C$2,$X:$Y,2,FALSE)+VLOOKUP($B3,$X:$Y,2,FALSE))

Затем я использовал условное форматирование, чтобы установить цвет ячеек, если они соответствуют вашим критериям для суммы - вы можете сделать это, выделив все суммы (ячейка C3: V22) и перейдя к

home / условное форматирование / новое правило ...

выбирает тип правила форматирует только те ячейки, которые содержат

и затем в выпадающем меню выбор Значение ячейки / Между / Ваш верхний диапазон

и затем выбор формата (обычно цвет фона заливки)

Сделайте это один раз для "высокой" суммы и один раз для "низкой" суммы. Вы можете сделать цвета одинаковыми или разными, в зависимости от того, что вы хотите увидеть.

Я также для справки включил ссылку на то, что число находится в строке 1 и столбце A. Формула для строки 1 (пример для C1, но ее можно скопировать через)

=VLOOKUP(C2,$X:$Y,2,FALSE)

И формула для столбца A (пример для A3) =VLOOKUP(B3,$X:$Y,2,FALSE)

Преимущество этого подхода состоит в том, что все в Excel (код не требуется), но недостатком является то, что трудно получить список результатов. Вы могли бы использовать другую формулу, чтобы просто вернуть сумму (например, вернуть текст "205 + 298"), когда она удовлетворяет одному из условий, но тогда все равно будет трудно вывести ее из матричного формата и в единый список. Гораздо проще, используя VBA

0 голосов
/ 05 ноября 2018

Может изменить его в соответствии с вашими потребностями и попробовать

Sub test()
Dim X, Y, TRw, GotNum, First, Second As Long
TRw = 1
With ThisWorkbook.ActiveSheet
For X = 1 To 100                   ' assumed col A1 to A100 is the list
GotNum = .Cells(X, 1).Value
    If (GotNum >= 450 And GotNum <= 460) Or (GotNum >= 500 And GotNum <= 510) Then
    .Cells(X, 1).Font.Color = RGB(255, 0, 0)
    First = GotNum
        For Y = X + 1 To 100
        GotNum = .Cells(Y, 1).Value
            If (GotNum >= 450 And GotNum <= 460) Or (GotNum >= 500 And GotNum <= 510) Then
            Second = GotNum
            TRw = TRw + 1
            .Cells(TRw, 3).Value = First     ' write 1st Number in Col C
            .Cells(TRw, 4).Value = Second    ' write 2nd Number in Col D
            .Cells(TRw, 5).Value = First + Second   ' write Sum of 1st & 2nd in Col C
            End If
        Next Y
    End If
Next X
End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...