Всем доброго времени суток Передо мной стала следующая проблема , решение которой на не могу найти : Имеется ячейка вида А5=А1+А2*3 , если , скажем , А1=1 , в ячейке А2 находится формула , скажем А2=А3+А4 , когда А3=3 , А4=4 . Мне нужно , что бы результат был вида "1+(2+4)*3" Первое условие - если это возможно , то что бы формула была в скобках , та что во второстепенной ячейке Второе условие - что бы знак "*" был всегда вида "∙" Условие третье - формула в ячейке А2 может быть любой длинны , скажем вида "=IF(F114=0,IF(F116=0,IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112), (IF(F117="положено",IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112), IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"-"&F116&"∙1.5"))), IF(F116=0,IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"+("&IF(F114=ROUND(F114,0),F114&".0",F114)&"∙"&IF(F115=ROUND(F115,0),F115&".0",F115)&")", (IF(F117="положено", IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"+("&IF(F114=ROUND(F114,0),F114&".0",F114)&"∙"&IF(F115=ROUND(F115,0),F115&".0",F115)&")", IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"+("&IF(F114=ROUND(F114,0),F114&".0",F114)&"∙"&IF(F115=ROUND(F115,0),F115&".0",F115)&")-"&F116&"∙1.5"))))"
Дело в том что у меня есть объект , на котором я составляю сметы , договор состоит из 110 пунктов , и трёхзначное количество столбцов , это ещё не конец , там будет ещё столько же , мне нужно показывать вычисления , я уже почти всё автоматизировал , даже печать , и даты , а вот с этим сам справится не могу .
Всем доброго времени суток Передо мной стала следующая проблема , решение которой на не могу найти : Имеется ячейка вида А5=А1+А2*3 , если , скажем , А1=1 , в ячейке А2 находится формула , скажем А2=А3+А4 , когда А3=3 , А4=4 . Мне нужно , что бы результат был вида "1+(2+4)*3" Первое условие - если это возможно , то что бы формула была в скобках , та что во второстепенной ячейке Второе условие - что бы знак "*" был всегда вида "∙" Условие третье - формула в ячейке А2 может быть любой длинны , скажем вида "=IF(F114=0,IF(F116=0,IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112), (IF(F117="положено",IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112), IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"-"&F116&"∙1.5"))), IF(F116=0,IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"+("&IF(F114=ROUND(F114,0),F114&".0",F114)&"∙"&IF(F115=ROUND(F115,0),F115&".0",F115)&")", (IF(F117="положено", IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"+("&IF(F114=ROUND(F114,0),F114&".0",F114)&"∙"&IF(F115=ROUND(F115,0),F115&".0",F115)&")", IF(F111=ROUND(F111,0),F111&".0",F111)&"∙"&IF(F112=ROUND(F112,0),F112&".0",F112)&"+("&IF(F114=ROUND(F114,0),F114&".0",F114)&"∙"&IF(F115=ROUND(F115,0),F115&".0",F115)&")-"&F116&"∙1.5"))))"
Дело в том что у меня есть объект , на котором я составляю сметы , договор состоит из 110 пунктов , и трёхзначное количество столбцов , это ещё не конец , там будет ещё столько же , мне нужно показывать вычисления , я уже почти всё автоматизировал , даже печать , и даты , а вот с этим сам справится не могу .zapoganchik
Serge_007, Мдя ... из всей длинной формулы "ифов" , которые я написал в первом сообщении , мне нужно получить короткую строчку вычислений , причём только то , что действительно приводит к ответу . Не сам ответ , а алгоритм вычисления , что ли ... В ячейке F8 написана длинная цепочка ифов , ответ должен быть как в ячейке Q8 ... Функция в ячейке F10 обращается и к результату вычислений в ячейках F12 и F13 , в которых записаны так же функции . Так более понятно ? даже не знаю что не понятно , я даже не могу сформулировать вопрос ... Может вы мне скажете что именно не понятно ?
Serge_007, Мдя ... из всей длинной формулы "ифов" , которые я написал в первом сообщении , мне нужно получить короткую строчку вычислений , причём только то , что действительно приводит к ответу . Не сам ответ , а алгоритм вычисления , что ли ... В ячейке F8 написана длинная цепочка ифов , ответ должен быть как в ячейке Q8 ... Функция в ячейке F10 обращается и к результату вычислений в ячейках F12 и F13 , в которых записаны так же функции . Так более понятно ? даже не знаю что не понятно , я даже не могу сформулировать вопрос ... Может вы мне скажете что именно не понятно ?zapoganchik
Учитывая "договор состоит из 110 пунктов , и трёхзначное количество столбцов , это ещё не конец ", я на вашем месте сделал-бы так: создал 5 столбцов (скрытых, на другом листе... - как нравится) 1 -результат вычислений = 1 2 -результат вычислений = 2 3 -результат вычислений = 4 4 -результат вычислений = 3 5 -результат вычислений = ИТОГ
6- формула текстовой строки вида А & 1 & B & 2 & C 5 4 & D & 4 = 5
По крайней мере с If-ми разбираться значительно проще
Учитывая "договор состоит из 110 пунктов , и трёхзначное количество столбцов , это ещё не конец ", я на вашем месте сделал-бы так: создал 5 столбцов (скрытых, на другом листе... - как нравится) 1 -результат вычислений = 1 2 -результат вычислений = 2 3 -результат вычислений = 4 4 -результат вычислений = 3 5 -результат вычислений = ИТОГ
6- формула текстовой строки вида А & 1 & B & 2 & C 5 4 & D & 4 = 5
По крайней мере с If-ми разбираться значительно прощеRAN
RAN, Дело в том что там идёт не "тупая" подстановка значений , а каждое подставляемое число зависит от условия . Например : когда заливают балку в доме , у неё разные длины - длина до 3-х метров считается бо одной формуле , с с-х до 7-и по другой , и после 7-ми уже по третьей . вот я и мучаюсь . До сих пор кое-как справлялся , написал четырёх этажные формулы , которые проверяют кучу всего , а сейчас м ну уже больше не могу , тошнит смотреть на всё тоже самое . Пытался написать макрос , получился ужасного вида , но работал . Тобишь он правил;но вычислял результат , а вот что бы показать алгоритм вычисления , что ли , не получилось . Как назвать правильно процедуру выполнения последовательных действий ? Алгоритм ? Т.е. я хочу что бы в ячейке выводился алгоритм вычислений вида "1+(2+4)*3" ..? Кстати , я именно так и сделал, как вы предложили , вот пример :
дело в том что эта ячейка не меняется , если в родной ячейке я приписла , скажем "+2" . Значит мне надо запомнить , где и что я дописал , и пото в этой ячейке добавить . так не получается , потому значения в этим скрытом столбце должны быть универсальны . А так же если приписал "+2" в начале строки ? Не работает ....
RAN, Дело в том что там идёт не "тупая" подстановка значений , а каждое подставляемое число зависит от условия . Например : когда заливают балку в доме , у неё разные длины - длина до 3-х метров считается бо одной формуле , с с-х до 7-и по другой , и после 7-ми уже по третьей . вот я и мучаюсь . До сих пор кое-как справлялся , написал четырёх этажные формулы , которые проверяют кучу всего , а сейчас м ну уже больше не могу , тошнит смотреть на всё тоже самое . Пытался написать макрос , получился ужасного вида , но работал . Тобишь он правил;но вычислял результат , а вот что бы показать алгоритм вычисления , что ли , не получилось . Как назвать правильно процедуру выполнения последовательных действий ? Алгоритм ? Т.е. я хочу что бы в ячейке выводился алгоритм вычислений вида "1+(2+4)*3" ..? Кстати , я именно так и сделал, как вы предложили , вот пример :
дело в том что эта ячейка не меняется , если в родной ячейке я приписла , скажем "+2" . Значит мне надо запомнить , где и что я дописал , и пото в этой ячейке добавить . так не получается , потому значения в этим скрытом столбце должны быть универсальны . А так же если приписал "+2" в начале строки ? Не работает ....zapoganchik
Сообщение отредактировал zapoganchik - Суббота, 22.10.2011, 22:39
Ничего (или все) - как вам больше нравится! Пока ваша задача сильно напоминает задачу, поставленную ~ 40 лет назад великому КРИ "Создать семиногого барана без органов равновесия"
Quote (zapoganchik)
Может вы мне скажете что именно не понятно ?
Ничего (или все) - как вам больше нравится! Пока ваша задача сильно напоминает задачу, поставленную ~ 40 лет назад великому КРИ "Создать семиногого барана без органов равновесия"RAN
RAN, как же мне себя объяснить-то ..? Имеется формула вида =IF(A22=0, A13*0.16, A13*0.11+A12*0.2) допустим , по всем параметрам истинным является вычисление "A13*0.11+A12*0.2" . Заметим , что в ячейках А12 и А13 уже есть формулы , там не значения , а именно формулы . Требуется в соседней ячейке получить "(2.3∙5.8+(-1∙0.2))∙0.11+(2.3∙5.8)∙0.2" . Первая часть выражения ("(2.3∙5.8+(-1∙0.2))") , это формула , которая написана в ячейке А13 , далее умножение на 0.11 , это продолжение формулы в родной ячейке , далее плюс (2.3∙5.8) , это формула из ячейки А12 , которая умножается на 0.2 , это уже формула в родной ячейке . Так более понятно ? Подправил пример
RAN, как же мне себя объяснить-то ..? Имеется формула вида =IF(A22=0, A13*0.16, A13*0.11+A12*0.2) допустим , по всем параметрам истинным является вычисление "A13*0.11+A12*0.2" . Заметим , что в ячейках А12 и А13 уже есть формулы , там не значения , а именно формулы . Требуется в соседней ячейке получить "(2.3∙5.8+(-1∙0.2))∙0.11+(2.3∙5.8)∙0.2" . Первая часть выражения ("(2.3∙5.8+(-1∙0.2))") , это формула , которая написана в ячейке А13 , далее умножение на 0.11 , это продолжение формулы в родной ячейке , далее плюс (2.3∙5.8) , это формула из ячейки А12 , которая умножается на 0.2 , это уже формула в родной ячейке . Так более понятно ? Подправил примерzapoganchik
Что вам сказать... Делайте не 5, а 55 (555???) дополнительных столбцов, по количеству промежуточных вычислений, каторые вы хотите видеть в текстовой строке.
Что вам сказать... Делайте не 5, а 55 (555???) дополнительных столбцов, по количеству промежуточных вычислений, каторые вы хотите видеть в текстовой строке.RAN
Michael_S, Михаил спасибо за приложенные усилия , но это совсем не то . Обратите внимание , что в первом посте у меня написано более сложно подобное условие . Тут нужен макрос , который может разлочать между отдельными цифрами и ссылками на ячейки . Тобишь есть разница между "2" и "А2" . В первую очередь макрос должен различать это , он должен "знать" что перед ним - ссылка , или число . После этого , если ссылка - взять значение из нижной ячейки , если число - оставить как есть . Проблема в том , что он ( макрос ) долже знать по какому пути эксель вычисляет , и брать именно тот алгоритм вычисления (?) , по которому идёт эксель . Не всю срочку ифов переводить в текст , а только тот кусок , по которому считает эксель . Может сейчас более понятно ? Хорошего дня
Michael_S, Михаил спасибо за приложенные усилия , но это совсем не то . Обратите внимание , что в первом посте у меня написано более сложно подобное условие . Тут нужен макрос , который может разлочать между отдельными цифрами и ссылками на ячейки . Тобишь есть разница между "2" и "А2" . В первую очередь макрос должен различать это , он должен "знать" что перед ним - ссылка , или число . После этого , если ссылка - взять значение из нижной ячейки , если число - оставить как есть . Проблема в том , что он ( макрос ) долже знать по какому пути эксель вычисляет , и брать именно тот алгоритм вычисления (?) , по которому идёт эксель . Не всю срочку ифов переводить в текст , а только тот кусок , по которому считает эксель . Может сейчас более понятно ? Хорошего дняzapoganchik
Сообщение отредактировал zapoganchik - Воскресенье, 23.10.2011, 15:38
Но ведь ваша формула прописана ЗАРАНЕЕ, зачем ее еще и макросом вычислять? По тем же условиям, что проводятся вычисления выводим нужную формулу.
Но ведь ваша формула прописана ЗАРАНЕЕ, зачем ее еще и макросом вычислять? По тем же условиям, что проводятся вычисления выводим нужную формулу.Michael_S
Michael_S проблема в добавлении . Если я в строчке добавлю "+2" , они ни как не отобразятся в вычислении . У меня две разные ячейки выполняют похожии вункции . как предложил RAN, у меня уже есть 2 разных ячейки : одна вида как вы предожили , а вторая чисто вычисления . Если я в ячейке , назовём её "вычисления" вношу какое-нибудь изменение , оно ( изменение ) никак не отображается в ячейке , в которой формула , как вы предложили . Есть разница между =IF(A1=2, 3+A2 , 4+A3)+2 и =IF(A1=2 , "3+" & A2, "4+" & A3) Понимаете ? я не могу прописывать в ручную каждый раз во втором варианте "+2" . А если вместо "+2" будет "+А4" ? Вот для этого то и нужен макрос , который будет всё сам складывать . Надеюсь сейчас моя проблема стала более понятна Спасибо и удачи
Michael_S проблема в добавлении . Если я в строчке добавлю "+2" , они ни как не отобразятся в вычислении . У меня две разные ячейки выполняют похожии вункции . как предложил RAN, у меня уже есть 2 разных ячейки : одна вида как вы предожили , а вторая чисто вычисления . Если я в ячейке , назовём её "вычисления" вношу какое-нибудь изменение , оно ( изменение ) никак не отображается в ячейке , в которой формула , как вы предложили . Есть разница между =IF(A1=2, 3+A2 , 4+A3)+2 и =IF(A1=2 , "3+" & A2, "4+" & A3) Понимаете ? я не могу прописывать в ручную каждый раз во втором варианте "+2" . А если вместо "+2" будет "+А4" ? Вот для этого то и нужен макрос , который будет всё сам складывать . Надеюсь сейчас моя проблема стала более понятна Спасибо и удачиzapoganchik
Сообщение отредактировал zapoganchik - Воскресенье, 23.10.2011, 15:47
Может более наглядно о моей проблеме скажет следующий макрос :
Quote
Sub smeta() Application.ScreenUpdating = True Dim NewWS, OldWS As Worksheet Dim L, M, N, Q, QT As Integer Set OldWS = ActiveSheet Set NewWS = Sheets("Temp") Sheets("Temp").Select Range("A1:H100").Clear For Q = 9 To OldWS.UsedRange.Columns.Count If OldWS.Cells(5, Q).Value = NewWS.Cells(2, 2) Then QT = Q End If Next Q M = 13 For L = 6 To 110 If OldWS.Cells(L, 6).Value <> 0 Then For N = 1 To 8 If N = 4 Then If (Isdigit(Right$(Left$(OldWS.Cells(L, QT).Formula, 2), 1))) Then NewWS.Cells(M, 4) = Right$(OldWS.Cells(L, QT).Formula, Len(OldWS.Cells(L, QT).Formula) - 1) NewWS.Cells(M, 3).Copy NewWS.Cells(M, 4).PasteSpecial Paste:=xlPasteFormats Else OldWS.Cells(L, 4).Copy NewWS.Cells(M, 4).PasteSpecial Paste:=xlPasteValues NewWS.Cells(M, 4).PasteSpecial Paste:=xlPasteFormats End If N = N + 1 End If OldWS.Cells(L, N).Copy NewWS.Cells(M, N).PasteSpecial Paste:=xlPasteValues NewWS.Cells(M, N).PasteSpecial Paste:=xlPasteFormats Next N M = M + 1 End If If L = 109 Then OldWS.Range("A110:H110").Copy NewWS.Cells(M, 1).PasteSpecial Paste:=xlPasteValues NewWS.Cells(M, 1).PasteSpecial Paste:=xlPasteFormats End If Next L Application.ScreenUpdating = True End Sub
Function Isdigit(chr As String) As Boolean If (Asc(LCase(chr)) < Asc("a") Or Asc(LCase(chr)) > Asc("z")) Then Isdigit = True Else Isdigit = False End If End Function
Это мой друг программер написал для меня - функция определяет что перед ней - число или ссылка на ячейку . Если ссылка , берёт значение из ячейки , если число - оставляет его как есть . Проблема , если в ячейке тоже формула , нужно определить "глубину" формул , что бы и в этой ячейке не было новой ссылки на другую ячейку , где в свою очередь снова вормула . Вот так :)
Может более наглядно о моей проблеме скажет следующий макрос :
Quote
Sub smeta() Application.ScreenUpdating = True Dim NewWS, OldWS As Worksheet Dim L, M, N, Q, QT As Integer Set OldWS = ActiveSheet Set NewWS = Sheets("Temp") Sheets("Temp").Select Range("A1:H100").Clear For Q = 9 To OldWS.UsedRange.Columns.Count If OldWS.Cells(5, Q).Value = NewWS.Cells(2, 2) Then QT = Q End If Next Q M = 13 For L = 6 To 110 If OldWS.Cells(L, 6).Value <> 0 Then For N = 1 To 8 If N = 4 Then If (Isdigit(Right$(Left$(OldWS.Cells(L, QT).Formula, 2), 1))) Then NewWS.Cells(M, 4) = Right$(OldWS.Cells(L, QT).Formula, Len(OldWS.Cells(L, QT).Formula) - 1) NewWS.Cells(M, 3).Copy NewWS.Cells(M, 4).PasteSpecial Paste:=xlPasteFormats Else OldWS.Cells(L, 4).Copy NewWS.Cells(M, 4).PasteSpecial Paste:=xlPasteValues NewWS.Cells(M, 4).PasteSpecial Paste:=xlPasteFormats End If N = N + 1 End If OldWS.Cells(L, N).Copy NewWS.Cells(M, N).PasteSpecial Paste:=xlPasteValues NewWS.Cells(M, N).PasteSpecial Paste:=xlPasteFormats Next N M = M + 1 End If If L = 109 Then OldWS.Range("A110:H110").Copy NewWS.Cells(M, 1).PasteSpecial Paste:=xlPasteValues NewWS.Cells(M, 1).PasteSpecial Paste:=xlPasteFormats End If Next L Application.ScreenUpdating = True End Sub
Function Isdigit(chr As String) As Boolean If (Asc(LCase(chr)) < Asc("a") Or Asc(LCase(chr)) > Asc("z")) Then Isdigit = True Else Isdigit = False End If End Function
Это мой друг программер написал для меня - функция определяет что перед ней - число или ссылка на ячейку . Если ссылка , берёт значение из ячейки , если число - оставляет его как есть . Проблема , если в ячейке тоже формула , нужно определить "глубину" формул , что бы и в этой ячейке не было новой ссылки на другую ячейку , где в свою очередь снова вормула . Вот так :)zapoganchik
Сообщение отредактировал zapoganchik - Понедельник, 24.10.2011, 16:01