2009-09-18 4 views
6

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

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

Я просто смотрю, чтобы включить что-то вроде этого

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

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

ответ

3

Этот код VBA не получит вознаграждений, но это O.K. для быстрого изучения типичных формул. Он просто делает то, что вы делаете с парсерами или разделителями вручную. Вставьте его в модуль кода и вызовите его из командной строки непосредственного окна VBA. (EDIT: я должен был смотреть на некоторых формулах в последнее время, и я улучшил на то, что было здесь от моего первоначального ответа, так что я вернулся и изменил его.)

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) 

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

+0

Это замечательно, спасибо! Один вопрос, я должен назвать это из ячейки? По какой-то причине это не нравится ** [cell] .formula **. Если я копирую буквенную формулу, это отлично работает! –

+0

Вам нужно будет настроить его для вызова из ячейки. Как есть, вы просто вернете строковый аргумент плюс некоторые непечатаемые символы, потому что Excel не обрабатывает CR и LF так, как это делает VBA. «Ppf» ([q42] .formula) будет тем, что вы вводите в непосредственном окне в среде разработки VBA. '?' просто сокращен для «Debug.Print», а скобки для «Приложения» - короткие.Evaluate () ', поэтому [q42] оценивается в диапазоне $ Q $ 42. Очевидно, вы обнаружите, что эта процедура не может печатать так, как вы хотите, во всех случаях, но она достаточна для быстрой проверки ваших стандартных формул. – jtolle

+0

Чтобы вызвать его из ячейки, измените vbCrLf на vbLf и установите ячейку, из которой вы ее вызываете, чтобы отобразить завернутый текст. Вы также можете заставить функцию принять аргумент диапазона, а затем захватить его формулу или свойство formulaArray. – jtolle

9

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

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

+0

Это просто для читаемости, не так ли? Вы не можете вставлять формулы с разрывами строк в Excel? В любом случае, большое спасибо за отличный инструмент! – Noumenon

0

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

"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