在活动工作表(VBA)上运行解算器

时间:2017-03-15 03:25:38

标签: excel vba excel-vba

我有一个工作簿,我用来解决非线性方程组,然后在图表上显示解决方案。该图表具有大量内容(基本上是解决几个标准情况的方程组的结果),其引用了大约1200个单元格的表格。该内容是静态的,因此为了美观,我将计算表保存在sheet1上,并将图表保存在sheet2上。

然后在图表表格中,我允许用户输入两个单元格,这两个单元格在sheet1的计算中被引用,以构建方程组的三个动态实例。非常轻量级的解算器一次处理一个。

我在sheet2上使用Worksheet_Change事件来监视用户修改这两个单元格,然后调用运行解算器的子。

事件代码:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If (Target.Address = "$C$3") Or (Target.Address = "$D$3") Then

        Application.ScreenUpdating = False
        Application.EnableEvents = False

        SolverEQN 178, 180

        Application.ScreenUpdating = True
        Application.EnableEvents = True
    End If
End Sub

解算器代码:

Sub SolverEQN(rw, rwend As Integer)
    Dim iter As Integer

    For iter = rw To rwend

        If Sheets(1).Cells(iter, 14) <> 0 Then
            SolverReset
            SolverOptions AssumeNonNeg:=False
            SolverOK SetCell:="'Sheet1'!$N$" & iter, MaxMinVal:="3", ValueOf:="0", ByChange:="'Sheet1'!$H$" & iter
            SolverSolve True
        End If

    Next iter

End Sub

这是遇到问题的地方。求解器在sheet2上运行,尽管我将它指定为在sheet1上运行,这意味着方程系统不存在于应有的位置,并且求解器在我的活动工作表中间快速优化为0 = 0。

我找到了两种解决方法:

1 - 在运行解算器之前将我的活动表设置为sheet1,然后在求解器运行后将活动表设置回sheet2。这会导致短暂的停顿和屏幕闪烁,因此体验不会是无缝的&#39;对于用户。

2 - 在图表上解决动态方程组并以粗略的方式隐藏它们(白色字体,将它们放在我的图表后面,YUCK!)。

如果必须的话,我会用选项2处理这个问题,但你是否有创意的人对如何在我的计算表上保留计算有任何想法?

非常感谢。

干杯。

0 个答案:

没有答案