有谁知道(免费)工具可以漂亮地打印 Excel 公式?谷歌搜索没有发现任何东西。
我有一些半复杂公式的工作表要费力地完成,所以这会让我的生活更轻松一些。
我只是想把这样的东西
AC6+AD6+(IF(H6="Yes",1,IF(J6="Yes",1,0)))+IF(X6="Yes",1,0)
无需在 Vim 或类似工具中手动执行,即可获得更具可读性的内容。Excel 确实在括号上进行颜色匹配,但它仍然在一行中混合在一起。
有谁知道(免费)工具可以漂亮地打印 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)
您也可以使用纯字符串调用它。
上述代码片段的这个版本现在也以不同的方式处理带引号的字符,这意味着,如果它们在字符串中,它不会让它们影响缩进,例如:
"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 / google 表格中。