1

У меня есть лист Excel, в котором есть список заказов на поставку со значением дела, связанным с каждым заказом на поставку. например:

3156922129  10
756941986   13
1356902364  15
3156892373  15
9156912182  17
3756902389  22

У меня нет полного списка, но у него 42 экземпляра приведенного выше примера.

Теперь нам нужно вручную посмотреть количество заказа на поставку и получить комбинации, которые в сумме составляют 75 пунктов. Это количество ящиков, которые мы можем разместить на поддоне. В конце мы получаем 26 скидов с ПО, которые равны или приближаются к цели в 75 пк. Есть ли способ взять этот список и сделать так, чтобы Excel дал вам то, что PO будет равно или приблизиться к желаемой 75 голам?

1 ответ1

1

С вашими опубликованными данными в столбцах A и B, запустив этот короткий макрос:

Sub kombo()
    Dim N As Long, i As Long, nBits As Long
    Dim s As String, j As Long, zum As Long

    nBits = 6
    N = 2 ^ nBits - 1

    For i = 1 To N
        s = Application.WorksheetFunction.Dec2Bin(i, nBits)
        For j = 1 To nBits
            Cells(j, 3) = Mid(s, j, 1)
        Next j
        zum = Evaluate("SUMPRODUCT((B1:B6)*(C1:C6))")
        If zum = 75 Then Exit Sub
    Next i

End Sub

будет считать в двоичном коде от 1 до 63, записывая шаблоны 0 и 1 в столбец C. Каждый шаблон представляет собой поднабор заказов на покупку. Каждый поднабор суммируется. Когда сумма достигает 75, программа останавливается.

Это демонстрационный код, написанный только для 6 предметов. Чтобы обработать 42 элемента, код должен быть модифицирован, чтобы генерировать больший 42-битный набор шаблонов и намного большие переменные цикла.

EDIT # 1:

Я обновил код, но только протестировал его с 12 пунктами. Код становится ОЧЕНЬ медленным, когда элементы добавляются (если вам не повезло). Код использует функцию, опубликованную Риком Ротштейном здесь:

MrExcel Post

Sub kombo_2()
    Dim n As Double, i As Double, nBits As Long
    Dim s As String, j As Long, zum As Long

    nBits = 12
    n = 2 ^ nBits - 1
    Range("C:C").ClearContents
    Application.ScreenUpdating = False
    For i = 1 To n
        s = DecToBin(i, nBits)
        For j = 1 To nBits
            Cells(j, 3) = Mid(s, nBits - j + 1, 1)
        Next j
        zum = Evaluate("SUMPRODUCT((B1:B100)*(C1:C100))")
        If zum = 75 Then Exit For
    Next i
    Application.ScreenUpdating = True
End Sub

'
' https://www.mrexcel.com/forum/excel-questions/578667-use-dec2bin-function-visual-basic-applications-edit-macro.html
'
 'The DecimalIn argument is limited to 79228162514264337593543950245
' (approximately 96-bits) - large numerical values must be entered
' as a String value to prevent conversion to scientific notation. Then
' optional NumberOfBits allows you to zero-fill the front of smaller
' values in order to return values up to a desired bit level.

Function DecToBin(ByVal DecimalIn As Variant, Optional NumberOfBits As Variant) As String
  DecToBin = ""
  DecimalIn = CDec(DecimalIn)
  Do While DecimalIn <> 0
    DecToBin = Trim$(Str$(DecimalIn - 2 * Int(DecimalIn / 2))) & DecToBin
    DecimalIn = Int(DecimalIn / 2)
  Loop
  If Not IsMissing(NumberOfBits) Then
    If Len(DecToBin) > NumberOfBits Then
      DecToBin = "Error - Number too large for bit size"
    Else
      DecToBin = Right$(String$(NumberOfBits, "0") & DecToBin, NumberOfBits)
    End If
  End If
End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .