[原创]VBA调用‘规划求解’自动合成矿料级配
试验
技术人员都知道,已知五、六档甚至七档集料计算合成成符合技术
及级配关键点的控制要求,是非常消耗脑力和时间,特别是没有经验的检测人员更困难。因此我们可利用计算机的信息处理能力,为我们分忧解难。Excel是办公中最常用的办公软件之一,其功能非常强大,能利用好相关功能,会有意想不到的效果。
规划求解也称作“假设
”,是一个非常好用的工具,经常用于查看更改某些单元格中的变量对工作表中
结果的影响,例如:
1、根据已知结果倒推变量应赋予的初值:已知各档级配通过率及矿料的级配范围,可以用单变量求解、循环引用,也可规划求解得出配合比例。
2、根据已知参数和配比,寻找最佳组合
:这种应用案例居多。
利用Excel2003提供的规划求解可以进行级配合成、最佳沥青用量的选定、沥青混合料拌和楼的标定等问题.
常规操作规划求解过程中,美中不足的是除了限制变量个数、求解时间有时候比较长外,还有是如果变量不多、算法也不难,但有许多需要求解的值,而每一次改变都要重复操作,弹出规划求解对话框、求解。
以上常规操作无法避免的问题,在利用VBA调用规划求解宏却可以很好的解决。从而更好的提高工作效率。通过工程上最常用的配合比级配比例的选定(例子为沥青混合料配合比)进行说明.
代码如下:
Sub ww()
'取消密码保护
ActiveSheet.Unprotect Password:=123
Range("C4:C11").Select
Selection.ClearContents
' 全部重设
SolverReset
'规划求解参数设置 Solverok setcell=设置目标单元格:
'MaxMinVal 对应于是否要解决目标单元对最大值 (1)、 最小值 (2), 或特定值 (3)
'ValueOf 指定要匹配目标单元值。 如果您设置 MaxMinVal 为 3, 必须指定该参数。
'如果将设置为 1 或 2, MaxMinVal 才能省略该参数。
'ByChange 指定单元格或区域的单元格, 将更改
'SolverAdd (CellRef, 关系, FormulaText)
'1 值是否小于或等于 =<
'2 vaue 等于 (=)。
'3 值是否大于或等于 >=
'4 值是整数
'5 是二进制(值是零或一个)
'FormulaText 引用一个或多个单元格构成右边的 constraint
Solverok setcell:=Range("$D$12"), maxminval:=3, ValueOf:=100, bychange:=Range("c4:c11")
SolverAdd CellRef:=Range("d12"), Relation:=2, FormulaText:=Range("q12")
SolverAdd CellRef:=Range("d12"), Relation:=3, FormulaText:=Range("d17")
SolverAdd CellRef:=Range("d12"), Relation:=1, FormulaText:=Range("d16")
SolverAdd CellRef:=Range("e12"), Relation:=3, FormulaText:=Range("e17")
SolverAdd CellRef:=Range("e12"), Relation:=1, FormulaText:=Range("e16")
SolverAdd CellRef:=Range("f12"), Relation:=3, FormulaText:=Range("f17")
SolverAdd CellRef:=Range("f12"), Relation:=1, FormulaText:=Range("f16")
SolverAdd CellRef:=Range("g12"), Relation:=3, FormulaText:=Range("g17")
SolverAdd CellRef:=Range("g12"), Relation:=1, FormulaText:=Range("g16")
SolverAdd CellRef:=Range("h12"), Relation:=3, FormulaText:=Range("h17")
SolverAdd CellRef:=Range("h12"), Relation:=1, FormulaText:=Range("h16")
SolverAdd CellRef:=Range("i12"), Relation:=3, FormulaText:=Range("i17")
SolverAdd CellRef:=Range("i12"), Relation:=1, FormulaText:=Range("i16")
SolverAdd CellRef:=Range("j12"), Relation:=3, FormulaText:=Range("j17")
SolverAdd CellRef:=Range("j12"), Relation:=1, FormulaText:=Range("j16")
SolverAdd CellRef:=Range("k12"), Relation:=3, FormulaText:=Range("k17")
SolverAdd CellRef:=Range("k12"), Relation:=1, FormulaText:=Range("k16")
SolverAdd CellRef:=Range("l12"), Relation:=3, FormulaText:=Range("l17")
SolverAdd CellRef:=Range("l12"), Relation:=1, FormulaText:=Range("l16")
SolverAdd CellRef:=Range("m12"), Relation:=3, FormulaText:=Range("m17")
SolverAdd CellRef:=Range("m12"), Relation:=1, FormulaText:=Range("m16")
SolverAdd CellRef:=Range("n12"), Relation:=3, FormulaText:=Range("n17")
SolverAdd CellRef:=Range("n12"), Relation:=1, FormulaText:=Range("n16")
SolverAdd CellRef:=Range("o12"), Relation:=3, FormulaText:=Range("o17")
SolverAdd CellRef:=Range("o12"), Relation:=1, FormulaText:=Range("o16")
SolverAdd CellRef:=Range("p12"), Relation:=3, FormulaText:=Range("p17")
SolverAdd CellRef:=Range("p12"), Relation:=1, FormulaText:=Range("p16")
SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1
'密码保护
ActiveSheet.Protect Contents:=True, Scenarios:=True, AllowFormattingCells:=True, Password:=123
End Sub
最后点击“合成级配线”一切OK!