Красивые формулы Excel для печати?

Кто-нибудь знает (бесплатный) инструмент для красивой печати формул Excel? Поиск в гугле ничего не дал.

У меня есть несколько рабочих листов с полусложными формулами, которые нужно просмотреть, так что это немного облегчит мне жизнь.

Я просто хочу превратить что-то вроде этого

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

во что-то более читабельное, не делая это вручную в Vim и т.п. Excel выполняет сопоставление цветов в круглых скобках, но все равно все это смешано в одной строке.


person Adam Neal    schedule 18.09.2009    source источник


Ответы (5)


Этот код 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)

Вы также можете вызвать его с помощью простой строки.

person jtolle    schedule 19.09.2009
comment
Это здорово, спасибо! Один вопрос, я должен звонить сюда с мобильного? По какой-то причине ему не нравится часть [cell].formula. Если я скопирую буквальную формулу, она отлично работает! - person Adam Neal; 19.09.2009
comment
Придется настраивать для звонка с сотового. Как есть, вы просто вернете строковый аргумент плюс некоторые непечатаемые символы, потому что Excel не обрабатывает CR и LF так, как это делает VBA. ?ppf([q42].formula) будет тем, что вы вводите в непосредственном окне в среде разработки VBA. '?' просто сокращение от «Debug.Print», а скобки — это сокращение от «Application.Evaluate(‹string›)», поэтому [q42] оценивается в диапазоне $Q$42. Очевидно, вы обнаружите, что эта подпрограмма не может печатать так, как вы хотите, во всех случаях, но ее достаточно для быстрой проверки ваших рутинных формул. - person jtolle; 20.09.2009
comment
Чтобы вызвать его из ячейки, измените vbCrLf на vbLf и установите ячейку, из которой вы вызываете, для отображения обернутого текста. Вы также можете заставить функцию принимать аргумент диапазона, а затем использовать ее формулу или свойство FormulaArray. - person jtolle; 20.09.2009
comment
О, вы упомянули, что вызывали его из непосредственного окна в верхней части ответа ... извините, пропустили это. Спасибо еще раз за помощь! - person Adam Neal; 22.09.2009

Попробуйте Улучшение формул Excel http://excelformulabeautifier.com/. Он красиво печатает (иначе украшает) формулы Excel.

(Я помогаю поддерживать это, всегда ищу отзывы, чтобы сделать его лучше.)

person joshbennett    schedule 29.05.2012
comment
Это просто для удобства чтения, верно? Вы не можете вставить формулы с разрывами строк обратно в Excel? В любом случае, большое спасибо за ваш отличный инструмент! - person Noumenon; 22.05.2016

Вот коммерческое решение, которое может вам подойти:

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

Судя по всему, доступна пробная версия.

person richardtallent    schedule 18.09.2009

Эта версия приведенного выше фрагмента кода теперь также обрабатывает символы в кавычках по-другому, что означает, что они не используются и не позволяют им влиять на отступы, если они находятся внутри строки, например:

"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
person Martin    schedule 29.04.2015

Я только что решил проблему, используя код VS 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.

person The Fool    schedule 01.10.2020