Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5896|回复: 4

[分享] 规划求解辅助代码产生一维下料方案

[复制链接]
发表于 2011-8-19 16:34 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2012-7-11 16:05 编辑

实际工作中经常会遇到一维下料问题.
标准长度的材料若干,需要按照几种规格对标准材料进行截取.
给定各规格材料的需求数量,求最少要使用多少标准材料.

这类问题可以通过excel的规划求解解决,但是第一步是建模,就是要列出所有(或经筛选)的截取方案.
比如已知一个标准材料长度10,需要截取长度为4的材料20个,长度为2的材料13个,长度3的材料30个.
求需要的标准材料个数.

那么我们首先就要列出标准材料10的截取方法.
截取方法有22种,每种都有0-10的余料产生.
   
未命名.JPG

下面的代码,就是用来产生该方案的.


  1. Public Plans()
  2. Public TotalBlank As Integer
  3. Public TotalPlans As Long
  4. Public Maximums()
  5. Public BlankLens
  6. Public MaxRemnantLen As Double
  7. Sub Main()
  8.     On Error Resume Next
  9.     Dim StockLen As Double
  10.     Dim Plan As String
  11.     StockLen = Val(InputBox("输入标准件长度", "输入参数:1", 6000))
  12.     If StockLen = 0 Then
  13.         MsgBox "参数1不合法", vbOKOnly, "警告"
  14.         Exit Sub
  15.     End If
  16.     Plan = InputBox("输入要截取的不同长度" & vbCrLf & "多个数据使用空格分开", "输入参数:2", "1000 2000 3000")
  17.     If Plan = "" Then Exit Sub
  18.     BlankLens = Split(Plan)
  19.     TotalBlank = UBound(BlankLens)
  20.     ReDim Maximums(TotalBlank)
  21.     For i = 0 To TotalBlank
  22.         If Val(BlankLens(i)) = 0 Then
  23.             MsgBox "参数2不合法", vbOKOnly, "警告"
  24.             Exit Sub
  25.         End If
  26.         Maximums(i) = Int(StockLen / BlankLens(i))
  27.     Next
  28.     MaxRemnantLen = Val(InputBox("输入允许的最大余料长度" & vbCrLf & "当可用方案过多时,建议改小此参数.", "输入参数:3", StockLen))
  29.     TotalPlans = 0
  30.     Blanking StockLen, 0, ""
  31.     Application.ScreenUpdating = False
  32.     Sheets.Add
  33.     Range("a1") = "Remnants"
  34.     Range("b1").Resize(1, TotalBlank + 1) = BlankLens
  35.     Cells(2, 1).Resize(TotalPlans, 2) = Application.WorksheetFunction.Transpose(Plans)
  36.     Range("b2:b65536").TextToColumns , xlDelimited, , , , , , True
  37.     With ActiveSheet.Sort
  38.         .SortFields.Add Range("A1"), , xlAscending
  39.         .SetRange ActiveSheet.UsedRange
  40.         .Header = xlYes
  41.         .Apply
  42.     End With
  43.     Application.ScreenUpdating = True
  44. End Sub

  45. Sub Blanking(StockLen As Double, i As Integer, Plan As String)
  46.     Dim Remnant As Double
  47.     If i < TotalBlank Then
  48.         For j = 0 To Maximums(i)
  49.             Blanking StockLen - BlankLens(i) * j, i + 1, Plan & " " & j
  50.         Next
  51.     Else
  52.         For j = 0 To Maximums(i)
  53.             Remnant = StockLen - BlankLens(i) * j
  54.             If Remnant >= 0 And Remnant < MaxRemnantLen Then
  55.                 ReDim Preserve Plans(1, TotalPlans)
  56.                 Plans(0, TotalPlans) = Remnant
  57.                 Plans(1, TotalPlans) = Trim(Plan & " " & j)
  58.                 TotalPlans = TotalPlans + 1
  59.             End If
  60.         Next
  61.     End If
  62. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2011-8-19 22:08 | 显示全部楼层
规划球解算彩票是不是很快{:041:} 我自己弄的循环算,会出现卡死{:251:}
回复

使用道具 举报

发表于 2011-11-7 17:55 | 显示全部楼层
有点难,看不懂 我还没入门,其实这个程序对我们有点用,我们也经常算料,我们用的专门的软件
回复

使用道具 举报

发表于 2012-4-9 23:48 | 显示全部楼层
谢楼主分享,支持一下
回复

使用道具 举报

发表于 2012-4-29 12:51 | 显示全部楼层
代码复制后怎么用啊?
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-1 06:03 , Processed in 0.448563 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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