漂亮的打印Excel公式?

漂亮的打印Excel公式?,excel,pretty-print,worksheet-function,Excel,Pretty Print,Worksheet Function,有人知道有(免费)工具可以漂亮地打印Excel公式吗?谷歌搜索没有发现任何东西 我有一些半复杂公式的工作表要仔细阅读,这样我的生活会轻松一点 我只是想把事情变成这样 AC6+AD6+(IF(H6="Yes",1,IF(J6="Yes",1,0)))+IF(X6="Yes",1,0) 无需在Vim或类似程序中手动执行,就可以将其转换为更可读的内容。Excel确实会在括号中进行颜色匹配,但仍然会在一行中混合在一起。以下是一个可能适合您的商业解决方案: 一个试用版显然是可用的。这个VBA代码不会赢

有人知道有(免费)工具可以漂亮地打印Excel公式吗?谷歌搜索没有发现任何东西

我有一些半复杂公式的工作表要仔细阅读,这样我的生活会轻松一点

我只是想把事情变成这样

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

无需在Vim或类似程序中手动执行,就可以将其转换为更可读的内容。Excel确实会在括号中进行颜色匹配,但仍然会在一行中混合在一起。

以下是一个可能适合您的商业解决方案:


一个试用版显然是可用的。

这个VBA代码不会赢得任何奖项,但它可以快速查看典型公式。它只是执行手动处理paren或分隔符的操作。将其粘贴到代码模块中,并从VBA即时窗口命令行调用它。(编辑:我最近不得不看一些公式,我改进了原来的答案,所以我回来修改了。)

如果你这样称呼它:

?ppf([q42])
你不必担心逃避你的双引号等等。您将得到如下输出:

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

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

试试Excel公式美化器。它漂亮地打印(又名美化)Excel公式


(我帮助维护这一点,总是寻求反馈以使其更好。)

上述代码片段的这个版本现在也以不同的方式处理引用的字符,这意味着,它将它们单独保留,并且不会让它们在字符串中影响缩进,如:

"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

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

当我把这个归档的时候

{=IFERROR(索引(名称,小)(如果(组=$E5,行(名称)-MIN(行(名称))+1),列($E$5:E5)),“”)
结果是这样的:

{=IFERROR(
索引(
姓名,
小的(
如果(组=$E5,行(名称)-MIN(行(名称))+1),
栏目(E$5:E5)
)
),
""
) }

它不完美,但符合我的口味。这可以复制并使用到Excel/google工作表中。

这太棒了,谢谢!有一个问题,我应该从手机里打电话吗?由于某种原因,它不喜欢[cell]。公式部分。如果我照搬字面公式,效果会很好!从手机打电话时,你必须调整它。按原样,您只需返回字符串参数加上一些不可打印的字符,因为Excel不像VBA那样处理CR和LF。?ppf([q42].公式)将是您在VBA开发环境的即时窗口中键入的内容。“?”只是“Debug.Print”的缩写,括号是“Application.Evaluate()”的缩写,因此[q42]的计算范围为$Q$42。显然,在各种情况下,您都会发现此例程无法按您希望的方式打印,但它足以快速检查您的例程公式。要从单元格调用它,请将vbCrLf更改为vbLf,并将调用它的单元格设置为显示换行文本。您还可以让函数接受一个范围参数,然后获取它的公式或formulaArray属性。哦,您提到了在答案顶部的即时窗口中调用它……抱歉,没有听到。再次感谢你的帮助!这只是为了可读性,对吗?不能将带换行符的公式粘贴回Excel?无论如何,非常感谢你的伟大工具!
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