漂亮地打印Excel公式?

8
有没有一种方法可以漂亮地打印Excel公式?
我有几个半复杂的公式工作表要处理,这会让我的生活变得更轻松一些。
我只是想把这样的东西转换成这样
AC6+AD6+(IF(H6="Yes",1,IF(J6="Yes",1,0)))+IF(X6="Yes",1,0)

将代码转换为更易读的格式,而不必手动在 Vim 或类似工具中进行操作。Excel 可以对括号进行颜色匹配,但仍然会将所有内容压缩在一行上。

5个回答

11

尝试使用Excel公式美化器http://excelformulabeautifier.com/。该工具可以美化Excel公式。

(我帮助维护此工具,始终寻求反馈以改进它。)


这只是为了可读性,对吧?你不能将有换行的公式粘贴回Excel中吗?无论如何,非常感谢你的优秀工具! - Noumenon

4

这段VBA代码可能不会获得任何奖项,但它可以快速查看典型公式。它只是简单地模拟手动使用括号或分隔符的方法。将其放入代码模块中,并从VBA即时窗口命令行调用它。(编辑:最近我需要查看一些公式,所以我对原始答案进行了改进,因此我回来修改了它。)

Public Function ppf(f) As String
    Dim formulaStr As String

    If IsObject(f) Then
        Debug.Assert TypeOf f Is Range

        Dim rng As Range
        Set rng = f

        formulaStr = rng.Formula
    Else
        Debug.Assert VarType(f) = vbString

        formulaStr = f
    End If

    Dim tabs(0 To 99) As Long

    Dim tabNum As Long
    tabNum = 1

    Dim tabOffset As Long

    Dim i As Long
    Dim c As String
    For i = 1 To Len(formulaStr)
        c = Mid$(formulaStr, i, 1)

        If InStr("({", c) > 0 Then
            ppf = ppf & c

            tabNum = tabNum + 1
            tabs(tabNum) = tabs(tabNum - 1) + tabOffset + 1
            tabOffset = 0

            ppf = ppf & vbCrLf & Space(tabs(tabNum))
        ElseIf InStr(")}", c) > 0 Then
            tabNum = tabNum - 1
            tabOffset = 0

            ppf = ppf & c & vbCrLf & Space(tabs(tabNum))
        ElseIf InStr("+-*/^,;", c) > 0 Then
            tabOffset = 0

            ppf = ppf & c & vbCrLf & Space(tabs(tabNum))
        Else
            ppf = ppf & c

            tabOffset = tabOffset + 1
        End If
    Next i
End Function

如果您这样调用它:

?ppf([q42])

您不必担心转义双引号等问题。您将获得类似于以下输出:

AC6+
AD6+
(
 IF(
    H6="Yes",
    1,
    IF(
       J6="Yes",
       1,
       0)
    )
 )
+
IF(
   X6="Yes",
   1,
   0)

您也可以使用纯字符串调用它。

太好了,谢谢!我有一个问题,我应该从单元格中调用它吗?由于某种原因,它不喜欢 [cell].formula 部分。但是如果我复制字面上的公式,它就可以正常工作! - Adam Neal
你需要对其进行调整,以便从手机上进行调用。如果不加修改,则仅会返回字符串参数加上一些无法打印的字符,因为Excel无法像VBA那样处理CR和LF。在VBA开发环境中立即窗口中键入' ?ppf([q42].formula) '。'?' 简称 'Debug.Print',方括号简称'Application.Evaluate(<string>)',因此[q42]计算范围为$Q$42。显然,您会发现这个例程无法按照您希望的方式打印所有情况,但对于快速检查公式是足够的。 - jtolle
要从单元格中调用它,请将 vbCrLf 更改为 vbLf,并设置您从中调用它的单元格以显示换行文本。您还可以使函数接受范围参数,然后获取其公式或 formulaArray 属性。 - jtolle
哦,你提到在答案的顶部从即时窗口调用它...抱歉,我错过了。再次感谢您的帮助! - Adam Neal

0

上述代码片段的这个版本现在也以不同的方式处理引用字符,这意味着,它会将它们保留下来,如果它们在字符串内部,则不会让它们影响缩进:

"This ({)},;+*-/ won't lead to a linebreak" 

它由布尔变量bInsideQuotes控制。 它还使用

.FormulaLocal

让最终用户看到他们熟悉的内容。

Public Function prettyPrintFormula(f As Variant) As String
    Dim formulaStr As String
    Dim ppf As String

    If IsObject(f) Then
        Debug.Assert TypeOf f Is Range

        Dim rng As Range
        Set rng = f

        formulaStr = rng.FormulaLocal
    Else
        Debug.Assert VarType(f) = vbString

        formulaStr = f
    End If

    Dim tabs(0 To 99) As Long

    Dim tabNum As Long
    tabNum = 1

    Dim tabOffset As Long

    Dim i As Long
    Dim c As String
    Dim bInsideQuotes As Boolean
    bInsideQuotes = False
    For i = 1 To Len(formulaStr)
        c = Mid$(formulaStr, i, 1)

        If InStr("""", c) > 0 Then
            bInsideQuotes = Not bInsideQuotes
        End If
        If InStr("({", c) > 0 And Not bInsideQuotes Then
            ppf = ppf & c

            tabNum = tabNum + 1
            tabs(tabNum) = tabs(tabNum - 1) + tabOffset + 1
            tabOffset = 0

            ppf = ppf & vbCrLf & Space(tabs(tabNum))
        ElseIf InStr(")}", c) > 0 And Not bInsideQuotes Then
            tabNum = tabNum - 1
            tabOffset = 0

            ppf = ppf & c & vbCrLf & Space(tabs(tabNum))
        ElseIf InStr("+-*/^,;", c) > 0 And Not bInsideQuotes Then
            tabOffset = 0

            ppf = ppf & c & vbCrLf & Space(tabs(tabNum))
        Else
            ppf = ppf & c

            tabOffset = tabOffset + 1
        End If
    Next i
    prettyPrintFormula = ppf
End Function

0

到了2023年,最简单的方法是安装微软自己的高级公式环境。除了漂亮的打印公式(然后可以复制粘贴到常规公式栏中),它还有许多其他功能。转到“插入”选项卡,“获取加载项”,搜索“Excel实验室”。

我还强烈推荐“公式锻造”加载项作为“求值公式”的替代品。它使得难以计算的公式变得更加容易。


0

我刚刚通过使用VS Code sql-formatter 扩展程序解决了这个问题。我只需将我的公式粘贴到一个SQL文件中,并使用sql-formatter进行格式化。

当我将此放入文件中时

{=IFERROR(INDEX(names,SMALL(IF(groups=$E5,ROW(names)-MIN(ROW(names))+1),COLUMNS($E$5:E5))),"")}

它就像这样出现:

{ = IFERROR(
  INDEX(
    NAMES,
    SMALL(
      IF(groups = $ E5, ROW(NAMES) - MIN(ROW(NAMES)) + 1),
      COLUMNS($ E $ 5 :E5)
    )
  ),
  ""
) }

虽然不是完美的,但对我来说还是可以接受的。而且这可以被复制并用于Excel / Google表格中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接