添加单元格以在求解器中更改

时间:2011-11-30 03:12:50

标签: excel excel-vba vba

我有从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添加到求解器更改单元格参数中。

我尝试循环遍历空单元格并将它们添加到求解器但是这不起作用,因为只会添加最后一个空白单元格而不会添加其他单元格。任何帮助将非常感激。非常感谢。

2 个答案:

答案 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