Excel-我需要使公式的输出值永久不变,即使输入被删除

Excel-我需要使公式的输出值永久不变,即使输入被删除,excel,vba,Excel,Vba,我想在计算器上创建类似M+按钮的东西 我希望在更改或删除输入值时,公式的输出值不会被覆盖,而是与新的输入一起在公式中再次使用。希望这是有道理的 另一方面,我希望输出值与同一公式中的新输入值一起使用(这是一个简单的加法公式)。也许你可以用VBA做类似的事情,尽管我认为没有VBA是不行的(至少不用循环引用,循环引用也有自己的问题)。关键是使用一个静态字典,它保留包含公式的每个单元格状态的内存。比如: Function PlusM(x As Double) As Double Static s

我想在计算器上创建类似M+按钮的东西

我希望在更改或删除输入值时,公式的输出值不会被覆盖,而是与新的输入一起在公式中再次使用。希望这是有道理的


另一方面,我希望输出值与同一公式中的新输入值一起使用(这是一个简单的加法公式)。

也许你可以用VBA做类似的事情,尽管我认为没有VBA是不行的(至少不用循环引用,循环引用也有自己的问题)。关键是使用一个静态字典,它保留包含公式的每个单元格状态的内存。比如:

Function PlusM(x As Double) As Double
    Static states As Object, state As Double, key As String

    If states Is Nothing Then
        Set states = CreateObject("Scripting.Dictionary")
    End If

    key = Application.Caller.Address

    If states.Exists(key) Then
        state = states(key)
    Else
        state = 0
        states.Add key, state
    End If

    state = state + x
    states(key) = state
    PlusM = state
End Function
当A1最初为空时,如果我将
=PlusM(A1)
放入A2中,则A2将显示0。如果我在A1中输入任何值,那么A2现在将显示该值。如果我随后删除A1中的值,A2将保留其值。如果我在A1中放入一个新值,A2将显示其旧值+A1中的新值。字典的使用允许不同的单元格具有
=PlusM()
的实例,而不会使一个单元格的状态泄漏到另一个单元格的状态


这并不是最可靠的解决方案——状态丢失是一个问题。如果项目被重置(包括关闭然后重新打开工作簿),它将不会保留其状态。我尝试过用
state=Application.Caller.Value
替换行
state=0
,结果不一。如果这是一个问题,毫无疑问,可以通过
工作簿\u Open()
来恢复状态。

也许你可以用VBA做类似的事情,尽管我认为没有VBA你做不到(至少不用循环引用,循环引用也有自己的问题)。关键是使用一个静态字典,它保留包含公式的每个单元格状态的内存。比如:

Function PlusM(x As Double) As Double
    Static states As Object, state As Double, key As String

    If states Is Nothing Then
        Set states = CreateObject("Scripting.Dictionary")
    End If

    key = Application.Caller.Address

    If states.Exists(key) Then
        state = states(key)
    Else
        state = 0
        states.Add key, state
    End If

    state = state + x
    states(key) = state
    PlusM = state
End Function
当A1最初为空时,如果我将
=PlusM(A1)
放入A2中,则A2将显示0。如果我在A1中输入任何值,那么A2现在将显示该值。如果我随后删除A1中的值,A2将保留其值。如果我在A1中放入一个新值,A2将显示其旧值+A1中的新值。字典的使用允许不同的单元格具有
=PlusM()
的实例,而不会使一个单元格的状态泄漏到另一个单元格的状态


这并不是最可靠的解决方案——状态丢失是一个问题。如果项目被重置(包括关闭然后重新打开工作簿),它将不会保留其状态。我尝试过用
state=Application.Caller.Value
替换行
state=0
,结果不一。如果这是一个问题,毫无疑问,可以通过
WorkBook\u Open()
来恢复状态。

无论出于何种目的,这都与时间戳工作表的更改问题无异。无论出于何种目的,这都与时间戳工作表的更改问题无异。