Страницы: 1
RSS
Автоматическое многоуровневое отображение формулы, Как отобразить формулу MS Excel по другому?
 
Здравствуйте.
Может информация на форуме проскакивала и я не умею искать. Есть ли какой-либо способ отобразить формулу Excel многоуровнево, как в программировании, типа:
=(..
 (..);
 (
    (..);
 );..
)

Не меняя при этом саму формулу, чтобы её функциональность не менялась. Это необходимо для логического понимания длинных формул. Возможно есть надстройки.
 
Наглядность в сложных формулах (planetaexcel.ru)
 
Alt+Enter
 
ALT + ENTER
 
Эти простые вещи я и сам знаю. И часто ими пользуюсь. Думал, может кто то придумал нечто автоматическое.
Доходит до смешного: копируешь формулу в ворд и разбиваешь её на структуру, чтобы выявить ошибку логики, когда выходные данные явно ошибочны.
 
Есть, но он с русскими нотациями не очень дружит.
Вот горшок пустой, он предмет простой...
 
Цитата
berstrider: Есть ли какой-либо способ отобразить формулу Excel многоуровнево, как в программировании, типа:
Цитата
RAN: Alt+Enter
Цитата
berstrider: Эти простые вещи я и сам знаю
вам прямо ответили на поставленный вопрос — что не нравится? Хотите, чтобы переносы (как в примере) сами ставились? Так даже "в программировании" это руками делается…
+ МатросНаЗебре дал ссылку на целую тему об этом — не хватило?
В общем, хочу сам не знаю, что  :D

Цитата
berstrider: копируешь формулу в ворд и разбиваешь её на структуру, чтобы выявить ошибку логики
ещё есть пошаговое выполнение формулы для отладки

Цитата
PooHkrd: Есть , но он с русскими нотациями не очень дружит
можно написать подобное и на VBA, но не за спасибо  :D
Идея для НВП и его PLEX'а  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Макрос, разбивающий формулу на строки и проставляющий отступы.
Код
Option Explicit

Sub TransformActiveCellFormula()
    TransformCellFormula ActiveCell
End Sub

Sub TransformCellFormula(cl As Range)
    Dim txtIn As String
    Dim txtOu As String
    Dim ch As String
    Dim ii As Long
    Dim arrLevelSpace As Variant
    Dim iLevel As Long
    Dim lenSubString As Long
    Dim quotesClosed As Boolean
    quotesClosed = True
    txtIn = cl.FormulaR1C1
    
    If txtIn <> "" Then
        txtIn = Replace(txtIn, vbCrLf, vbLf)
        txtIn = Replace(txtIn, vbCr, vbLf)
        txtIn = TrimTxtIn(txtIn)
        
        ReDim arrLevelSpace(0 To 0)
        
        For ii = 1 To Len(txtIn)
            ch = Mid(txtIn, ii, 1)
            lenSubString = lenSubString + 5
            Select Case ch
            Case "("
                If quotesClosed Then
                    iLevel = iLevel + 1
                    ReDim Preserve arrLevelSpace(0 To UBound(arrLevelSpace) + 1)
                    arrLevelSpace(UBound(arrLevelSpace)) = arrLevelSpace(UBound(arrLevelSpace) - 1) + lenSubString + 4
                    
                    txtOu = txtOu & "("
                    txtOu = txtOu & vbLf
                    txtOu = txtOu & String(arrLevelSpace(iLevel), " ")
                    lenSubString = 0
                Else
                    txtOu = txtOu & "("
                End If
            Case ")"
                If quotesClosed Then
                    txtOu = txtOu & vbLf
                    txtOu = txtOu & String(arrLevelSpace(iLevel) - 4, " ")
                    txtOu = txtOu & ")"
                    iLevel = iLevel - 1
                    
                    lenSubString = 0
                Else
                    txtOu = txtOu & ")"
                End If
            Case ","
                If quotesClosed Then
                    txtOu = txtOu & ","
                    txtOu = txtOu & vbLf
                    txtOu = txtOu & String(arrLevelSpace(iLevel), " ")
                    
                    lenSubString = 0
                Else
                    txtOu = txtOu & ","
                End If
            Case """"
                txtOu = txtOu & """"
                quotesClosed = Not quotesClosed
            Case Else
                txtOu = txtOu & ch
            End Select
        Next
        cl.FormulaR1C1 = txtOu
    End If
End Sub

Function TrimTxtIn(txt As String) As String
    Dim arr As Variant
    arr = Split(txt, vbLf)
    Dim ii As Long
    For ii = LBound(arr) To UBound(arr)
        arr(ii) = Trim(arr(ii))
    Next
    TrimTxtIn = Join(arr, "")
End Function
 
Цитата
Jack Famous написал: вам прямо ответили на поставленный вопрос — что не нравится?
Заголовок и описание темы дал вроде бы нормально. А люди привели примеры ручной работы. Вдруг есть способы через различные "надстройки экселя" (а их в магазине столько ,что не понятно есть ли там что то подобное), либо что то ещё. А VBA надо ещё посидеть и проанализировать: имеется ли вообще возможность прикрутить расширенный редактор формул. Либо в качестве временного решения отображать отдельное окно, где бы отображалась формула активной ячейки по определённым правилам в реальном времени (желательно с положением курсора).

В нормальных редакторах по программированию (у того же MS) иерархия строится автоматом (или почти автоматом, опыт есть).
 
Так коллега МатросНаЗебре уже практически все сделал. Можно еще поиграться с Application.FormulaBarHeight.
Владимир
 
Спасибо всем.
 
Цитата
PooHkrd написал:
Есть , но он с русскими нотациями не очень дружит.
да и в целом, нужен очень серьезный ИИ который не тупо разобъет на строки, а сделает написанное понятным
вот пример реальной формулы и не шибко сложной
=(B2-LOOKUP(B2;MMULT(N(COLUMN($B$3:$U$3)<=TRANSPOSE(COLUMN($B$3:$U$3)));TRANSPOSE($B$3:$U$3))))/LOOKUP(B2;MMULT(N(COLUMN($B$3:$U$3)<=TRANSPOSE(COLUMN($B$3:$U$3)));TRANSPOSE($B$3:$U$3));$C$3:$V$3)+MATCH(B2;MMULT(N(COLUMN($B$3:$U$3)<=TRANSPOSE(COLUMN($B$3:$U$3)));TRANSPOSE($B$3:$U$3)))
Так преобразовано
Скрытый текст

так записал бы я
Скрытый текст

а такое
=SUBSTITUTE(TEXT(SUM(IFERROR(MID(SUBSTITUTE(A12:B12;{"+";"р"};REPT(" ";15));IFERROR(FIND({"п";"+"};A12:B12)+{2;1};1);15)/{1;15}*{1\-1};));"пк0\+0/15");"/15";"р")
ну стало совсем попой
Скрытый текст
Изменено: БМВ - 11.01.2022 21:50:31
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
Макрос, разбивающий формулу на строки и проставляющий отступы.
Спасибо. Сделал через надстройку, изменил немного шаг.
 
Это чтобы разобраться, надо открыть строку формул на весь экран! Да уж, такую разбивку я бы хорошему знакомому дал в качестве головоломки или недругу подсунул,  чтобы тот повесился на этой гирлянде кода )

berstrider, т.к. недругом пока не стали :), совет: откажитесь от этой затеи. Очень сложные формулы разнести по строкам вручную. А разбирать работу можно с помощью волшебной F9: выделить интересующую часть формулы, нажать кнопку - получится вычисленное этим фрагментом значение. Посмотрели, вернули фрагмент обратно. Эта часть должна быть цельной, т.е. вычисляться отдельно, например: ссылка, функция с аргументами, несколько функций.
Можно просматривать вычисления поэтапно, например: сначала вычислили ссылку (посмотрели, что там), потом глянули, что вернула функция с этой ссылкой, далее выделили функцию, в составе которой уже найденная константа...
 
Цитата
vikttur написал:
строку формул на весь экран!
хорошо тебе, у тебя большой экран, и целых два  8)
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
да и в целом, нужен очень серьезный ИИ который не тупо разобъет на строки, а сделает написанное понятным
ИИ не нужен. На этом примере я понял как надо. Фактически нужен парсер формулы с составлением её карты разделителей как областей (), "" и других ,влияющих на синтаксис формулы. Количество символов в области до определённого размера помещать в одну строку. Какие то элементы хорошо смотрятся столбиком, например, И(), ИЛИ(). Но и там могут быть нюансы. После составления карты как БД сделать обратную сборку уже по условиям. Правда не знаю, как это всё повлияет на формулы массива.

п.с. сам макросами только баловался, так что извините за фантазии :)
 
Э, нет, и на один экран такого не хочу, есть головоломки поинтереснее )
 
Цитата
написал:
Очень сложные формулы разнести по строкам вручную.
Ну этот вариант макроса тоже рабочий. Им разбить "по быстрому", а потом отдельные блоки укрупнить - а то сейчас вышла одна такая формула на страницу, а то и две)))
 
Цитата
berstrider написал:
Количество символов в области до определённого размера помещать в одну строку.
это упрощает чтение листинга кода VBA или иных языков, но как только имеете формулы Excel или pipe структуры скриптовых языков типа баша и пауэршелл, то длина уходит на второй план за реально блочной структурой , и блок это то что написал Виктор - законченное понятное действие.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: стало совсем попой
:D +++
И какой-то ARRAYROWSTOP появился  :sceptic:
Изменено: Jack Famous - 12.01.2022 08:42:59
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал: это упрощает чтение листинга кода VBA...
Так я под областью имел ввиду выражение в скобках (). Т.е. это конкретный блок, в который могут помещаться и другие (). Например, для монитора с разрешением 1280х1024, строка формул в оф365 может вмещать от 77 до 150 символов (в зависимости от контента). Если установить проверку длины блока на размер 100-120 символов, то вполне можно реализовать блочную структуру (хотя, подозреваю, тут ещё нужно делать поправку на отступы слева).
 
Цитата
berstrider написал:
ИИ не нужен. На этом примере я понял как надо. Фактически нужен парсер формулы с составлением её карты разделителей как областей (), "" и других
я занимался такой задачей уже и сразу скажу: оно того не стоит. Очень много нюансов здесь кроется. Вот только парочка:
1. Надо четко определить где название функции, а где просто аргументы в скобках. С кавычками тоже не просто. Пример
Код
=ЕСЛИ(СУММ(O40:O92;B34)+(1+2)*2*МАКС(A1:C50)>0;"";A99&" ("&ЦЕЛОЕ(G60)&" ящ."&" "&G60-ЦЕЛОЕ(G60)&" уп.)")
И это все осложняется еще и кавычками, различием разделителей, прочих точек и запятых в аргументах, которые записаны просто текстом в кавычках. Т.е. сделать универсальный инструмент весьма сложно.
2. Ссылки могут быть на другие листы и книги(которые тоже могут содержать разные знаки), не говоря о ссылках на закрытые источники.
И таких вот мелочей очень много - они возникнут по ходу создания этого чудесного инструмента :)
Изменено: Дмитрий(The_Prist) Щербаков - 12.01.2022 09:11:26
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Полностью с вами согласен. Сам думал про количество различных разделителей - тот ещё ад для разбора логической структуры.
Проще бы было, если бы сама MS озаботилась просмотром формул в наглядном логическом виде, а не просто сплошной строкой.
 
Цитата
berstrider: Проще бы было, если бы сама MS озаботилась просмотром формул в наглядном логическом виде, а не просто сплошной строкой
не согласен. Уж насколько мелкомягкие бывают оленями в плане юзерфрендли, однако тут подход весьма понятен — учитывая всю неоднозначность "наглядности логического вида" гораздо проще дать пользователю использовать пробелы и переносы для форматирования как ему нравится, чем тратить ресурсы на разработку инструмента, который никогда не будет готов на 100%, выставляя разрабов в дурном свете (опять)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
тратить ресурсы на разработку инструмента, который никогда не будет готов на 100%
и которым будет пользоваться менее 0,01% пользователей
 
Цитата
гораздо проще дать пользователю использовать пробелы и переносы для форматирования как ему нравится
тут и еще один момент есть: ограничение на кол-во знаков в формуле. И пробелы с переносами в этом случае тоже учитываются. Возможно, этот момент тоже как-то принимался во внимание. Хотя, конечно, это спорный момент, т.к. ограничение там аж в 8192 символа. Мне такую формулу представить страшно даже с переносами  :D  Но строка формул версталась давно и вряд ли сильно переделывалась. А в эпоху того же 2003 предел по кол-ву символов формулы был всего 1024. А это уже в разы меньше и этого ограничения удавалось достигать даже без всяких переносов.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал: такую формулу представить страшно даже с переносами
Я бы сказал: представить страшно без переносов, а уж с переносами!!! :)

Здась, например, на 3000 знаков. Там переноси, не переноси, а времени на разбор надо достаточно...
Страницы: 1
Наверх