Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2015, 15:24   #1
jimmyyong
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 22
По умолчанию Разбор сложной функции на составные части

Иногда случается так, что сталкиваясь со сложными функциями, включающими в себя множество других, хочется понять логику вычислений.
В следствии этого решил научить VBA выделять из сложной функции входящие в нее простые функции. И вот что у меня получилось.
Интересно услышать комментарии по этому вопросу.

ЗЫ. Подфункции вставляются непосредственно под рассматриваемой формулой
Функция Fun_FindButtomFunction - ищет простые ПОДфункции в рассматриваемой функции и каждый раз возвращает одну простую функцию.

SS.jpg

Код:
Sub FunctionDisassemble()
   Dim i As Byte
   Dim R1 As Range
   Dim TXT_F As String, F_Eng As String, F_Rus As String

   Set R1 = Application.InputBox(Prompt:="Выберите ячейку для разбора функции", Type:=8).Cells(1)
   TXT_F = R1.Formula

   'Перебираем основную формулу пока внутри нее есть формулы 
   Do While TXT_F Like "*[A-Za-z](*)*"
        i = i + 1
        'Ищем формулу нижнего уровня
        F_Eng = Fun_FindButtomFunction(TXT_F)
        'Вставляем найденную формулу
        R1.Offset(i, 1).Formula = "=" & F_Eng
        'Удаляем формулу из строки
        TXT_F = Replace(TXT_F, F_Eng, R1.Offset(i, 1).Address)
        'Выделяем и вставляем название формулы на русском
        F_Rus = R1.Offset(i, 1).FormulaLocal
        R1.Offset(i, 0) = Mid(F_Rus, 2, InStr(1, F_Rus, "(") - 2)
   Loop
End Sub

Function Fun_FindButtomFunction(ByVal TXT As String) As String
   Dim i As Integer, N_Start As Integer, N_End As Integer, Start_Bracket  As Integer
   ' Поиск закрывающей скобки
   For i = 1 To Len(TXT)
            If Mid(TXT, i, 1) = ")" Then
               N_End = i
                                Exit For
            End If
   Next i
   If N_End = 0 Then Exit Function

   ' Поиск открывающей скобки
   For i = N_End To 1 Step -1
       If Mid(TXT, i, 1) = "(" Then Start_Bracket = i: Exit For
   Next i
   If Start_Bracket = 0 Then Exit Function

   'Поиск названия функции
   For i = Start_Bracket - 1 To 1 Step -1
   If Not Mid(TXT, i, 1) Like "[A-Za-z]" Then N_Start = i + 1: Exit For
   Next i

   Fun_FindButtomFunction = Mid(TXT, N_Start, N_End - N_Start + 1)
End Function
Вложения
Тип файла: rar RazbFun.rar (17.6 Кб, 8 просмотров)

Последний раз редактировалось jimmyyong; 16.06.2015 в 16:07.
jimmyyong вне форума Ответить с цитированием
Старый 16.06.2015, 16:32   #2
ShAM66
Форумчанин
 
Регистрация: 24.02.2012
Сообщений: 160
По умолчанию

При этом не забываем про волшебную клавишу F9.
http://www.excelworld.ru/publ/hacks/...las/17-1-0-142
ShAM66 вне форума Ответить с цитированием
Старый 16.06.2015, 17:13   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

я когда-то поставил себе задачу скромнее
разбить большую формулу на составляющие в скобках
у меня получилось так:
Код:
Function NumCkobki(s0 As String) As String
'разбивает длинную формулу на фрагменты заключенные в скобки (*)
  c = 0: s = ""
  For i = 1 To Len(s0)
    ch = Mid(s0, i, 1)
    If ch = "(" Then
      c = c + 1
      s = s & Chr(10)
      For n = 1 To c * 2
        s = s & " "
      Next
      s = s & LTrim(Str(c))
    End If
    If ch = ")" Then
      s = s & Chr(10)
      For n = 1 To c * 2
        s = s & " "
      Next
      c = c - 1
    End If
    s = s & ch
  Next
  NumCkobki = s
  Debug.Print s
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.06.2015, 19:21   #4
jimmyyong
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
я когда-то поставил себе задачу скромнее
разбить большую формулу на составляющие в скобках
Уважаемый IgorGo Ваша функция интересна, но по крайней мере для меня не совсем понятно как Вы ее используете(-вали). Будьте так любезны приложить какой-либо файл-пример ее использования.
jimmyyong вне форума Ответить с цитированием
Старый 16.06.2015, 21:30   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

формула используемая в соседней теме в жизни выглядит так:
Код:
=СУММ(--(МУМНОЖ(ТРАНСП(--(RC[-1]=R2C2:R366C2));--(R2C1:R366C1=СТОЛБЕЦ(C1:C34)))>0))
а обработанная предложенной функцией так
Код:
=СУММ
  1(--
    2(МУМНОЖ
      3(ТРАНСП
        4(--
          5(RC[-1]=R2C2:R366C2
          )
        );--
        4(R2C1:R366C1=СТОЛБЕЦ
          5(C1:C34
          )
        )
      )>0
    )
  )
формула становиться структурной
открывающиеся скобки пронумерованы, вертикально под номером открывающейся скобки есть соотв. ей закрывающаяся скобка
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Производная сложной функции в Excel ! gffdse33 Microsoft Office Excel 8 27.06.2012 01:22
Решение сложной функции в C++ Shadroz Помощь студентам 2 18.03.2012 19:59
Построить график сложной функции hike7 C# (си шарп) 1 29.06.2011 02:38
Чтение строки данных и разбор на отдельные части }|{opa KopHeB Помощь студентам 2 27.01.2011 23:28
разбор строки на части Wi1D Общие вопросы C/C++ 7 27.12.2009 23:31