【问题标题】:Excel formula calculating once then deletingExcel公式计算一次然后删除
【发布时间】:2014-11-25 13:05:12
【问题描述】:

我有一个excel公式:

=SplitKey(GetSysCd(INDEX([ReportValue],MATCH("mtr_make_model",[FieldName],0)),INDEX([ListName],MATCH("mtr_make_model",[FieldName],0))), 0)

它在 VBA 中运行一些子例程,但主要是匹配值并将这些值插入到单元格中。当它找到“mtr_make_model”的值时,它会运行并匹配 sys 代码表中的值。我遇到的问题是它只计算一次,然后它删除公式,现在只有值......如果我去 mtr_make_model 字段并更改值,公式不会重新计算。有没有人听说过这种情况?这是由于 VBA 代码中的某些内容造成的吗?如何使该公式保持不变,如果某些值发生变化,该公式会重新计算?

提前致谢。

这是两个函数:

    Public Function GetSysCd(ByVal name As String, sysCdTableName As String) As String
    Dim r As Integer
    Dim sysCdTable As Range
    Dim nameList As Variant
    Dim sysCd As String

On Error GoTo GetSysCd_Error

    Set sysCdTable = Worksheets("sys_cd").Range(sysCdTableName)

    nameList = WorksheetFunction.Index(sysCdTable, 0, 2)
    r = WorksheetFunction.Match(name, nameList, 0)
    sysCd = WorksheetFunction.Index(sysCdTable, r, 1)

    GetOutOfHere:
    On Error GoTo 0
        GetSysCd = sysCd
        Exit Function

    GetSysCd_Error:
        sysCd = ""
        GoTo GetOutOfHere

    End Function


Public Function SplitKey(s As String, v As Integer)
Dim aString As Variant
Dim r As Integer

If Len(s) > 2 Then
    aString = Split(s, "_")

    If v = 0 Or v = 1 Then
        SplitKey = aString(v)
    Else
        SplitKey = aString(0)
    End If

Else
    SplitKey = ""
End If

End Function

我不认为这些函数在这一点上是相关的,而只是当公式中的变量发生变化时函数不重新计算的问题......

【问题讨论】:

  • 发布您的代码。我的猜测是您将值分配给单元格而不是函数本身。
  • 我已经添加了
  • 问题是它没有重新计算......但我应该提到公式在计算一次后就消失了......我如何将公式保留在那里以供初学者使用,那么我如何得到它重新计算是我需要帮助的

标签: vba excel excel-formula calculated-field


【解决方案1】:

问题可能是 Excel 仅在其参数之一发生更改时重新计算函数,并且您的 GetSysCd 函数所引用的范围不在其参数列表中

设置 sysCdTable = Worksheets("sys_cd").Range(sysCdTableName)

其中 sysCdTableName 只是一个字符串而不是一个引用。

【讨论】:

  • 如何将 sysCdTableName 更改为引用?
  • Excel 将完全删除公式。计算一次就没有公式了……你知道为什么计算一次就去掉公式吗?
  • 公共函数 GetSysCd(ByVal name As String, sysCdTable As Range) 。 Excel 本身不会删除公式,所以它一定是某个地方的 VBA 正在这样做(可能粘贴特殊值)
  • 一个 LDB 值覆盖了我的公式。我更改了 LDB 值的位置,我的公式现在完好无损,一切都按需要运行。谢谢查尔斯,你的倾向是正确的。
【解决方案2】:

您可以通过在每个函数的顶部添加Application.Volatile True 来使函数实时重新计算。

【讨论】:

  • 我已将 Application.Volatile True 添加到两个函数的顶部,当我更改 mtr_make_model 值时结果保持不变...似乎不起作用。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多