有没有一种方法可以根据最终(非公式,仅值)单元格来表示复杂的Excel公式?

乔治·斯科普索夫(George Skoptsov)

我有一个非常复杂的Excel电子表格(通过多个工作表使用其他公式访问单元格的公式)最后使用来自其他多个单元格(参数)的输入来计算单个单元格(输出)。是否有一种自动化的方法(Excel宏或独立工具)可以从输出单元格开始并递归展开计算,直到它直接根据参数单元格来表示公式?

澄清度

在评论中,有人提出了“评估公式”工具的建议。虽然我找不到在Mac的Excel 2008中激活它的方法,但从其描述看来,它似乎允许用户逐步评估单元格。那不是我所需要的。我需要的是一种将给定单元格中的公式转换为可以用最终单元格(包含值但不包含公式的单元格)表示的等效公式的方法,该单元格可以引用包含该公式的其他单元格。

这是一个简单的例子。

  • A1 包含 = B1 + C1
  • B1 包含 = B2 * B2
  • C1 包含 = C2 * C2
  • B2 包含 1
  • C2 包含 2

评估公式可让我逐步进行的计算,A1以得出的最终值5我需要的是一个无需实际评估即可展开A1公式的工具= B2 * B2 + C2 * C2

托蒂梅德利

问题

您不能使用“评估公式”来执行此操作,因为这不是该函数的目的。这就是为什么将其称为validate,用于评估公式的原因。您想要的是某种包装。这有点特殊的需要,因此它不是作为Excel中的工具实现的,但是如果您创建一些Visual Basic函数/宏,则有解决方案。

如您在本教程中所见,创建一个VBA代码模块(宏)

  1. Alt+F11
  2. 点击ModuleInsert
  3. 粘贴代码。
Function CellFormula(Target As Range) As String
   CellFormula = Target.Formula
End Function

然后在单元格中输入以下内容: =CellFormula(A1)

这将说明该单元格的公式。此代码的唯一问题是它仅适用于一个级别。如果您也想解开所包含的单元格公式,则需要使用递归的更复杂的代码。

解决方案

这是一段漫长的旅程,但是我为您创建了一个VBA宏来实现此功能。我没有说明此代码适用于每个公式,但适用于大多数/其中的某些公式。另外,我没有声明此代码将生成与原始输入的代码等效的公式,或者给出与原始代码相同的结果。

源代码

Option Explicit

Function isChar(char As String) As Boolean
    Select Case char
        Case "A" To "Z"
            isChar = True
        Case Else
            isChar = False
    End Select
End Function

Function isNumber(char As String, isZero As Boolean) As Boolean
    Select Case char
        Case "0"
            If isZero = True Then
                isNumber = True
            Else
                isNumber = False
            End If
        Case "1" To "9"
            isNumber = True
        Case Else
            isNumber = False
    End Select
End Function

Function CellFormulaExpand(formula As String) As String
    Dim result As String
    Dim previousResult As String
    Dim cell As Range
    Dim stringArray() As String
    Dim arraySize As Integer
    Dim n As Integer
    Dim trimmer As String
    
    Dim c As Integer 'character number
    Dim chr As String 'current character
    Dim tempcell As String 'suspected cell's temporaly result
    Dim state As Integer 'state machine's state:
    Dim stringSize As Integer

    result = formula
    previousResult = result
    state = 0
    stringSize = 0

    For c = 0 To Len(formula) Step 1
        chr = Mid(formula, c + 1, 1)
        Select Case state
            Case 0
                If isChar(chr) Then
                    state = 1
                    tempcell = tempcell & chr
                ElseIf chr = "$" Then
                    state = 5
                    tempcell = tempcell & chr
                Else
                    state = 0
                    tempcell = ""
                End If
            Case 1
                If isNumber(chr, False) Then
                    state = 4
                    tempcell = tempcell & chr
                ElseIf isChar(chr) Then
                    state = 2
                    tempcell = tempcell & chr
                ElseIf chr = "$" Then
                    state = 6
                    tempcell = tempcell & chr
                Else
                    state = 0
                    tempcell = ""
                End If
            Case 2
                If isNumber(chr, False) Then
                    state = 4
                    tempcell = tempcell + chr
                ElseIf isChar(chr) Then
                    state = 3
                    tempcell = tempcell + chr
                ElseIf chr = "$" Then
                    state = 6
                    tempcell = tempcell + chr
                Else
                    state = 0
                    tempcell = ""
                End If
            Case 3
                If isNumber(chr, False) Then
                    state = 4
                    tempcell = tempcell + chr
                ElseIf chr = "$" Then
                    state = 6
                    tempcell = tempcell + chr
                Else
                    state = 0
                    tempcell = ""
                End If
            Case 4
                If isNumber(chr, True) Then
                    state = 4
                    tempcell = tempcell + chr
                Else
                    state = 0
                    stringSize = stringSize + 1
                    ReDim Preserve stringArray(stringSize - 1)
                    stringArray(stringSize - 1) = tempcell
                    tempcell = ""
                End If
            Case 5
                If isChar(chr) Then
                    state = 1
                    tempcell = tempcell + chr
                Else
                    state = 0
                    tempcell = ""
                End If
            Case 6
                If isNumber(chr, False) Then
                    state = 4
                    tempcell = tempcell + chr
                Else
                    state = 0
                    tempcell = ""
                End If
            Case Else
                state = 0
                tempcell = ""
        End Select
    Next c
    If stringSize = 0 Then
        CellFormulaExpand = result
    Else
        arraySize = UBound(stringArray)
        For n = 0 To arraySize Step 1
            Set cell = Range(stringArray(n))
            If Mid(cell.formula, 1, 1) = "=" Then
                trimmer = Mid(cell.formula, 2, Len(cell.formula) - 1)
                If trimmer <> "" Then
                    result = Replace(result, stringArray(n), trimmer)
                End If
            End If
        Next
        If previousResult <> result Then
            result = CellFormulaExpand(result)
        End If
    End If
    CellFormulaExpand = result
End Function

Function CellFormula(rng As Range) As String
    CellFormula = CellFormulaExpand(rng.formula)
End Function

要使其工作,只需创建一个宏(如我在答案开头所描述的),然后将代码复制粘贴即可。之后,您可以将其与=CellFormula(A1)whereA1可以使用的任何1x1单元一起使用。

成功的案例

我创建了一些示例,以便您可以实际使用它。在这种情况下,我演示了字符串的用法。您可以看到它运行完美。唯一的小错误是该算法为何将分号更改为逗号。替换它们之后(如本例中所做的那样),您将获得正确的输出。使用琴弦

在这里,您可以看到它如何与数字一起使用。现在,我们面临的第一个问题是算法不关心数学运算顺序,这就是为什么红色数字应为10时为6的原因。如果将敏感的运算(如加减法)放在括号中,输入的给定公式将提供与底部10的绿色数字相同的输出。处理数字

无效的情况

该算法不是完美的。我只是尝试实现最常见的用途,因此可以通过添加更多功能来处理其他情况(例如范围)来加以改进。
如您在本示例中看到的,我使用SUM()范围作为参数。由于该算法从上到下解密单元格内容,因此从替换SUM()参数开始,然后再替换其他任何内容。因此,:在其周围的所有位置均被替换时,其位置保持不变,因此在其附近替换了新的单元格,这将改变其含义。因此输出将是错误的。因此,在这种情况下,您只能使用此宏来研究原始公式。使用范围

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以使用相邻单元格的值来突出显示excel单元格?

来自分类Dev

有没有一种方法可以让我的公式引用一个单元格值,以便可以用一个单元格更改多个公式?

来自分类Dev

有没有一种设置Excel的方法,它可以跳过包含公式的单元格并直接跳到需要直接输入数据的单元格?

来自分类Dev

有没有一种方法可以在A1单元格中使用下拉菜单来规定要在A2单元格中使用哪个公式

来自分类Dev

有没有一种方法可以复制带有锚点单元格的Excel公式,并使锚点每n行更新一次?

来自分类Dev

有没有一种方法可以重用公式中的计算值?

来自分类Dev

有没有一种方法可以根据Excel 2016中的条件对一组单元格进行排名?

来自分类Dev

有没有一种方法可以根据Excel中的加权概率随机选择一个单元格?

来自分类Dev

有没有一种方法可以在Excel中检索注释的单元格地址?

来自分类Dev

有没有一种方法可以设置用户未与之交互的单元格的值

来自分类Dev

有没有一种方法可以仅使用HTML / CSS隐藏基于特定值的数据单元格?

来自分类Dev

有没有一种方法可以表示条件,假设自定义数字格式的单元格中该项目的绝对值?

来自分类常见问题

Excel:如果n个单元格连续满足条件,有没有一种方法可以对n + 1个单元格求和?

来自分类Dev

Excel:如果n个单元格连续满足条件,有没有一种方法可以对n + 1个单元格求和?

来自分类Dev

有没有一种方法可以将图像叠加在多个单元格上?

来自分类Dev

(Excel)有没有一种方法可以根据另一个单元格的值从一系列单元格中对一个单元格进行条件格式化?

来自分类Dev

有没有一种方法可以在Excel的单元格中搜索所有匹配字符串的起始字符位置?

来自分类Dev

c#:有没有一种方法可以从数据开始处检索excel中的单元格地址?

来自分类Dev

有没有一种方法可以将单元格中用逗号分隔的值列表包装在引号中?

来自分类Dev

有没有一种简单的方法来更改Excel VBA中的单元格引用?

来自分类Dev

有没有一种方法可以在不刷新单元格的情况下显示单元格中的对象?

来自分类Dev

在Microsoft Excel中,有没有一种方法可以在不使用Visual Basic的情况下根据单元格内容动态更改列宽?

来自分类Dev

有没有一种方法可以在没有CellEditor的情况下选择JTable中单元格中的所有文本?

来自分类Dev

有没有一种方法可以表示查询中的位置值?

来自分类Dev

有没有一种方法可以将公式应用于两个值向量,并获得每个组合的输出数据框?

来自分类Dev

有没有一种方法可以拆分具有部分删除线文本的单元格内容?

来自分类Dev

有没有一种方法可以消除此单元格中带有图像的这些多余的行?

来自分类Dev

有没有一种方法可以返回熊猫中一个单元格的索引名和列名

来自分类Dev

有没有一种方法可以检测何时在屏幕上显示一个单元格?

Related 相关文章

  1. 1

    有没有一种方法可以使用相邻单元格的值来突出显示excel单元格?

  2. 2

    有没有一种方法可以让我的公式引用一个单元格值,以便可以用一个单元格更改多个公式?

  3. 3

    有没有一种设置Excel的方法,它可以跳过包含公式的单元格并直接跳到需要直接输入数据的单元格?

  4. 4

    有没有一种方法可以在A1单元格中使用下拉菜单来规定要在A2单元格中使用哪个公式

  5. 5

    有没有一种方法可以复制带有锚点单元格的Excel公式,并使锚点每n行更新一次?

  6. 6

    有没有一种方法可以重用公式中的计算值?

  7. 7

    有没有一种方法可以根据Excel 2016中的条件对一组单元格进行排名?

  8. 8

    有没有一种方法可以根据Excel中的加权概率随机选择一个单元格?

  9. 9

    有没有一种方法可以在Excel中检索注释的单元格地址?

  10. 10

    有没有一种方法可以设置用户未与之交互的单元格的值

  11. 11

    有没有一种方法可以仅使用HTML / CSS隐藏基于特定值的数据单元格?

  12. 12

    有没有一种方法可以表示条件,假设自定义数字格式的单元格中该项目的绝对值?

  13. 13

    Excel:如果n个单元格连续满足条件,有没有一种方法可以对n + 1个单元格求和?

  14. 14

    Excel:如果n个单元格连续满足条件,有没有一种方法可以对n + 1个单元格求和?

  15. 15

    有没有一种方法可以将图像叠加在多个单元格上?

  16. 16

    (Excel)有没有一种方法可以根据另一个单元格的值从一系列单元格中对一个单元格进行条件格式化?

  17. 17

    有没有一种方法可以在Excel的单元格中搜索所有匹配字符串的起始字符位置?

  18. 18

    c#:有没有一种方法可以从数据开始处检索excel中的单元格地址?

  19. 19

    有没有一种方法可以将单元格中用逗号分隔的值列表包装在引号中?

  20. 20

    有没有一种简单的方法来更改Excel VBA中的单元格引用?

  21. 21

    有没有一种方法可以在不刷新单元格的情况下显示单元格中的对象?

  22. 22

    在Microsoft Excel中,有没有一种方法可以在不使用Visual Basic的情况下根据单元格内容动态更改列宽?

  23. 23

    有没有一种方法可以在没有CellEditor的情况下选择JTable中单元格中的所有文本?

  24. 24

    有没有一种方法可以表示查询中的位置值?

  25. 25

    有没有一种方法可以将公式应用于两个值向量,并获得每个组合的输出数据框?

  26. 26

    有没有一种方法可以拆分具有部分删除线文本的单元格内容?

  27. 27

    有没有一种方法可以消除此单元格中带有图像的这些多余的行?

  28. 28

    有没有一种方法可以返回熊猫中一个单元格的索引名和列名

  29. 29

    有没有一种方法可以检测何时在屏幕上显示一个单元格?

热门标签

归档