ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 618|回复: 12

[求助] 产品零件规划入箱问题,大神帮看下vba需要如何修改?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-3 08:54 | 显示全部楼层 |阅读模式
本帖最后由 韵雪中庸 于 2024-1-4 13:08 编辑

vba代码:
结果:在G列给出箱序,从1开始编号,一直编完,例如A1单位2箱,则如G3-G9,
约束条件:
1、单位之间不能混箱,每个单位都从第一箱开始编;
2、排在前面的零件尽量装在前面的箱子;
3、每个箱子所装零件不能超过30单位体积,即每一箱的E列求和小于等于30;

4、每个单位的箱子数用两最少;
5、每个单位的同种零件只能装同一个箱子。

代码:
  1. Sub GenerateBoxSequence()

  2.         Dim ws As Worksheet

  3.         Dim lastRow As Long

  4.         Dim boxCount As Long

  5.         Dim currentBox As Long

  6.         Dim currentVolume As Double

  7.         Dim currentRow As Long



  8.         ' 设置工作表

  9.         Set ws = ThisWorkbook.Worksheets("Sheet1")



  10.         ' 获取最后一行

  11.         lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row



  12.         ' 初始化变量

  13.         boxCount = 0

  14.         currentBox = 1

  15.         currentVolume = 0



  16.         ' 遍历每一行

  17.         For currentRow = 2 To lastRow

  18.                 ' 获取当前行的考点名称和占用体积

  19.                 Dim pointName As String

  20.                 Dim volume As Double

  21.                 pointName = ws.Cells(currentRow, "B").Value

  22.                 volume = ws.Cells(currentRow, "E").Value



  23.                 ' 判断是否需要新的箱子

  24.                 If currentVolume + volume > 30 Then

  25.                         currentBox = currentBox + 1

  26.                         currentVolume = volume

  27.                 Else

  28.                         currentVolume = currentVolume + volume

  29.                 End If



  30.                 ' 将箱序序号写入G列

  31.                 ws.Cells(currentRow, "G").Value = currentBox

  32.         Next currentRow

  33. End Sub
复制代码
屏幕截图 2024-01-03 085306.png

排箱序vba求解.zip (19.39 KB, 下载次数: 12)

image.png

TA的精华主题

TA的得分主题

发表于 2024-1-3 14:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub tt()
  2.     Dim Arr, Drr, Brr() As Integer, x&, y&, i&, N&, H&, d As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Arr = Range("b3:e" & Cells(Rows.Count, 2).End(xlUp).Row).Value
  5.     ReDim Brr(1 To UBound(Arr))
  6.     For x = 1 To UBound(Arr)
  7.         d(Arr(x, 1)) = ""
  8.     Next x
  9.     Drr = d.keys
  10.     For i = 0 To UBound(Drr)
  11.         N = 0: H = 1
  12.         For x = 1 To UBound(Arr)
  13.             If Arr(x, 1) = Drr(i) And Brr(x) = 0 Then
  14.                 If N + Arr(x, 4) <= 30 Then
  15.                     Brr(x) = H: N = N + Arr(x, 4)
  16.                 Else
  17.                     For y = x + 1 To UBound(Arr)
  18.                         If N + Arr(y, 4) <= 30 Then Brr(y) = H: N = N + Arr(y, 4)
  19.                     Next y
  20.                     H = H + 1: N = 0
  21.                     Brr(x) = H: N = N + Arr(x, 4)
  22.                 End If
  23.             End If
  24.     Next x, i
  25.     Range("g3").Resize(UBound(Arr), 1) = WorksheetFunction.Transpose(Brr)
  26. End Sub
复制代码

排箱序vba求解.zip

22.59 KB, 下载次数: 7

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-4 09:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

首先谢谢大神,试跑了一下,成功率为75%,是不是因为单位名称那里获取的字符不够多的问题?,从而导致会误认为是一个单位,如何提高准确度?
偶尔会多一箱出来

屏幕截图 2024-01-04 081949.png

TA的精华主题

TA的得分主题

发表于 2024-1-4 09:56 | 显示全部楼层
韵雪中庸 发表于 2024-1-4 09:29
首先谢谢大神,试跑了一下,成功率为75%,是不是因为单位名称那里获取的字符不够多的问题?,从而导致会 ...

算法的问题。我的算法是不对的,随便写一下的,没有规划求解的
如果要按你的要求,尽量减少箱数,还要重新想想

TA的精华主题

TA的得分主题

发表于 2024-1-4 10:07 | 显示全部楼层
参与一下。。。

排箱序fs.rar

23.82 KB, 下载次数: 9

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-4 11:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
fjlhgs 发表于 2024-1-4 10:07
参与一下。。。

谢谢你,还是有多出一箱的问题存在。
比如A9单位,
第7箱的S零件和N零件可以分到第1箱,
第7箱的M零件可以分到第4箱,
从而6箱可以装完。
屏幕截图 2024-01-04 114858.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-4 12:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
titi012 发表于 2024-1-4 09:56
算法的问题。我的算法是不对的,随便写一下的,没有规划求解的
如果要按你的要求,尽量减少箱数,还要重 ...

嗯,谢谢你,希望能看到一个更完善的方案

TA的精华主题

TA的得分主题

发表于 2024-1-4 15:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
漏了一个EXIT FOR

Sub P()
    Dim i As Long, j As Long, k As Long, d As Object, d1 As Object, n As Long, v As Double, x, a As Double
    Sheets("装箱").Activate
    a = Cells(1, 8)
    Set d = CreateObject("scripting.dictionary")
    Set d1 = CreateObject("scripting.dictionary")
    i = 3
    Do Until Cells(i, 2) = ""
        s = Cells(i, 2)
        k = 0
        k = d(s)
        If k = 0 Then
            d(s) = 1
            k = 1
            d1(s & "$1") = a
        End If
        v = Cells(i, 5)
        For j = 1 To k
            x = d1(s & "$" & j)
            If x <> "" Then
                If v < x Then
                    Cells(i, 7) = j
                    d1(s & "$" & j) = d1(s & "$" & j) - v
                    Exit For
                ElseIf v = x Then
                    Cells(i, 7) = j
                    d1(s & "$" & j) = ""
                    Exit For
                End If
            End If
        Next
        If j = k + 1 Then
            d(s) = j
            Cells(i, 7) = j
            d1(s & "$" & j) = a - v
        End If
        i = i + 1
    Loop
End Sub

排箱序fs.rar

23.88 KB, 下载次数: 9

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-4 19:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
fjlhgs 发表于 2024-1-4 15:29
漏了一个EXIT FOR

Sub P()

可以了,接近完美,还可以实时调整箱子大小(最多装入量),神补啊

TA的精华主题

TA的得分主题

发表于 2024-1-5 09:47 | 显示全部楼层
参与一下。

排箱序vba求解.zip

27.3 KB, 下载次数: 4

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 13:41 , Processed in 0.040455 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表