Довольно печати формул Excel? - PullRequest
7 голосов
/ 19 сентября 2009

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 29 мая 2012

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

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

3 голосов
/ 19 сентября 2009

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

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

1 голос
/ 19 сентября 2009

Вот коммерческое решение, которое может работать на вас:

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

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

0 голосов
/ 29 апреля 2015

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

"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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...