excel 运行GoalSeek后存储值

42fyovps  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(119)

我正在为几个场景运行GoalSeek,只有一个输出B95。
在每个场景运行之后,我需要存储GoalSeek正在更改的单元格B4的值。
此值需要存储在单元格P97、P98和P99中(三个场景对应三个值)。
使用我当前的宏,我可以看到GoalSeek正在工作,但是值没有存储,并且在单元格P97、P98和P99中输入了“False”。
'tolerance'是在GoalSeek没有找到精确匹配时的预防措施。(我处理的是百分比,希望公差为± 1%。)
我知道问题出在If语句的前半部分。我希望在进入下一个单变量求解方案之前存储GoalSeek找到的值。

Sub Button1_Click()

Dim k As Integer
Dim PurchasePrice As Integer
Const tolerance As Long = 0.01

For k = 87 To 89
    Range("B95").GoalSeek Goal:=Cells(k, "O"), ChangingCell:=Range("B4")
      
    If Cells(95, "B").Value <= Cells(k, "O") + tolerance And Cells(95, "B").Value >= Cells(k, "O") - tolerance Then
        PurchasePrice = Range("B4").Value
        Range(Cells(k, "P")).Value = PurchasePrice
    Else
        Cells(k, "P") = False
    End If
        
Next k

End Sub
ssm49v7z

ssm49v7z1#

你有一个基本的错误:

Range(Cells(k, "P")).Value = PurchasePrice.

如果要保持代码不变,则需要将其更改为

Cells(k, "P") = PurchasePrice

除此之外,你的逻辑似乎是合理的。为了测试,我重写了“我的首选”语法(见下文)。它有点简单(帮助我看得更清楚)。然而,基本的逻辑是你的(净的错误)。

Sub Button1_Click()

    Dim in1%
    Const bdTolerance# = 0.01

    For in1 = 87 To 89
    
        With Range("B95")
            .GoalSeek Goal:=Cells(in1, "O"), ChangingCell:=Range("B4")
    
            If .Value <= Cells(in1, "O") + bdTolerance And .Value >= Cells(in1, "O") - bdTolerance Then
                Cells(in1, "P") = Range("B4")
            Else
                Cells(in1, "P") = False
            End If
        End With
            
    Next in1

End Sub

另外,您在文本中表示希望公差为± 1%。但是,您添加和减去的是文字0.01(而不是1%)。要应用百分比,请将检验更改为:

If .Value <= Cells(in1, "O") * (1 + bdTolerance) And _
    .Value >= Cells(in1, "O") * (1 - bdTolerance) Then

最后,您在文本中说“此值需要存储在单元格P97、P98和P99中(3个方案有3个不同的值)"。但是,您的代码从第87行获取并存储到第89行。要更改到第97行到第99行,请更改For values per:

For in1 = 97 To 99

总而言之,假设您的描述性文本是准确的,而代码是不准确的,那么统一的解决方案是:

Sub Button1_Click()

    Dim in1%
    Const bdTolerance# = 0.01

    For in1 = 97 To 99
    
        With Range("B95")
            .GoalSeek Goal:=Cells(in1, "O"), ChangingCell:=Range("B4")
    
            If .Value <= Cells(in1, "O") * (1 + bdTolerance) And _
                .Value >= Cells(in1, "O") * (1 - bdTolerance) Then
                Cells(in1, "P") = Range("B4")
            Else
                Cells(in1, "P") = False
            End If
        End With
            
    Next in1

End Sub

相关问题