ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 计划采购量(好难,希望高手来看看)

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-23 20:50 | 显示全部楼层
9楼朋友: 60根 是怎么计算出来的呀  能提供下 上传你的具体的计算方法吗
10楼朋友:你的这个程序(剩余哪项好像填入任何数据都是没什么影响的) 用于同一规格计算 还是很好的  不过遇到很多规格时 需要考虑到可利用料  请有时间 再帮忙想象如何才能做到最好

TA的精华主题

TA的得分主题

发表于 2012-5-23 21:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 Moneky 于 2012-5-24 17:37 编辑

采用先从最长的切,有剩余的话再从次长的开始切,直到最短的都无法切成,则废弃剩余材料,拿新的继续从最长的开始切。不一定最优,但能有结果,也是60根。

程序可以输出详细切割清单,便于按单加工

本楼原附件有点小问题,已经删除,更新后的附件见17楼。

下面程序要求原数据区根据长度倒序排列。(下面的程序也有些小问题,更新的代码在17楼)


  1. Sub doMyWork()
  2.     Dim cerr, hkrr
  3.     Dim nowD As myData
  4.     Dim myNo As Long, nowY As Long, nowR As Long, lngF As Long
  5.     myNo = 1: nowR = 1
  6.     nowY = 6000
  7.     cerr = Range("c3:e" & [e3].End(xlDown).Row)
  8.     Range("h3:l65536").ClearContents
  9.     hkrr = Range("h3:l65536")
  10.     nowD = getNowD(cerr)
  11.    
  12.     Do Until isOVER(cerr)
  13.         DoEvents
  14.         If nowY = nowD.长度 Or (nowY - nowD.长度 > 0 And nowY - nowD.长度 <= 20) Then
  15.             nowY = 0
  16.             D_1 cerr, nowD
  17.             '记录用钢信息
  18.             hkrr(nowR, 1) = myNo
  19.             hkrr(nowR, 2) = nowD.规格
  20.             hkrr(nowR, 3) = nowD.长度
  21.             hkrr(nowR, 4) = nowY
  22.             nowR = nowR + 1
  23. '            Cells(nowR + 1, 8) = myNo
  24. '            Cells(nowR + 1, 9) = nowD.规格
  25. '            Cells(nowR + 1, 10) = nowD.长度
  26. '            Cells(nowR + 1, 11) = nowY
  27.             
  28.             'end
  29.             myNo = myNo + 1 '原料编号+1
  30.             nowY = 6000 '新原料长度
  31.             nowD = getNowD(cerr)
  32.         ElseIf nowY - nowD.长度 > 20 Then
  33.             nowY = nowY - nowD.长度 - 20
  34.             D_1 cerr, nowD
  35.             '记录用钢信息
  36.             hkrr(nowR, 1) = myNo
  37.             hkrr(nowR, 2) = nowD.规格
  38.             hkrr(nowR, 3) = nowD.长度
  39.             hkrr(nowR, 4) = nowY
  40.             nowR = nowR + 1
  41. '            Cells(nowR + 1, 8) = myNo
  42. '            Cells(nowR + 1, 9) = nowD.规格
  43. '            Cells(nowR + 1, 10) = nowD.长度
  44. '            Cells(nowR + 1, 11) = nowY
  45.             'end
  46.             nowD = getNowD(cerr)
  47.         Else
  48.             If Not isLastD(cerr, nowD) Then
  49.                 nowD = getNextD(cerr, nowD)
  50.             Else
  51.                 '记录废弃钢材
  52.                 hkrr(nowR, 1) = myNo
  53.                 hkrr(nowR, 5) = nowY
  54.                 lngF = lngF + nowY
  55.                 nowR = nowR + 1
  56. '                Cells(nowR + 1, 8) = myNo
  57. '                Cells(nowR + 1, 12) = nowY
  58.                 'end
  59.                 myNo = myNo + 1 '新原来编号+1
  60.                 nowY = 6000
  61.                 nowD = getNowD(cerr)
  62.             End If
  63.         End If
  64. '        Cells(nowR + 1, 8).Select
  65.     Loop
  66.     Range("h3:l" & CStr(nowR - 1)) = hkrr
  67.     MsgBox "一共需要" & CStr(myNo) & "根6米长的钢材,总共浪费了" & CStr(lngF) & "mm的原材料。", vbInformation + vbOKOnly, "Eersoft-提示"
  68. End Sub

  69. Private Sub CommandButton1_Click()
  70.     doMyWork
  71. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-5-23 21:03 | 显示全部楼层
wangzhongtu 发表于 2012-5-23 20:50
9楼朋友: 60根 是怎么计算出来的呀  能提供下 上传你的具体的计算方法吗
10楼朋友:你的这个程序(剩余哪 ...

剩余是用于最小剩余尺寸(这个设计是朋友要求的,小于100MM就浪费了最后一刀就不切了)
未命名.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-23 21:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Moneky 老师真厉害  思路很清晰  非常感谢!!!
明天去找些以前人家手工计算的数据 验证下 呵呵!!
本人菜鸟一个 很多代码还不懂 先下载收藏 有时间好好学习下!

TA的精华主题

TA的得分主题

发表于 2012-5-23 21:45 | 显示全部楼层
wangzhongtu 发表于 2012-5-23 20:50
9楼朋友: 60根 是怎么计算出来的呀  能提供下 上传你的具体的计算方法吗
10楼朋友:你的这个程序(剩余哪 ...

说起来太麻烦了,我是商业开发的,如果你的问题不是经常性的,把数据发给我,顺手我就给你免费做了。

TA的精华主题

TA的得分主题

发表于 2012-5-23 21:48 | 显示全部楼层
Moneky 发表于 2012-5-23 21:03
采用先从最长的切,有剩余的话再从次长的开始切,直到最短的都无法切成,则废弃剩余材料,拿新的继续从最长 ...

60根就是最优解了,如果没有20mm的切损,最优解就是59, 贪婪法通常得不出最优解的,这个例子的标准差小,也就是密度大的情况,贪婪的效果还行。

TA的精华主题

TA的得分主题

发表于 2012-5-24 00:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 Moneky 于 2012-5-24 00:02 编辑

有点小问题,输出结果时,行号计算出了问题,导致明明算出应该是60根,但输出结果最大只有59根(数据中的最后一种规格也少了两根),还以为程序计算错误,找了N久,才发现结果输出时行号计算错误,导致少输出了2行。

还更新了统计信息,完成后提示信息更丰富了。

更新后的代码和附件如下:(其中的注释代码是调试的时候用的,可以完全删除注释代码,运行前还是需要手动将数据区域按长度倒序排列)

  1. Sub doMyWork()
  2.     Dim cerr, hkrr
  3.     Dim nowD As myData
  4.     Dim myNo As Long, nowY As Long, nowR As Long, lngF As Long, lngMaxF As Long
  5.     myNo = 1: nowR = 1
  6.     nowY = 6000
  7.     cerr = Range("c3:e" & [e3].End(xlDown).Row)
  8.     Range("h3:l65536").ClearContents
  9.     hkrr = Range("h3:l65536")
  10.     nowD = getNowD(cerr)
  11.    
  12.     Do Until isOVER(cerr)
  13. '        DoEvents
  14.         If nowY - nowD.长度 >= 0 And nowY - nowD.长度 <= 20 Then
  15.             nowY = 0
  16.             D_1 cerr, nowD
  17.             '记录用钢信息
  18.             hkrr(nowR, 1) = myNo
  19.             hkrr(nowR, 2) = nowD.规格
  20.             hkrr(nowR, 3) = nowD.长度
  21.             hkrr(nowR, 4) = nowY
  22. '            hkrr(nowR, 6) = cerr(nowD.myIndex, 3)
  23.             nowR = nowR + 1
  24. '            Cells(nowR + 1, 8) = myNo
  25. '            Cells(nowR + 1, 9) = nowD.规格
  26. '            Cells(nowR + 1, 10) = nowD.长度
  27. '            Cells(nowR + 1, 11) = nowY
  28.             
  29.             'end
  30.             If Not isOVER(cerr) Then
  31.                 myNo = myNo + 1 '原料编号+1
  32.                 nowY = 6000 '新原料长度
  33.                 nowD = getNowD(cerr)
  34.             End If
  35.         ElseIf nowY - nowD.长度 > 20 Then
  36.             nowY = nowY - nowD.长度 - 20
  37.             D_1 cerr, nowD
  38.             '记录用钢信息
  39.             hkrr(nowR, 1) = myNo
  40.             hkrr(nowR, 2) = nowD.规格
  41.             hkrr(nowR, 3) = nowD.长度
  42.             hkrr(nowR, 4) = nowY
  43. '            hkrr(nowR, 6) = cerr(nowD.myIndex, 3)
  44.             nowR = nowR + 1
  45. '            Cells(nowR + 1, 8) = myNo
  46. '            Cells(nowR + 1, 9) = nowD.规格
  47. '            Cells(nowR + 1, 10) = nowD.长度
  48. '            Cells(nowR + 1, 11) = nowY
  49.             'end
  50.             nowD = getNowD(cerr)
  51.         Else
  52.             If Not isLastD(cerr, nowD) Then
  53.                 nowD = getNextD(cerr, nowD)
  54.             Else
  55.                 '记录废弃钢材
  56.                 hkrr(nowR, 1) = myNo
  57.                 hkrr(nowR, 5) = nowY
  58.                 lngF = lngF + nowY
  59.                 lngMaxF = IIf(nowY > lngMaxF, nowY, lngMaxF) '记录最长浪费
  60.                 nowR = nowR + 1
  61. '                Cells(nowR + 1, 8) = myNo
  62. '                Cells(nowR + 1, 12) = nowY
  63.                 'end
  64.                 myNo = myNo + 1 '新原来编号+1
  65.                 nowY = 6000
  66.                 nowD = getNowD(cerr)
  67.             End If
  68.         End If
  69. '        Cells(nowR + 1, 8).Select
  70.     Loop
  71.     Range("h3:l" & CStr(nowR + 1)) = hkrr '因为从第3行开始显示,所以转换行号。
  72.     lngF = lngF + nowY '浪费的长度还要加上最后一根剩下的
  73.     MsgBox "一共需要" & CStr(myNo) & "根6米长的钢材,总共浪费长度为:" & CStr(lngF) & "mm" & vbNewLine & _
  74.             "最后一根剩余长度为:" & CStr(nowY) & "mm" & vbNewLine & _
  75.             "除最后一根外,一根浪费最长为:" & CStr(lngMaxF) & "mm", vbInformation + vbOKOnly, "Eersoft-提示"
  76. End Sub

  77. Private Sub CommandButton1_Click()
  78.     doMyWork
  79. End Sub
复制代码

my计划采购量.rar

25.45 KB, 下载次数: 594

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-5-24 13:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
计划采购量-h.rar (8.04 KB, 下载次数: 194)

TA的精华主题

TA的得分主题

发表于 2012-5-24 16:31 | 显示全部楼层
我做钢材采购。试试能能不能达到你的要求。

分割安全计划采购量.rar

14.55 KB, 下载次数: 341

TA的精华主题

TA的得分主题

发表于 2012-5-24 22:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
切割的是每根长度是不是一样啊
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 00:45 , Processed in 0.041325 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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