В порядке тренировки и спортивного интереса ради собрал модуль, который позволяет удобнее просмотреть формулу*.
Ограничения:
1). Работает корректно только на Русском Excel. 2). В формуле должны отсутствовать заключенные в двойные кавычки комбинации символов, имитирующие подсвечиваемый синтаксис (в частности ";"). 3). Возможно, чего-то не учёл, просьба сообщить о любых замеченных багах.
Описание:
1). При активации макроса Rio_Takes_a_Look пользователю предлагается выбрать ячейку, формула которой будет изучаться. 2). Формула раскладывается на молекулы "расслаивается" на уровни вложения** вниз от выбранной ячейки. 3). Символами <<< и >>> выделяется текущий уровень рассмотрения. 4). На текущем уровне рассмотрения все точки с запятой, разделяющие аргументы, заменяются на ...[и]... 5). Для удобства просмотра структуры функции некоторые части оной разбиваются пробелами. 6). На более "глубоких" уровнях пропуски заменяются на [[...]] 7). Функция Rio_Investigates_Formula может быть использована самостоятельно. Первый аргумент - ячейка, второй - "уровень".
Код программы:
Другие две части кода выложу отдельно, лимит на длину сообщения. [vba]
Код
Option Explicit Option Base 1
Dim StepX As Long Dim RowX As Long Dim ColX As Long
Sub Rio_Takes_a_Look()
Dim bA As Byte 'To check when to stop Do circle Dim rngA As Range 'To select what to look at
Set rngA = Application.InputBox(prompt:="Выбирете ячейку для разложения структуры формулы по уровням вложения.", Type:=8)
RowX = rngA.Row ColX = rngA.Column StepX = 1
Do While bA = 0 Cells(RowX + StepX, ColX).Value = Rio_Investigates_Formula(rngA, StepX) If Len(Cells(RowX + StepX, ColX).Value) = 13 Then bA = 1 Call Rio_ReColor(Cells(RowX + StepX, ColX)) StepX = StepX + 1 Loop
End Sub
[/vba]
Просьба проверить, работает ли у Вас данный проект. Буду рад любым мнениям, мыслям и отзывам по теме.
В качестве примера прикладываю файл с кнопой, формулы взял из этой ТЕМЫ. После нажатия на кнопку выбрать жёлтую ячейку.
Расшифровки звёздочек:
* Удобнее - на мой сугубо субъективный взгляд. Предполагаете, как сделать лучше? Открыт для идей =) ** Уровни вложения - кривоватое словосочетание, наверно, не очень техничное. Как бы назвать адекватнее?
Всем привет и хорошего настроения!
В порядке тренировки и спортивного интереса ради собрал модуль, который позволяет удобнее просмотреть формулу*.
Ограничения:
1). Работает корректно только на Русском Excel. 2). В формуле должны отсутствовать заключенные в двойные кавычки комбинации символов, имитирующие подсвечиваемый синтаксис (в частности ";"). 3). Возможно, чего-то не учёл, просьба сообщить о любых замеченных багах.
Описание:
1). При активации макроса Rio_Takes_a_Look пользователю предлагается выбрать ячейку, формула которой будет изучаться. 2). Формула раскладывается на молекулы "расслаивается" на уровни вложения** вниз от выбранной ячейки. 3). Символами <<< и >>> выделяется текущий уровень рассмотрения. 4). На текущем уровне рассмотрения все точки с запятой, разделяющие аргументы, заменяются на ...[и]... 5). Для удобства просмотра структуры функции некоторые части оной разбиваются пробелами. 6). На более "глубоких" уровнях пропуски заменяются на [[...]] 7). Функция Rio_Investigates_Formula может быть использована самостоятельно. Первый аргумент - ячейка, второй - "уровень".
Код программы:
Другие две части кода выложу отдельно, лимит на длину сообщения. [vba]
Код
Option Explicit Option Base 1
Dim StepX As Long Dim RowX As Long Dim ColX As Long
Sub Rio_Takes_a_Look()
Dim bA As Byte 'To check when to stop Do circle Dim rngA As Range 'To select what to look at
Set rngA = Application.InputBox(prompt:="Выбирете ячейку для разложения структуры формулы по уровням вложения.", Type:=8)
RowX = rngA.Row ColX = rngA.Column StepX = 1
Do While bA = 0 Cells(RowX + StepX, ColX).Value = Rio_Investigates_Formula(rngA, StepX) If Len(Cells(RowX + StepX, ColX).Value) = 13 Then bA = 1 Call Rio_ReColor(Cells(RowX + StepX, ColX)) StepX = StepX + 1 Loop
End Sub
[/vba]
Просьба проверить, работает ли у Вас данный проект. Буду рад любым мнениям, мыслям и отзывам по теме.
В качестве примера прикладываю файл с кнопой, формулы взял из этой ТЕМЫ. После нажатия на кнопку выбрать жёлтую ячейку.
Расшифровки звёздочек:
* Удобнее - на мой сугубо субъективный взгляд. Предполагаете, как сделать лучше? Открыт для идей =) ** Уровни вложения - кривоватое словосочетание, наверно, не очень техничное. Как бы назвать адекватнее?
Function Rio_Investigates_Formula(FormulaX As Range, LevelX As Long) As String
Dim arrX As Variant 'Array with single symbols for each row Dim strX As String 'To work with Formula string Dim A As Long 'How long formula is Dim X As Long 'To roll arrX Dim DeepX As Long 'How deep are we Dim LevelCheck As Byte 'To control where to place [[...]]
strX = FormulaX.FormulaLocal
A = Len(strX) - 1 strX = Right(strX, A) DeepX = 1 LevelCheck = 1
ReDim arrX(A, 3)
For X = 1 To A arrX(X, 1) = Mid(strX, X, 1) Select Case arrX(X, 1) Case "(" arrX(X, 2) = DeepX DeepX = DeepX + 1 If arrX(X, 2) = LevelX Then arrX(X, 1) = " <<< " Case ")" DeepX = DeepX - 1 arrX(X, 2) = DeepX If arrX(X, 2) = LevelX Then arrX(X, 1) = " >>> " Case ";" arrX(X, 2) = DeepX arrX(X, 3) = 1 If arrX(X, 2) = LevelX + 1 Then arrX(X, 1) = " ...[и]... " Case Else arrX(X, 2) = DeepX End Select If LevelX <= arrX(X, 2) Then Rio_Investigates_Formula = Rio_Investigates_Formula & arrX(X, 1) LevelCheck = 1 Else If LevelCheck = 1 Then LevelCheck = 0 Rio_Investigates_Formula = Rio_Investigates_Formula & " [[...]] " End If End If Next X
For A = 1 To Len(rngR.Value) Select Case Mid(rngR.Value, A, 1) Case "<" If Mid(rngR.Value, A + 1, 1) = "<" Then With rngR.Characters(Start:=A, Length:=3).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 2 End If Case ">" If Mid(rngR.Value, A + 1, 1) = ">" Then With rngR.Characters(Start:=A, Length:=3).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 2 End If Case "[" Select Case Mid(rngR.Value, A + 1, 1) Case "и" With rngR.Characters(Start:=(A - 3), Length:=9).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 5 Case "[" With rngR.Characters(Start:=A, Length:=7).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 6 End Select End Select Next A
End Sub
[/vba]
Должны быть с первой частью в одном модуле:
[vba]
Код
Function Rio_Investigates_Formula(FormulaX As Range, LevelX As Long) As String
Dim arrX As Variant 'Array with single symbols for each row Dim strX As String 'To work with Formula string Dim A As Long 'How long formula is Dim X As Long 'To roll arrX Dim DeepX As Long 'How deep are we Dim LevelCheck As Byte 'To control where to place [[...]]
strX = FormulaX.FormulaLocal
A = Len(strX) - 1 strX = Right(strX, A) DeepX = 1 LevelCheck = 1
ReDim arrX(A, 3)
For X = 1 To A arrX(X, 1) = Mid(strX, X, 1) Select Case arrX(X, 1) Case "(" arrX(X, 2) = DeepX DeepX = DeepX + 1 If arrX(X, 2) = LevelX Then arrX(X, 1) = " <<< " Case ")" DeepX = DeepX - 1 arrX(X, 2) = DeepX If arrX(X, 2) = LevelX Then arrX(X, 1) = " >>> " Case ";" arrX(X, 2) = DeepX arrX(X, 3) = 1 If arrX(X, 2) = LevelX + 1 Then arrX(X, 1) = " ...[и]... " Case Else arrX(X, 2) = DeepX End Select If LevelX <= arrX(X, 2) Then Rio_Investigates_Formula = Rio_Investigates_Formula & arrX(X, 1) LevelCheck = 1 Else If LevelCheck = 1 Then LevelCheck = 0 Rio_Investigates_Formula = Rio_Investigates_Formula & " [[...]] " End If End If Next X
For A = 1 To Len(rngR.Value) Select Case Mid(rngR.Value, A, 1) Case "<" If Mid(rngR.Value, A + 1, 1) = "<" Then With rngR.Characters(Start:=A, Length:=3).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 2 End If Case ">" If Mid(rngR.Value, A + 1, 1) = ">" Then With rngR.Characters(Start:=A, Length:=3).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 2 End If Case "[" Select Case Mid(rngR.Value, A + 1, 1) Case "и" With rngR.Characters(Start:=(A - 3), Length:=9).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 5 Case "[" With rngR.Characters(Start:=A, Length:=7).Font .FontStyle = "полужирный" .Color = -16776961 End With A = A + 6 End Select End Select Next A
Привет, Роман для InputBox желательно как-то вот так (в случае, если пользовательнажал Отмена) [vba]
Код
On Error Resume Next Set rngA = Application.InputBox(prompt:="Выберите ячейку для разложения структуры формулы по уровням вложения.", Type:=8) If rngA Is Nothing Then Exit Sub On Error GoTo 0
[/vba]
Привет, Роман для InputBox желательно как-то вот так (в случае, если пользовательнажал Отмена) [vba]
Код
On Error Resume Next Set rngA = Application.InputBox(prompt:="Выберите ячейку для разложения структуры формулы по уровням вложения.", Type:=8) If rngA Is Nothing Then Exit Sub On Error GoTo 0
Еще так, навскидку Скринапдейтинг добавить нужно бы Защиту от того, что пользователь выбрал пустую ячейку Проверка на то, что в выделенном диапазоне одна формула (на случай, если ячейки объединенные - несколько ячеек выделять можно, но проверяем только левую верхнюю) Вообще обработчик ошибок, чтобы в отладчик не вылетало, а тихо макрос умирал (или сообщение выдавал)
Еще так, навскидку Скринапдейтинг добавить нужно бы Защиту от того, что пользователь выбрал пустую ячейку Проверка на то, что в выделенном диапазоне одна формула (на случай, если ячейки объединенные - несколько ячеек выделять можно, но проверяем только левую верхнюю) Вообще обработчик ошибок, чтобы в отладчик не вылетало, а тихо макрос умирал (или сообщение выдавал)_Boroda_
...а еще как-то доработать, чтобы было похоже на окно "Вычисление формулы" (вкладка Формулы - Вычислить формулу) с пошаговым вычислением. Вот тогда бы...
...а еще как-то доработать, чтобы было похоже на окно "Вычисление формулы" (вкладка Формулы - Вычислить формулу) с пошаговым вычислением. Вот тогда бы... nilem
Яндекс.Деньги 4100159601573
Сообщение отредактировал nilem - Четверг, 16.10.2014, 21:48
доработать, чтобы было похоже на окно "Вычисление формулы"
Задача звучит довольно вкусно =) Но нужная особая идея, чтобы решение превзошло стандартный функционал. *И такой вопросительно-выжидающий взгляд* В банальном и механическом дублировании трудно найти спортивный интерес.
доработать, чтобы было похоже на окно "Вычисление формулы"
Задача звучит довольно вкусно =) Но нужная особая идея, чтобы решение превзошло стандартный функционал. *И такой вопросительно-выжидающий взгляд* В банальном и механическом дублировании трудно найти спортивный интерес.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279