设为首页收藏本站

 找回密码
 立即注册

只需一步,快速开始

搜索
查看: 283|回复: 28

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

 火.. [复制链接]
累计签到:31 天
连续签到:1 天
灌水成绩
4
200
4266
主题
帖子
积分

等级头衔

ID : 830

助理工程师

积分成就 测量币 : 4266
在线时间 : 0 小时
注册时间 : 2026-2-1
最后登录 : 2026-7-5

勋章
UID勋章测量学徒测量员
发表于 2025-7-11 13:26:00 来自手机 | 显示全部楼层 |阅读模式 IP:香港



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

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

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

求助~~
货物码放数量计算_V01.7z (36.21 KB, 下载次数: 0)
累计签到:36 天
连续签到:1 天
灌水成绩
2
203
4092
主题
帖子
积分

等级头衔

ID : 891

助理工程师

积分成就 测量币 : 4092
在线时间 : 0 小时
注册时间 : 2025-9-18
最后登录 : 2026-6-19

勋章
UID勋章测量学徒测量员
发表于 2025-7-14 08:34:00 | 显示全部楼层 IP:香港
求大神相助
回复

使用道具 举报

累计签到:33 天
连续签到:1 天
灌水成绩
1
208
4274
主题
帖子
积分

等级头衔

ID : 810

助理工程师

积分成就 测量币 : 4274
在线时间 : 0 小时
注册时间 : 2025-11-3
最后登录 : 2026-6-14

勋章
UID勋章测量学徒测量员
发表于 2025-7-14 16:59:00 | 显示全部楼层 IP:香港
这个不属于Excel问题
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
灌水成绩
3
178
3885
主题
帖子
积分

等级头衔

ID : 809

助理工程师

积分成就 测量币 : 3885
在线时间 : 0 小时
注册时间 : 2025-10-30
最后登录 : 2026-6-14

勋章
UID勋章测量学徒测量员
发表于 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
回复

使用道具 举报

累计签到:31 天
连续签到:2 天
灌水成绩
2
182
3061
主题
帖子
积分

等级头衔

ID : 803

助理工程师

积分成就 测量币 : 3061
在线时间 : 0 小时
注册时间 : 2026-4-1
最后登录 : 2026-6-14

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

使用道具 举报

累计签到:31 天
连续签到:2 天
灌水成绩
3
190
4147
主题
帖子
积分

等级头衔

ID : 826

助理工程师

积分成就 测量币 : 4147
在线时间 : 0 小时
注册时间 : 2026-1-8
最后登录 : 2026-6-26

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

使用道具 举报

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

等级头衔

ID : 890

助理工程师

积分成就 测量币 : 4230
在线时间 : 0 小时
注册时间 : 2025-10-20
最后登录 : 2026-7-5

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

使用道具 举报

累计签到:32 天
连续签到:2 天
灌水成绩
2
211
4460
主题
帖子
积分

等级头衔

ID : 853

助理工程师

积分成就 测量币 : 4460
在线时间 : 0 小时
注册时间 : 2026-1-14
最后登录 : 2026-6-19

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

使用道具 举报

累计签到:27 天
连续签到:1 天
灌水成绩
3
193
3769
主题
帖子
积分

等级头衔

ID : 840

助理工程师

积分成就 测量币 : 3769
在线时间 : 0 小时
注册时间 : 2025-12-24
最后登录 : 2026-7-5

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

使用道具 举报

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

等级头衔

ID : 864

助理工程师

积分成就 测量币 : 3914
在线时间 : 0 小时
注册时间 : 2025-9-17
最后登录 : 2026-6-21

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

使用道具 举报

快速回复换一批
好贴支持!
强无敌
楼主好人一生平安
看帖回帖是美德。 悄悄地我来了,顺便留下一条充满正能量的回帖。 🌊🤝
学到了! 请问楼主,这个方法在实际操作中有什么需要特别注意的坑吗? 🧐❓
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-7-7 19:37 , Processed in 0.379717 second(s), 55 queries .

Powered by 精密测量技术论坛

© 2025-2026 联系站长

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