设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 35|回复: 12

自动计算货物最大摆放数量(根据给出的容器尺寸)

  [复制链接]
累计签到:1 天
连续签到:1 天
灌水成绩
3
37
241
主题
帖子
积分

等级头衔 ID : 830
用户组 : 测量员

积分成就 测量币 : 241
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2025-7-11 13:26:00 来自手机 | 显示全部楼层 |阅读模式 IP:香港



问题描述如上图所示。这个需求有点类似集装箱的装箱计算,但不需要计算层数(忽略高度),只需要计算根据货物的长宽(货物长宽为基础数据)与容器的长宽(容器长宽为变量)来计算货物在该容器中的平面摆放数量。

比较麻烦的是如何最大化利用容器面积来使得码放的货物箱数最大化。实际工作中,货物长宽数据(基础数据)可能会有数千或数万行。

希望能够根据B列C列的货物长宽数据,以及容器长宽变量值(手动输入L1与W1),计算“最大摆放数量”,以及“最大外轮廓长(L2)”与“最大外轮廓宽(W2)”。

求助~~
货物码放数量计算_V01.7z (36.21 KB, 下载次数: 0)
精密测量技术论坛免责声明
重要声明:以上内容仅代表该作者观点,不代表本站精密测量技术论坛立场。
如有涉及侵权请尽快告知,我们将会在第一时间处理。作者原创内容未经允许不得转载!
站长联系邮箱:1339305021@qq.com
站长联系微信:dddnnbbb
累计签到:6 天
连续签到:1 天
灌水成绩
2
37
184
主题
帖子
积分

等级头衔 ID : 891
用户组 : 测量员

积分成就 测量币 : 184
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2025-7-14 08:34:00 | 显示全部楼层 IP:香港
求大神相助
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
灌水成绩
1
29
229
主题
帖子
积分

等级头衔 ID : 810
用户组 : 测量员

积分成就 测量币 : 229
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2025-7-14 16:59:00 | 显示全部楼层 IP:香港
这个不属于Excel问题
回复

使用道具 举报

累计签到:4 天
连续签到:2 天
灌水成绩
2
18
80
主题
帖子
积分

等级头衔 ID : 809
用户组 : 测量员

积分成就 测量币 : 80
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2025-7-15 10:54:00 | 显示全部楼层 IP:香港
AI的答案,仅供参考
Function MaxBoxCountWithSize(containerLength As Integer, containerWidth As Integer, _
                            itemLength, itemWidth, _
                            ByRef maxLength As Long, ByRef maxWidth As Long) As Long
    ' 初始化最大数量和占用尺寸
    Dim maxCount As Integer
    maxCount = 0
    maxLength = 0
    maxWidth = 0
   
    ' 方案1:货物不旋转
    Dim count1 As Integer
    Dim layout1Length As Integer, layout1Width As Integer
    count1 = (containerLength \ itemLength) * (containerWidth \ itemWidth)
    layout1Length = (containerLength \ itemLength) * itemLength
    layout1Width = (containerWidth \ itemWidth) * itemWidth
   
    ' 方案2:货物旋转
    Dim count2 As Integer
    Dim layout2Length As Integer, layout2Width As Integer
    count2 = (containerLength \ itemWidth) * (containerWidth \ itemLength)
    layout2Length = (containerLength \ itemWidth) * itemWidth
    layout2Width = (containerWidth \ itemLength) * itemLength
   
    ' 比较两种基本方案
    If count1 > maxCount Then
        maxCount = count1
        maxLength = layout1Length
        maxWidth = layout1Width
    End If
   
    If count2 > maxCount Then
        maxCount = count2
        maxLength = layout2Length
        maxWidth = layout2Width
    End If
   
    ' 方案3:水平分割混合摆放
    Dim h As Integer
    Dim stepSize As Integer
    stepSize = Application.WorksheetFunction.Gcd(itemWidth, itemLength)
    If stepSize = 0 Then stepSize = 1 ' 避免除零错误
   
    For h = 0 To containerWidth Step stepSize
        ' 顶部区域(不旋转)
        Dim topCount As Integer
        Dim topLength As Integer, topWidth As Integer
        topCount = (containerLength \ itemLength) * (h \ itemWidth)
        topLength = (containerLength \ itemLength) * itemLength
        topWidth = (h \ itemWidth) * itemWidth
        
        ' 底部区域(旋转)
        Dim bottomCount As Integer
        Dim bottomLength As Integer, bottomWidth As Integer
        bottomCount = (containerLength \ itemWidth) * ((containerWidth - h) \ itemLength)
        bottomLength = (containerLength \ itemWidth) * itemWidth
        bottomWidth = ((containerWidth - h) \ itemLength) * itemLength
        
        ' 计算整体占用尺寸
        Dim totalCount As Integer
        Dim totalLength As Long, totalWidth As Long
        totalCount = topCount + bottomCount
        totalLength = containerLength ' 水平方向满宽
        totalWidth = topWidth + bottomWidth
        
        ' 更新最优方案
        If totalCount > maxCount Or (totalCount = maxCount And totalLength * totalWidth > maxLength * maxWidth) Then
            maxCount = totalCount
            maxLength = totalLength
            maxWidth = totalWidth
        End If
    Next h
   
    ' 方案4:垂直分割混合摆放
    Dim v As Integer
    For v = 0 To containerLength Step stepSize
        ' 左侧区域(不旋转)
        Dim leftCount As Integer
        Dim leftLength As Integer, leftWidth As Integer
        leftCount = (v \ itemLength) * (containerWidth \ itemWidth)
        leftLength = (v \ itemLength) * itemLength
        leftWidth = (containerWidth \ itemWidth) * itemWidth
        
        ' 右侧区域(旋转)
        Dim rightCount As Integer
        Dim rightLength As Integer, rightWidth As Integer
        rightCount = ((containerLength - v) \ itemWidth) * (containerWidth \ itemLength)
        rightLength = ((containerLength - v) \ itemWidth) * itemWidth
        rightWidth = (containerWidth \ itemLength) * itemLength
        
        ' 计算整体占用尺寸
        totalCount = leftCount + rightCount
        totalLength = leftLength + rightLength
        totalWidth = containerWidth ' 垂直方向满高
        
        ' 更新最优方案
        If totalCount > maxCount Or (totalCount = maxCount And totalLength * totalWidth > maxLength * maxWidth) Then
            maxCount = totalCount
            maxLength = totalLength
            maxWidth = totalWidth
        End If
    Next v
   
    ' 返回最大数量
    MaxBoxCountWithSize = maxCount
End Function
Sub CalculateMaxBoxesWithSize()
    Dim containerL As Integer, containerW As Integer
    Dim itemL As Integer, itemW As Integer
   
    ' 容器尺寸
    containerL = Range("c2")
    containerW = Range("f2")
   
    ar = Range("a4").CurrentRegion
   
    ' 计算最大装箱数量及占用尺寸
    Dim maxCount As Integer
    Dim usedLength As Long, usedWidth As Long
    For i = 2 To UBound(ar)
        If ar(i, 2) > 0 And ar(i, 3) > 0 Then
        maxCount = MaxBoxCountWithSize(containerL, containerW, ar(i, 2), ar(i, 3), usedLength, usedWidth)
        ar(i, 4) = maxCount
        ar(i, 5) = usedLength
        ar(i, 6) = usedWidth
        End If
    Next
    Range("a4").CurrentRegion = ar
End Sub
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
灌水成绩
2
34
137
主题
帖子
积分

等级头衔 ID : 803
用户组 : 测量员

积分成就 测量币 : 137
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2025-7-16 08:48:00 | 显示全部楼层 IP:香港
多谢多谢。可以用,我再多测试测试,感激
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
灌水成绩
3
37
183
主题
帖子
积分

等级头衔 ID : 826
用户组 : 测量员

积分成就 测量币 : 183
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2025-7-16 08:50:00 | 显示全部楼层 IP:香港
纯属好奇。请问若是你遇到这类问题,会先想到用什么工具来解决?不是用Excel的话是会用别的什么吗?别的工具中的代码或逻辑能否用到VBA中?
回复

使用道具 举报

累计签到:5 天
连续签到:2 天
灌水成绩
1
20
262
主题
帖子
积分

等级头衔 ID : 890
用户组 : 测量员

积分成就 测量币 : 262
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2026-4-1 21:15:00 | 显示全部楼层 IP:香港
肯定能啦,一通百通,缺点是excel代码执行效率很低
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
灌水成绩
2
38
148
主题
帖子
积分

等级头衔 ID : 853
用户组 : 测量员

积分成就 测量币 : 148
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2026-4-1 22:16:00 | 显示全部楼层 IP:香港
ai也没那么智能,第105行应该是13个才对
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
灌水成绩
2
29
157
主题
帖子
积分

等级头衔 ID : 840
用户组 : 测量员

积分成就 测量币 : 157
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2026-4-1 23:23:00 | 显示全部楼层 IP:香港
最大尺寸就错得太多了
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
灌水成绩
0
34
126
主题
帖子
积分

等级头衔 ID : 864
用户组 : 测量员

积分成就 测量币 : 126
违规 : 0
在线时间 : 0 小时
注册时间 : 2026-4-6
最后登录 : 2026-4-30

勋章

测量学徒测量员

联系方式

发表于 2026-4-2 07:48:00 | 显示全部楼层 IP:香港
很低? Excel什么代码效率低呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|精密测量技术论坛 ( 桂ICP备2026007449号-1 )|网站地图

GMT+8, 2026-5-1 05:25 , Processed in 0.125410 second(s), 34 queries .

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