В этот солнечный нерабочий день пришла мне в голову одна мысль, которую я постараюсь сейчас изложить. Часто, при решении поставленной задачи, большие многоэтажные формулы сложно написать сходу, поэтому я прописываю формулы поэтапно в несколько ячеек. После получения результата, все формулы "ручками" объединяю в одной ячейке (см. наглядный пример). Вопрос в следующем: существует ли какой нибудь автоматизированный (надстройка, макрос, что-то еще) способ объединения формул в одну "многоэтажную"?
В этот солнечный нерабочий день пришла мне в голову одна мысль, которую я постараюсь сейчас изложить. Часто, при решении поставленной задачи, большие многоэтажные формулы сложно написать сходу, поэтому я прописываю формулы поэтапно в несколько ячеек. После получения результата, все формулы "ручками" объединяю в одной ячейке (см. наглядный пример). Вопрос в следующем: существует ли какой нибудь автоматизированный (надстройка, макрос, что-то еще) способ объединения формул в одну "многоэтажную"?
Для того, что бы реализовать, то что Вы хотите, необходимо, как минимум, написать алгоритм конкатенации частей итоговой формулы. Для этого формулы предварительно надо перевести в текст. При агрегировании надо учесть синтаксис формул и функций. После конкатенации надо вычислить формулы
Вобщем, какой смысл заморачиваться, если на VBA можно сразу получить результат, не используя функции листа Excel?
Russel, да, достаточно сложный
Для того, что бы реализовать, то что Вы хотите, необходимо, как минимум, написать алгоритм конкатенации частей итоговой формулы. Для этого формулы предварительно надо перевести в текст. При агрегировании надо учесть синтаксис формул и функций. После конкатенации надо вычислить формулы
Вобщем, какой смысл заморачиваться, если на VBA можно сразу получить результат, не используя функции листа Excel?Serge_007
Serge_007, мало чего понимаю в алгоритмах и в VBA, спасибо Вам за ликбез! На всякий случай, если все-таки будет "спортивный" интерес, на соседнем форуме писал алгоритм: Как на мой взгляд должен работать макрос: 1. Выделяем ячейки, участвующие в получении результата (в приложенном примере диапазон B7:B10); 2. Макрос пробегает по всем формулам и ищет ячейку, на которую не ссылается ни одна другая (В10) Макрос спрашивает, в какой из выделенных ячеек содержится окончательный результат (в приложенном примере В10); 3. Макрос просматривает формулу в найденной указанной ячейке, и подменяет ссылки на ячейки из первоначального диапазона их содержимым (естественно, без "="); 4. п.3 повторяется несколько раз (число ячеек в первоначальном диапазоне); 5. Получившуюся в результате формулу макрос записывает в какую-нибудь ячейку, например В11. ИМХО, синтаксис формул и функций не важен, так как в текстовой строке формулы нужно искать конкретные ссылки В7, В8, В9.
Serge_007, мало чего понимаю в алгоритмах и в VBA, спасибо Вам за ликбез! На всякий случай, если все-таки будет "спортивный" интерес, на соседнем форуме писал алгоритм: Как на мой взгляд должен работать макрос: 1. Выделяем ячейки, участвующие в получении результата (в приложенном примере диапазон B7:B10); 2. Макрос пробегает по всем формулам и ищет ячейку, на которую не ссылается ни одна другая (В10) Макрос спрашивает, в какой из выделенных ячеек содержится окончательный результат (в приложенном примере В10); 3. Макрос просматривает формулу в найденной указанной ячейке, и подменяет ссылки на ячейки из первоначального диапазона их содержимым (естественно, без "="); 4. п.3 повторяется несколько раз (число ячеек в первоначальном диапазоне); 5. Получившуюся в результате формулу макрос записывает в какую-нибудь ячейку, например В11. ИМХО, синтаксис формул и функций не важен, так как в текстовой строке формулы нужно искать конкретные ссылки В7, В8, В9.Russel
Про смысл я писал в первом сообщении. Мне удобно большие формулы разбивать на куски-этапы вычислений, которые я потом объединяю в общую формулу, вот и хотелось как-то автоматизировать этот процесс. Спасибо за консультацию!
Про смысл я писал в первом сообщении. Мне удобно большие формулы разбивать на куски-этапы вычислений, которые я потом объединяю в общую формулу, вот и хотелось как-то автоматизировать этот процесс. Спасибо за консультацию!Russel
Сергей, так вычисления же на листе, а не на VBA. Я тоже так часто делаю, разбиваю вычисление на этапы, как в файле у Russel-а. Чудо-кнопка была бы очень кстати
Сергей, так вычисления же на листе, а не на VBA. Я тоже так часто делаю, разбиваю вычисление на этапы, как в файле у Russel-а. Чудо-кнопка была бы очень кстати ShAM
Проверил только на задаче из первого сообщения Код[vba]
Код
Sub Formula() Dim i As Long, iFormula As String Set rg = Selection For i = rg.Count To 1 Step -1 With rg.Item(i) iFormula = IIf(i = rg.Count, .Formula, Replace(iFormula, .Address(0, 0), Mid(.Formula, 2))) End With Next i rg.Item(rg.Count + 1).Formula = iFormula End Sub
[/vba]
Проверил только на задаче из первого сообщения Код[vba]
Код
Sub Formula() Dim i As Long, iFormula As String Set rg = Selection For i = rg.Count To 1 Step -1 With rg.Item(i) iFormula = IIf(i = rg.Count, .Formula, Replace(iFormula, .Address(0, 0), Mid(.Formula, 2))) End With Next i rg.Item(rg.Count + 1).Formula = iFormula End Sub
Изменил код. Теперь формулу можно объединить с константами [vba]
Код
Sub Formula() Dim i As Long, iFormula As String Set rg = Selection For i = rg.Count To 1 Step -1 iFormula = IIf(i = rg.Count, rg.Item(i).Formula, Replace(iFormula, rg.Item(i).Address(0, 0), _ IIf(Left(rg.Item(i).Formula, 1) = "=", Mid(rg.Item(i).Formula, 2), _ IIf(IsNumeric(rg.Item(i)), rg.Item(i), """" & rg.Item(i) & """")))) Next i rg.Item(rg.Count + 1).Formula = iFormula End Sub
[/vba]
Изменил код. Теперь формулу можно объединить с константами [vba]
Код
Sub Formula() Dim i As Long, iFormula As String Set rg = Selection For i = rg.Count To 1 Step -1 iFormula = IIf(i = rg.Count, rg.Item(i).Formula, Replace(iFormula, rg.Item(i).Address(0, 0), _ IIf(Left(rg.Item(i).Formula, 1) = "=", Mid(rg.Item(i).Formula, 2), _ IIf(IsNumeric(rg.Item(i)), rg.Item(i), """" & rg.Item(i) & """")))) Next i rg.Item(rg.Count + 1).Formula = iFormula End Sub