簡體   English   中英

漂亮的打印 Excel 公式?

[英]Pretty Print Excel Formulas?

有誰知道可以漂亮地打印 Excel 公式的(免費)工具? 谷歌搜索沒有發現任何東西。

我有一些半復雜公式的工作表需要通過,所以這會讓我的生活更輕松一些。

我只是想把這樣的東西

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

無需在 Vim 或類似工具中手動執行即可轉換為更具可讀性的內容。 Excel 確實會在括號上進行顏色匹配,但它仍然在一行上混合在一起。

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

(我幫助維護這一點,一直在尋找反饋以使其更好。)

此 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)

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

這是一個可能適合您的商業解決方案:

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

試用版顯然可用。

上面代碼片段的這個版本現在也以不同的方式處理引用的字符,這意味着,如果它們在像這樣的字符串中,它不會讓它們影響縮進:

"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 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 / 谷歌表格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM