我有从A1到J1的范围,我想使用求解器更改以优化某个值。通常,我会执行以下操作:
SolverOK ByChange:=Range("A1:J1")
然而,我的程序随机填写A1:J1范围内的一些单元格,其中必须保留固定数字。我如何只将空单元格添加到SolverOk ByChange:=参数?
A1 B1 C1 D1 E1 F1 G1 H1 I1 J1
0 1 1 0
例如,我可能有上述设置,我只想将单元格B1,D1,E1,G1,H1和I1添加到求解器更改单元格参数中。
我尝试循环遍历空单元格并将它们添加到求解器但是这不起作用,因为只会添加最后一个空白单元格而不会添加其他单元格。任何帮助将非常感激。非常感谢。
答案 0 :(得分:2)
您可以捕获范围内的任何真正空白单元格(使用SpecialCells(xlBlanks)
),然后将此地址提供给求解器VBA(ByChange:=rng1.Address
),即如果有空白单元格,则运行下面的示例代码
Sub Macro1()
Dim rng1 As Range
On Error Resume Next
Set rng1 = Range("A1:J1").SpecialCells(xlBlanks)
On Error GoTo 0
If Not rng1 Is Nothing Then
SolverOk SetCell:="$B$2", MaxMinVal:=1, ValueOf:=0, ByChange:=rng1.Address, Engine:= _
1, EngineDesc:="GRG Nonlinear"
End If
End Sub
答案 1 :(得分:0)
只想分享我使用上述解决方案解决的类似问题。我想创建一个宏来暂时“锁定”一个单元格(将其从单元格列表中删除以进行更改),如果我有一个值,我想为该特定运行修复。可能有一种更优雅的方式,但是通过使用这个代码,我可以按下一个按钮,将一个字符放在单元格中,从我希望锁定的那个字符开始两个(显示单元格被锁定的附加好处)并且可以调整要更改的单元格列表,而无需打开求解器窗口。
Sub Lock1B()
Dim rng1 As Range
Range("X7") = "#"
On Error Resume Next
Set rng1 = Range("X7:X15").SpecialCells(xlBlanks)
On Error GoTo 0
If Not rng1 Is Nothing Then
SolverOk ByChange:=rng1.Offset(0, 2).Address
End If