【问题标题】:Pretty Print Excel Formulas?漂亮的打印 Excel 公式?
【发布时间】:2009-09-18 21:41:18
【问题描述】:

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

我有一些半复杂公式的工作表要费力地完成,所以这会让我的生活更轻松一些。

我只是想把这样的东西变成这样

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

无需在 Vim 或类似工具中手动执行,即可获得更具可读性的内容。 Excel 确实会在括号上进行颜色匹配,但仍然会在一行中混合在一起。

【问题讨论】:

    标签: excel pretty-print worksheet-function


    【解决方案1】:

    试试 Excel 公式美化器http://excelformulabeautifier.com/。它漂亮地打印(又名美化)Excel 公式。

    (我帮助维护它,一直在寻找反馈以使其变得更好。)

    【讨论】:

    • 这只是为了便于阅读,对吧?您不能将带有换行符的公式粘贴回 Excel 中吗?无论如何,非常感谢您提供的出色工具!
    【解决方案2】:

    此 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 部分。如果我复制文字公式,它会很好用!
    • 您必须调整它以从单元格调用。因为 Excel 不会像 VBA 那样处理 CR 和 LF,所以您只需返回字符串参数和一些不可打印的字符。 ?ppf([q42].formula) 将是您在 VBA 开发环境的即时窗口中键入的内容。 “?”只是 'Debug.Print' 的缩写,方括号是 'Application.Evaluate()' 的缩写,因此 [q42] 的计算范围为 $Q$42。显然,您会发现此例程在各种情况下都无法按照您想要的方式打印,但对于快速检查您的例程公式来说已经足够了。
    • 要从单元格调用它,请将 vbCrLf 更改为 vbLf,并将调用它的单元格设置为显示换行文本。你也可以让函数接受一个范围参数,然后获取它的公式或公式数组属性。
    • 哦,你提到从答案顶部的即时窗口调用它......对不起,错过了。再次感谢您的帮助!
    【解决方案3】:

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

    http://www.uts.us.com/ItemDetails.asp?ItemID=1100-40-0000-00

    试用版显然可用。

    【讨论】:

      【解决方案4】:

      上述代码的这个版本 sn-p 现在也以不同的方式处理引用的字符,这意味着,如果它们在字符串中,它不会让它们影响缩进:

      "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
      

      【讨论】:

        【解决方案5】:

        我刚刚通过使用 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 表格中。

        【讨论】:

          猜你喜欢
          • 2011-05-06
          • 2011-01-07
          • 2021-06-22
          • 1970-01-01
          • 2016-07-07
          • 2014-05-19
          • 1970-01-01
          • 2011-03-21
          • 1970-01-01
          相关资源
          最近更新 更多