不在活动图纸上运行解算器(VBA)

不在活动图纸上运行解算器(VBA),vba,excel,Vba,Excel,我有一本工作簿,我正在用它来解非线性方程组,然后在图表上显示解。该图表包含大量内容(基本上是解决一些标准情况下的方程组的结果),其中引用了一个约1200个单元格的表格。这些内容是静态的,因此为了美观起见,我将计算表放在表1上,图表放在表2上 然后在图表上,我允许用户输入两个单元格,这两个单元格在表1的计算中引用,以构建方程组的三个动态实例。对于解算器来说,一次只处理一个问题是非常轻量级的 我使用sheet2上的“工作表更改”事件监视用户修改这两个单元格,然后它调用运行解算器的子对象 事件代码:

我有一本工作簿,我正在用它来解非线性方程组,然后在图表上显示解。该图表包含大量内容(基本上是解决一些标准情况下的方程组的结果),其中引用了一个约1200个单元格的表格。这些内容是静态的,因此为了美观起见,我将计算表放在表1上,图表放在表2上

然后在图表上,我允许用户输入两个单元格,这两个单元格在表1的计算中引用,以构建方程组的三个动态实例。对于解算器来说,一次只处理一个问题是非常轻量级的

我使用sheet2上的“工作表更改”事件监视用户修改这两个单元格,然后它调用运行解算器的子对象

事件代码:

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
Sub-SolverEQN(rw,rwend为整数)
作为整数的Dim-iter
对于iter=rw至rwend
如果表(1).单元(iter,14)为0,则
解算集
SolverOptions AssumeNonNeg:=假
SolverOK SetCell:=“'Sheet1'!$N$”&iter,MaxMinVal:=“3”,ValueOf:=“0”,ByChange:=“'Sheet1'!$H$”&iter
解算器解算真
如果结束
下一个iter
端接头
这里是遇到问题的地方。解算器运行在SeET2上,尽管我指定它在SeET1上运行,这意味着方程组不存在,它们应该在哪里,并且求解器在我的活动表的中间快速优化到0=0。 我发现有两种解决方法:

1-在运行解算器之前将我的activesheet设置为sheet1,然后在解算器运行之后将activesheet设置回sheet2。这会导致短暂的暂停和屏幕闪烁,因此对于用户来说,体验不会是“无缝的”

2-求解图表上的动态方程组,并以一种粗糙的方式隐藏它们(白色字体,把它们塞进我的图表后面,恶心!)

如果必须的话,我会用选项2来处理这个问题,但是你们这些有创造力的人对如何在我的计算表上保留这些计算有什么想法吗

非常感谢您的投入


干杯。

您可以将解决方案1与
Application.ScreenUpdate=False
一起使用,然后更改工作表并运行解算器。如果一切都已完成,请返回工作表并再次设置
Application.ScreenUpdating=True
。(无闪烁)@DirkReichel我感谢您的反馈,但您会注意到,在事件确定正确的单元格已更改后,我所做的第一件事是将ScreenUpdate设置为false。不过我还是有点不对劲。因为更新是错误的,所以这是一个令人惊讶的结果。我假设这是解算器本身的一部分。存在无法阻止的多个操作。但根据方程的复杂程度,最好的解决方案将是“搜索”解决方案的子方案。或者更好(但对我们来说可能不可能)的是一个数学方程,它直接输出您需要的数字。然而:如果没有一张表格和一些示例数据,那么用这种方式很难做到。同样对于解决方案2:将单元格的数字格式设置为“
;;
”会更容易。如果选中,它将看起来像是空的,除了公式栏。@DirkReichel感谢这些想法。我相信你是对的,Solver正在采取无法阻止的行动。当然这是有意义的,因为它在excel应用程序外部有自己的库。对于计算数字而不是优化的表达式来说,这是不可能的。我的方程是超越的,所以不存在干净的逆。我可能只需要编写自己的优化代码,然后调用它,可能有些过分,但至少我可以通过这种方式获得控制权。感谢您的所有输入(以及整洁的格式技巧,非常酷!)。干杯。不客气;)