Аналогичная ситуация происходит и в двух других моих решениях В столбце 14 данной таблице И в ЗАКЛЮЧЕНИИ под таблицей...
Помогите пжл решить данные проблемы
[admin]Эта тема изначально не являлась готовым решением, но стала таковой в процессе решения задачи ТС Универсальный макрос по переносу формул из ячеек листа в код VBA в сообщении № 17
Добрый день многоуважаемые форумчане! Помогите с решением В таблице в столбце 13 таблицы есть формула:
Аналогичная ситуация происходит и в двух других моих решениях В столбце 14 данной таблице И в ЗАКЛЮЧЕНИИ под таблицей...
Помогите пжл решить данные проблемы
[admin]Эта тема изначально не являлась готовым решением, но стала таковой в процессе решения задачи ТС Универсальный макрос по переносу формул из ячеек листа в код VBA в сообщении № 17anisimovaleksandr32
У Вас в коде пропал фрагмент формулы! Как корова языком слизала, а точнее - похоже, макрорекордер шалит не по-детски Переводя на человеческий формат формулы (не R1C1), это средний коротенький фрагмент: [vba]
[/vba] Вот этого фрагмента (в формате R1C1) и нет в Вашем макросе: [vba]
Код
4);2);ЕСЛИ
[/vba] И теперь если этот фрагмент (уже в формате R1C1) [vba]
Код
4),2),IF
[/vba] аккуратненько вставить в макрос в начало второй строки после переноса формулы на новую строчку: [vba]
Код
Sub Макрос1() Range("O31:O36").Select ActiveCell.FormulaR1C1 = _ "=IF(AND(R[-13]C[4]=""Раствор"",COUNT(RC[-1]:R[5]C[-1])=3),AVERAGE(RC[-1]:R[5]C[-1]),IF(AND(R[-13]C[4]=""Раствор"",COUNT(RC[-1]:R[5]C[-1])>3),""Только 3-и образца"",IF(COUNT(RC[-1]:R[5]C[-1])>5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1)-SMALL(RC[-1]:R[5]C[-1],2))/4),2),IF(COUNT(RC[-1]:R[5]C[-1])=5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/" & _ "4),2),IF(COUNT(RC[-1]:R[5]C[-1])=4,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/3),2),IF(COUNT(RC[-1]:R[5]C[-1])=3,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/2),2),IF(COUNT(RC[-1]:R[5]C[-1])<=2,ROUND(AVERAGE(RC[-1]:R[5]C[-1]),2),)))))))" End Sub
[/vba] то всё волшебным образом заработает!
У Вас в коде пропал фрагмент формулы! Как корова языком слизала, а точнее - похоже, макрорекордер шалит не по-детски Переводя на человеческий формат формулы (не R1C1), это средний коротенький фрагмент: [vba]
[/vba] Вот этого фрагмента (в формате R1C1) и нет в Вашем макросе: [vba]
Код
4);2);ЕСЛИ
[/vba] И теперь если этот фрагмент (уже в формате R1C1) [vba]
Код
4),2),IF
[/vba] аккуратненько вставить в макрос в начало второй строки после переноса формулы на новую строчку: [vba]
Код
Sub Макрос1() Range("O31:O36").Select ActiveCell.FormulaR1C1 = _ "=IF(AND(R[-13]C[4]=""Раствор"",COUNT(RC[-1]:R[5]C[-1])=3),AVERAGE(RC[-1]:R[5]C[-1]),IF(AND(R[-13]C[4]=""Раствор"",COUNT(RC[-1]:R[5]C[-1])>3),""Только 3-и образца"",IF(COUNT(RC[-1]:R[5]C[-1])>5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1)-SMALL(RC[-1]:R[5]C[-1],2))/4),2),IF(COUNT(RC[-1]:R[5]C[-1])=5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/" & _ "4),2),IF(COUNT(RC[-1]:R[5]C[-1])=4,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/3),2),IF(COUNT(RC[-1]:R[5]C[-1])=3,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/2),2),IF(COUNT(RC[-1]:R[5]C[-1])<=2,ROUND(AVERAGE(RC[-1]:R[5]C[-1]),2),)))))))" End Sub
Прошу меня простить за то что создал тему не со своего профиля (не смог вспомнить свой старый). А когда вспомнил и во становил, то тему решил не удалять (((((
Цитата
похоже, макрорекордер шалит не по-детски
а счем это может быть связано (((( и можно ли это устранить (((( ведь у меня еще два кода есть которые получаются тоже записываются (((( не правильно (((((
Gustav, спасибо огромное за ответ!!!
Прошу меня простить за то что создал тему не со своего профиля (не смог вспомнить свой старый). А когда вспомнил и во становил, то тему решил не удалять (((((
Цитата
похоже, макрорекордер шалит не по-детски
а счем это может быть связано (((( и можно ли это устранить (((( ведь у меня еще два кода есть которые получаются тоже записываются (((( не правильно (((((lebensvoll
а счем это может быть связано (((( и можно ли это устранить
А фиг знает... честно говоря, сам первый раз с таким сталкиваюсь... И поэтому я бы советовал в данном случае не пользоваться макрорекордером, а создавать формулы с помошью свойства FormulaLocal объекта Range. Преимущество, в первую очередь, состоит в том, что Вы берете за основу формулу в ее, так сказать, естественном виде, в котором она отображается в окне формул (ну, если только, конечно, Вы не ярый фанат адресации R1C1). Сопровождать формулу в таком естественном виде значительно проще, чем в формате R1C1. Пожалуй, при этом единственное, но вполне преодолимое, неудобство заключается в необходимости удвоения в коде VBA двойных кавычек, если таковые имеются в формуле.
В качестве узелка на память предложу примерную схему преобразования текста формулы из ячейки - в макрос VBA, воссоздающий эту формулу в той же ячейке.
1. Копируем текст формулы в Блокнот (Notepad) и разбиваем на несколько строк примерно равной длины. Разбивать можно в любом месте, хоть посредине функции - это нестрашно: [vba]
[/vba] 2. Далее в Блокноте же в получившемся текстовом фрагменте удваиваем все двойные кавычки. Т.е. вызываем окно замены по Ctrl+H и указываем Что: " и Чем: "" : [vba]
[/vba] 3. Далее в Блокноте же в начало каждой строки вставляем фрагмент: strFormula = strFormula & " (включая двойную кавычку), а в конец каждой строки - одну двойную кавычку " (чтобы закрыть строку): [vba]
а счем это может быть связано (((( и можно ли это устранить
А фиг знает... честно говоря, сам первый раз с таким сталкиваюсь... И поэтому я бы советовал в данном случае не пользоваться макрорекордером, а создавать формулы с помошью свойства FormulaLocal объекта Range. Преимущество, в первую очередь, состоит в том, что Вы берете за основу формулу в ее, так сказать, естественном виде, в котором она отображается в окне формул (ну, если только, конечно, Вы не ярый фанат адресации R1C1). Сопровождать формулу в таком естественном виде значительно проще, чем в формате R1C1. Пожалуй, при этом единственное, но вполне преодолимое, неудобство заключается в необходимости удвоения в коде VBA двойных кавычек, если таковые имеются в формуле.
В качестве узелка на память предложу примерную схему преобразования текста формулы из ячейки - в макрос VBA, воссоздающий эту формулу в той же ячейке.
1. Копируем текст формулы в Блокнот (Notepad) и разбиваем на несколько строк примерно равной длины. Разбивать можно в любом месте, хоть посредине функции - это нестрашно: [vba]
[/vba] 2. Далее в Блокноте же в получившемся текстовом фрагменте удваиваем все двойные кавычки. Т.е. вызываем окно замены по Ctrl+H и указываем Что: " и Чем: "" : [vba]
[/vba] 3. Далее в Блокноте же в начало каждой строки вставляем фрагмент: strFormula = strFormula & " (включая двойную кавычку), а в конец каждой строки - одну двойную кавычку " (чтобы закрыть строку): [vba]
Gustav, СПАСИБО за такой подробнейший подход к записи Я делал грубо. 1. Формулы и так создавались с трудом и долго правились и поправлялись 2. В VBA я не силен (((( форум во многом помогал. Но я эту процедуру делал так: копировал формулу вставал на нужную ячейку, включал "запись" и вставлял скопированную формулу, останавливал запись и потом уже получишвийся код-формулу подставлял куда нужно. Если во многом формулы так получались на ура. То именно с этими тремя формулами возникали проблемы (((( Буду пробовать Ваше предложенное
Но у меня же будет не одна формула а много их ((((
СПАСИБО ВАМ ОГРОМНЕЙШЕЕ
Gustav, СПАСИБО за такой подробнейший подход к записи Я делал грубо. 1. Формулы и так создавались с трудом и долго правились и поправлялись 2. В VBA я не силен (((( форум во многом помогал. Но я эту процедуру делал так: копировал формулу вставал на нужную ячейку, включал "запись" и вставлял скопированную формулу, останавливал запись и потом уже получишвийся код-формулу подставлял куда нужно. Если во многом формулы так получались на ура. То именно с этими тремя формулами возникали проблемы (((( Буду пробовать Ваше предложенное
Но у меня же будет не одна формула а много их ((((
ААААААААААААААААА блин ну почемууууу ну что не так то ПОМОГИТЕ ПЖЛ с решением!!! Сев за другой комп у меня получилось произвести запись через Macro Recorder
[vba]
Код
'10. в графе (14)
With Range("O31:P36") .FormulaR1C1 = _ "=IF(R[-13]C[3]=""Раствор"",IF(VALUE(R[-5]C)>27,ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE),ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE)),IF(VALUE(R[-5]C)>27,(IF(ROUND(RC[-1]*0.8,)>--VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""B""&ROUND(RC[-1]*0.8,)&"" > B""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""В""&ROUND(RC[-1]*0.8,)&"" < В""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE))),(""B""&ROUND(RC[-1]*0.8,))))" .Value = .Value End With
[/vba]
НО стал записывать следующую формулу ((((( терплю не удачу за неудачей И разбил формулу как предложил Gustav,
[vba]
Код
'ВЫВОД
With Range("B39:P39") .FormulaR1C1 = _ "=IF(R[-21]C[16]=""Бетон""," & _ "IF(VALUE(R[-13]C[13])<27," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактический класс бетона В""&ROUND(R[-8]C[12]*0.8,)&"" , что составляет ""&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&"" % от проектного класса.""," & _ "IF(AND(VALUE(R[-13]C[13])>27," & _ "ROUND(R[-8]C[12]*0.8,)>--VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE))," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактический класс бетона В""&ROUND(R[-8]C[12]*0.8,)&"" , что составляет ""&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&"" % от проектного класса. Конструкция подлежит приемке в соответствии с п. 8.5.2 ГОСТ 18105""," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактический класс бетона В""&ROUND(R[-8]C[12]*0.8,)&"" , что составляет ""&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&"" % это меньше от проектного класса, на ""&100-ROUND(R[-8]C[12]*0,8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&""% .""))," & _ "IF(VALUE(R[-13]C[13])<27," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток прочность раствора М""& ROUND(R[-8]C[12],2) &"" МПа, что составляет ""&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&"" % от проектной марки.""," & _ "IF(AND(VALUE(R[-13]C[13])>27," & _ "ROUND(R[-8]C[12]*VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),) >--VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE))," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактическая прочность раствора ""& ROUND(R[-8]C[12],2) &"" МПа, что составляет ""&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2, FALSE),)&"" % от проектной марки.""," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактическая прочность раствора ""& ROUND(R[-8]C[12],2) &"" МПа, что составляет ""&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&"" % это меньше от проектной марки на ""&100-ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&"" %."")))" .Value = .Value End With
[/vba]
Но все равно ругается и производил запись перебиванием формулы в ручную шаг за шагом и все равно не удачи Где мои ошибки почему так происходит Сама формула:
Код
=ЕСЛИ(R18="Бетон";ЕСЛИ(ЗНАЧЕН(O26)<27;"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактический класс бетона В"&ОКРУГЛ(N31*0,8;)&" , что составляет "&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&" % от проектного класса.";ЕСЛИ(И(ЗНАЧЕН(O26)>27;ОКРУГЛ(N31*0,8;)>--ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ));"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактический класс бетона В"&ОКРУГЛ(N31*0,8;)&" , что составляет "&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&" % от проектного класса. Конструкция подлежит приемке в соответствии с п. 8.5.2 ГОСТ 18105";"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактический класс бетона В"&ОКРУГЛ(N31*0,8;)&" , что составляет "&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&" % это меньше от проектного класса, на "&100-ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&"% ."));ЕСЛИ(ЗНАЧЕН(O26)<27;"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток прочность раствора М"& ОКРУГЛ(N31;2) &" МПа, что составляет "&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&" % от проектной марки.";ЕСЛИ(И(ЗНАЧЕН(O26)>27; ОКРУГЛ(N31*ВПР(R19;Класс!D5:F18;3; ЛОЖЬ)/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);) >--ВПР(R19;Класс!D5:F18;3;ЛОЖЬ));"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактическая прочность раствора "& ОКРУГЛ(N31;2) &" МПа, что составляет "&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);)&" % от проектной марки.";"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактическая прочность раствора "& ОКРУГЛ(N31;2) &" МПа, что составляет "&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&" % это меньше от проектной марки на "&100-ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&" %.")))
ААААААААААААААААА блин ну почемууууу ну что не так то ПОМОГИТЕ ПЖЛ с решением!!! Сев за другой комп у меня получилось произвести запись через Macro Recorder
[vba]
Код
'10. в графе (14)
With Range("O31:P36") .FormulaR1C1 = _ "=IF(R[-13]C[3]=""Раствор"",IF(VALUE(R[-5]C)>27,ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE),ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE)),IF(VALUE(R[-5]C)>27,(IF(ROUND(RC[-1]*0.8,)>--VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""B""&ROUND(RC[-1]*0.8,)&"" > B""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""В""&ROUND(RC[-1]*0.8,)&"" < В""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE))),(""B""&ROUND(RC[-1]*0.8,))))" .Value = .Value End With
[/vba]
НО стал записывать следующую формулу ((((( терплю не удачу за неудачей И разбил формулу как предложил Gustav,
[vba]
Код
'ВЫВОД
With Range("B39:P39") .FormulaR1C1 = _ "=IF(R[-21]C[16]=""Бетон""," & _ "IF(VALUE(R[-13]C[13])<27," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактический класс бетона В""&ROUND(R[-8]C[12]*0.8,)&"" , что составляет ""&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&"" % от проектного класса.""," & _ "IF(AND(VALUE(R[-13]C[13])>27," & _ "ROUND(R[-8]C[12]*0.8,)>--VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE))," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактический класс бетона В""&ROUND(R[-8]C[12]*0.8,)&"" , что составляет ""&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&"" % от проектного класса. Конструкция подлежит приемке в соответствии с п. 8.5.2 ГОСТ 18105""," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактический класс бетона В""&ROUND(R[-8]C[12]*0.8,)&"" , что составляет ""&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&"" % это меньше от проектного класса, на ""&100-ROUND(R[-8]C[12]*0,8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&""% .""))," & _ "IF(VALUE(R[-13]C[13])<27," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток прочность раствора М""& ROUND(R[-8]C[12],2) &"" МПа, что составляет ""&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&"" % от проектной марки.""," & _ "IF(AND(VALUE(R[-13]C[13])>27," & _ "ROUND(R[-8]C[12]*VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),) >--VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE))," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактическая прочность раствора ""& ROUND(R[-8]C[12],2) &"" МПа, что составляет ""&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2, FALSE),)&"" % от проектной марки.""," & _ """ЗАКЛЮЧЕНИЕ: В возрасте ""&R[-13]C[13]&"" суток фактическая прочность раствора ""& ROUND(R[-8]C[12],2) &"" МПа, что составляет ""&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&"" % это меньше от проектной марки на ""&100-ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&"" %."")))" .Value = .Value End With
[/vba]
Но все равно ругается и производил запись перебиванием формулы в ручную шаг за шагом и все равно не удачи Где мои ошибки почему так происходит Сама формула:
Код
=ЕСЛИ(R18="Бетон";ЕСЛИ(ЗНАЧЕН(O26)<27;"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактический класс бетона В"&ОКРУГЛ(N31*0,8;)&" , что составляет "&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&" % от проектного класса.";ЕСЛИ(И(ЗНАЧЕН(O26)>27;ОКРУГЛ(N31*0,8;)>--ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ));"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактический класс бетона В"&ОКРУГЛ(N31*0,8;)&" , что составляет "&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&" % от проектного класса. Конструкция подлежит приемке в соответствии с п. 8.5.2 ГОСТ 18105";"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактический класс бетона В"&ОКРУГЛ(N31*0,8;)&" , что составляет "&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&" % это меньше от проектного класса, на "&100-ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&"% ."));ЕСЛИ(ЗНАЧЕН(O26)<27;"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток прочность раствора М"& ОКРУГЛ(N31;2) &" МПа, что составляет "&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&" % от проектной марки.";ЕСЛИ(И(ЗНАЧЕН(O26)>27; ОКРУГЛ(N31*ВПР(R19;Класс!D5:F18;3; ЛОЖЬ)/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);) >--ВПР(R19;Класс!D5:F18;3;ЛОЖЬ));"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактическая прочность раствора "& ОКРУГЛ(N31;2) &" МПа, что составляет "&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);)&" % от проектной марки.";"ЗАКЛЮЧЕНИЕ: В возрасте "&O26&" суток фактическая прочность раствора "& ОКРУГЛ(N31;2) &" МПа, что составляет "&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&" % это меньше от проектной марки на "&100-ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&" %.")))
Здравствуйте. Слишком длинные формулы, очень много знаков. думаю по этому VBA и не берет. Попробуйте их загнать в диспетчер имен и потом вставлять по имени. Но в диспетчере тоже есть какое то ограничение по знакам. Если не получится всю формулу загнать в диспетчер, разбейте на несколько и там же соберите или соберите в ячейке.
Здравствуйте. Слишком длинные формулы, очень много знаков. думаю по этому VBA и не берет. Попробуйте их загнать в диспетчер имен и потом вставлять по имени. Но в диспетчере тоже есть какое то ограничение по знакам. Если не получится всю формулу загнать в диспетчер, разбейте на несколько и там же соберите или соберите в ячейке.gling
gling, Спасибо Вам за ответ... А если я создам "Имена", другие мои макросы не потеряют свою функциональность!? Я за этим доком уже сижу неделю наверное (((( То вначале в формулах находишь ошибки - правишь - записываешь макрос То потом на работе сотрудники либо что то предумают или заметят ошибку и вновь пункт 1 Если сейчас еще и это проблема случится (пусть она возможно даже и не получится но еще и потеряют функциональность другие макросы с формулами) это будет АААААААА
gling, Спасибо Вам за ответ... А если я создам "Имена", другие мои макросы не потеряют свою функциональность!? Я за этим доком уже сижу неделю наверное (((( То вначале в формулах находишь ошибки - правишь - записываешь макрос То потом на работе сотрудники либо что то предумают или заметят ошибку и вновь пункт 1 Если сейчас еще и это проблема случится (пусть она возможно даже и не получится но еще и потеряют функциональность другие макросы с формулами) это будет ААААААААlebensvoll
lebensvoll, очень грустно, но Вы совсем не "вкурили" мой алгоритм из сообщения #4 и, извините, прёте своим первоначально проторенным путём... Прочтите мой алгоритм еще раз внимательно, если действительно хотите успеха в этом деле.
Кстати, я нигде не упоминаю про делёжку строки по последовательности символов "& _" в конце строки (как это делает макрорекордер). Потому что при этом существует ограничение - не больше 25 строк. И оно нам не надо. Тем более, мы выяснили, что при таком подходе как раз и пропадают символы на "сгибах" формулы!
У меня же строки объединяются с помощью начальных фрагментов "strFormula = strFormula & ". И таким способом можно легко объединить не то, что 25 - 100 строк или даже 500.
И делайте всё препарирование формулы в Блокноте! В редакторе VBA среда будет пытаться автоматически подставлять, например, завершающие кавычки. Нам не нужно такой сомнительной услужливости а-ля "словарь T9" в телефоне. В редактор VBA возвращайтесь только на 4-м шаге алгоритма, когда формула уже корректно разбита по отдельным строкам. Ну, я же всё написал...
lebensvoll, очень грустно, но Вы совсем не "вкурили" мой алгоритм из сообщения #4 и, извините, прёте своим первоначально проторенным путём... Прочтите мой алгоритм еще раз внимательно, если действительно хотите успеха в этом деле.
Кстати, я нигде не упоминаю про делёжку строки по последовательности символов "& _" в конце строки (как это делает макрорекордер). Потому что при этом существует ограничение - не больше 25 строк. И оно нам не надо. Тем более, мы выяснили, что при таком подходе как раз и пропадают символы на "сгибах" формулы!
У меня же строки объединяются с помощью начальных фрагментов "strFormula = strFormula & ". И таким способом можно легко объединить не то, что 25 - 100 строк или даже 500.
И делайте всё препарирование формулы в Блокноте! В редакторе VBA среда будет пытаться автоматически подставлять, например, завершающие кавычки. Нам не нужно такой сомнительной услужливости а-ля "словарь T9" в телефоне. В редактор VBA возвращайтесь только на 4-м шаге алгоритма, когда формула уже корректно разбита по отдельным строкам. Ну, я же всё написал...Gustav
Вот, чтобы не пыхтеть вручную в Блокноте и не делать походу случайных ошибок, написал на коленках макрос-визард, реализующий алгоритм из моего сообщения #4.
[vba]
Код
Sub parseFormulaIntoMacro()
Const MAX_PART_LEN As Integer = 60 'примерное кол-во символов в строке (на что делится общая длина) Const FORM_VAR_NAM As String = "strFormula" 'имя переменной для текста формулы Const INS_FORM_ADR As String = "B39" 'адрес ячейки c формулой для разбора
Dim cell As Range, strFormulaSrc As String, currPart As String Dim i As Integer, parts As Integer, currPartLen As Integer
Set cell = Range(INS_FORM_ADR) 'берем нужную версию формулы strFormulaSrc = cell.FormulaLocal 'cell.FormulaR1C1
strFormulaSrc = Application.WorksheetFunction.Clean(strFormulaSrc) parts = Len(strFormulaSrc) / MAX_PART_LEN + 1 currPartLen = Len(strFormulaSrc) / parts + 1
'выводим текст макроса в Окно отладки редактора VBA Debug.Print "Sub macro" & Format(Now, "_YYMMDD_hhmmss") & "()" Debug.Print vbCrLf & " Dim " & FORM_VAR_NAM & " As String" & vbCrLf
For i = 1 To Len(strFormulaSrc) Step currPartLen currPart = Mid(strFormulaSrc, i, currPartLen) currPart = """" & Replace(currPart, """", """""") & """" currPart = " " & FORM_VAR_NAM & " = " & FORM_VAR_NAM & " & " & currPart Debug.Print currPart Next i 'берем нужную версию формулы Debug.Print vbCrLf & " Range(""" & INS_FORM_ADR & """).FormulaLocal = " & FORM_VAR_NAM '.FormulaR1C1 Debug.Print "End Sub" 'в готовом макросе подправляем адрес вставки, если формулу надо вставить в другую ячейку
End Sub
[/vba]
Макрос выводит в Окно отладки (Ctrl+G в редакторе VBA, если не открыто) текст макроса по созданию формулы из указанной ячейки (ее адрес указывается в константе INS_FORM_ADR визарда). Соответственно, копируете этот текст из Окна отладки, вставляете в модуль книги и запускаете.
[vba]
Код
Sub macro_210129_102523()
Dim strFormula As String
strFormula = strFormula & "=ЕСЛИ(R18=""Бетон"";ЕСЛИ(ЗНАЧЕН(O26)<27;""ЗАКЛЮЧЕНИЕ: В возрас" strFormula = strFormula & "те ""&O26&"" суток фактический класс бетона В""&ОКРУГЛ(N31*0," strFormula = strFormula & "8;)&"" , что составляет ""&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:" strFormula = strFormula & "$C$18;3;ЛОЖЬ)*100;)&"" % от проектного класса."";ЕСЛИ(И(ЗНАЧЕ" strFormula = strFormula & "Н(O26)>27;ОКРУГЛ(N31*0,8;)>--ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖ" strFormula = strFormula & "Ь));""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток фактический класс" strFormula = strFormula & " бетона В""&ОКРУГЛ(N31*0,8;)&"" , что составляет ""&ОКРУГЛ(N3" strFormula = strFormula & "1*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&"" % от проектн" strFormula = strFormula & "ого класса. Конструкция подлежит приемке в соответствии с п" strFormula = strFormula & ". 8.5.2 ГОСТ 18105"";""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток ф" strFormula = strFormula & "актический класс бетона В""&ОКРУГЛ(N31*0,8;)&"" , что состав" strFormula = strFormula & "ляет ""&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100" strFormula = strFormula & ";)&"" % это меньше от проектного класса, на ""&100-ОКРУГЛ(N31" strFormula = strFormula & "*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&""% .""));ЕСЛИ(ЗН" strFormula = strFormula & "АЧЕН(O26)<27;""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток прочност" strFormula = strFormula & "ь раствора М""& ОКРУГЛ(N31;2) &"" МПа, что составляет ""&ОКРУГ" strFormula = strFormula & "Л(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&"" % от проектной м" strFormula = strFormula & "арки."";ЕСЛИ(И(ЗНАЧЕН(O26)>27; ОКРУГЛ(N31*ВПР(R19;Класс!D5:F" strFormula = strFormula & "18;3; ЛОЖЬ)/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);) >--ВПР(R19;Клас" strFormula = strFormula & "с!D5:F18;3;ЛОЖЬ));""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток фак" strFormula = strFormula & "тическая прочность раствора ""& ОКРУГЛ(N31;2) &"" МПа, что со" strFormula = strFormula & "ставляет ""&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);)&""" strFormula = strFormula & " % от проектной марки."";""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" сут" strFormula = strFormula & "ок фактическая прочность раствора ""& ОКРУГЛ(N31;2) &"" МПа, " strFormula = strFormula & "что составляет ""&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ" strFormula = strFormula & ");)&"" % это меньше от проектной марки на ""&100-ОКРУГЛ(N31*1" strFormula = strFormula & "00/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&"" %."")))"
Range("B39").FormulaLocal = strFormula End Sub
[/vba]
В макросе-визарде parseFormulaIntoMacro по желанию можно заменить .FormulaLocal на .FormulaR1C1 (или на любую другую: .Formula или .FormulaR1C1Local).
Вот, чтобы не пыхтеть вручную в Блокноте и не делать походу случайных ошибок, написал на коленках макрос-визард, реализующий алгоритм из моего сообщения #4.
[vba]
Код
Sub parseFormulaIntoMacro()
Const MAX_PART_LEN As Integer = 60 'примерное кол-во символов в строке (на что делится общая длина) Const FORM_VAR_NAM As String = "strFormula" 'имя переменной для текста формулы Const INS_FORM_ADR As String = "B39" 'адрес ячейки c формулой для разбора
Dim cell As Range, strFormulaSrc As String, currPart As String Dim i As Integer, parts As Integer, currPartLen As Integer
Set cell = Range(INS_FORM_ADR) 'берем нужную версию формулы strFormulaSrc = cell.FormulaLocal 'cell.FormulaR1C1
strFormulaSrc = Application.WorksheetFunction.Clean(strFormulaSrc) parts = Len(strFormulaSrc) / MAX_PART_LEN + 1 currPartLen = Len(strFormulaSrc) / parts + 1
'выводим текст макроса в Окно отладки редактора VBA Debug.Print "Sub macro" & Format(Now, "_YYMMDD_hhmmss") & "()" Debug.Print vbCrLf & " Dim " & FORM_VAR_NAM & " As String" & vbCrLf
For i = 1 To Len(strFormulaSrc) Step currPartLen currPart = Mid(strFormulaSrc, i, currPartLen) currPart = """" & Replace(currPart, """", """""") & """" currPart = " " & FORM_VAR_NAM & " = " & FORM_VAR_NAM & " & " & currPart Debug.Print currPart Next i 'берем нужную версию формулы Debug.Print vbCrLf & " Range(""" & INS_FORM_ADR & """).FormulaLocal = " & FORM_VAR_NAM '.FormulaR1C1 Debug.Print "End Sub" 'в готовом макросе подправляем адрес вставки, если формулу надо вставить в другую ячейку
End Sub
[/vba]
Макрос выводит в Окно отладки (Ctrl+G в редакторе VBA, если не открыто) текст макроса по созданию формулы из указанной ячейки (ее адрес указывается в константе INS_FORM_ADR визарда). Соответственно, копируете этот текст из Окна отладки, вставляете в модуль книги и запускаете.
[vba]
Код
Sub macro_210129_102523()
Dim strFormula As String
strFormula = strFormula & "=ЕСЛИ(R18=""Бетон"";ЕСЛИ(ЗНАЧЕН(O26)<27;""ЗАКЛЮЧЕНИЕ: В возрас" strFormula = strFormula & "те ""&O26&"" суток фактический класс бетона В""&ОКРУГЛ(N31*0," strFormula = strFormula & "8;)&"" , что составляет ""&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:" strFormula = strFormula & "$C$18;3;ЛОЖЬ)*100;)&"" % от проектного класса."";ЕСЛИ(И(ЗНАЧЕ" strFormula = strFormula & "Н(O26)>27;ОКРУГЛ(N31*0,8;)>--ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖ" strFormula = strFormula & "Ь));""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток фактический класс" strFormula = strFormula & " бетона В""&ОКРУГЛ(N31*0,8;)&"" , что составляет ""&ОКРУГЛ(N3" strFormula = strFormula & "1*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&"" % от проектн" strFormula = strFormula & "ого класса. Конструкция подлежит приемке в соответствии с п" strFormula = strFormula & ". 8.5.2 ГОСТ 18105"";""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток ф" strFormula = strFormula & "актический класс бетона В""&ОКРУГЛ(N31*0,8;)&"" , что состав" strFormula = strFormula & "ляет ""&ОКРУГЛ(N31*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100" strFormula = strFormula & ";)&"" % это меньше от проектного класса, на ""&100-ОКРУГЛ(N31" strFormula = strFormula & "*0,8/ВПР(R19;Класс!$A$5:$C$18;3;ЛОЖЬ)*100;)&""% .""));ЕСЛИ(ЗН" strFormula = strFormula & "АЧЕН(O26)<27;""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток прочност" strFormula = strFormula & "ь раствора М""& ОКРУГЛ(N31;2) &"" МПа, что составляет ""&ОКРУГ" strFormula = strFormula & "Л(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&"" % от проектной м" strFormula = strFormula & "арки."";ЕСЛИ(И(ЗНАЧЕН(O26)>27; ОКРУГЛ(N31*ВПР(R19;Класс!D5:F" strFormula = strFormula & "18;3; ЛОЖЬ)/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);) >--ВПР(R19;Клас" strFormula = strFormula & "с!D5:F18;3;ЛОЖЬ));""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" суток фак" strFormula = strFormula & "тическая прочность раствора ""& ОКРУГЛ(N31;2) &"" МПа, что со" strFormula = strFormula & "ставляет ""&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2; ЛОЖЬ);)&""" strFormula = strFormula & " % от проектной марки."";""ЗАКЛЮЧЕНИЕ: В возрасте ""&O26&"" сут" strFormula = strFormula & "ок фактическая прочность раствора ""& ОКРУГЛ(N31;2) &"" МПа, " strFormula = strFormula & "что составляет ""&ОКРУГЛ(N31*100/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ" strFormula = strFormula & ");)&"" % это меньше от проектной марки на ""&100-ОКРУГЛ(N31*1" strFormula = strFormula & "00/ВПР(R19;Класс!D5:F18;2;ЛОЖЬ);)&"" %."")))"
Range("B39").FormulaLocal = strFormula End Sub
[/vba]
В макросе-визарде parseFormulaIntoMacro по желанию можно заменить .FormulaLocal на .FormulaR1C1 (или на любую другую: .Formula или .FormulaR1C1Local).Gustav
Серж, я как молодой писатель о большем и мечтать не могу! Главное, чтобы ТС, когда проснётся, смог найти эту свою тему. Кстати, надо отдать ему должное, название у темы очень удачное - по сути и никакой воды! :up:
Серж, я как молодой писатель о большем и мечтать не могу! Главное, чтобы ТС, когда проснётся, смог найти эту свою тему. Кстати, надо отдать ему должное, название у темы очень удачное - по сути и никакой воды! :up:Gustav
№ 17 делает тему весьма интересной и полезной для готовых решений. Но неплохо было бы это как-то указать в самом начале, а то могут и не дочитать до самого главного.
№ 17 делает тему весьма интересной и полезной для готовых решений. Но неплохо было бы это как-то указать в самом начале, а то могут и не дочитать до самого главного. RAN
Gustav, Спасибо за ответ и еще раз пояснения. Просто сев за другой комп у меня получилось произвести запись Macro Recorder
Цитата
В таблице в столбце 13 таблицы есть формула:
как раз на ура и последующие также. А вот с выводом и применение
Цитата
"& _"
я уже нашел просто в просторах инета такое решение (но смысл один разбить формулу) ну а за то что только 25 строк (((( я только узнал Применение Вашего метода для меня показалось сложным и не стал использовать (я просто не смог сообразить а как мне потом это воткнуть в свои коды)
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
'ПРЯЧЕМ ФОРМУЛЫ С ГЛАЗ ДОЛОЙ
'Больше не обновляем страницы после каждого действия Application.ScreenUpdating = False
'Отключаем события Application.EnableEvents = False
'1.
With Range("M5:P5") .FormulaR1C1 = "=R[21]C[-8]" .Value = .Value End With
'2.
With Range("B12:P12") .FormulaR1C1 = _ "=""испытаний контрольных образцов ""&IF(R[6]C[16]=""Раствор"",""раствора"",""бетона"")&"" на прочность при сжатии""" .Value = .Value End With
'3.
With Range("B13:P13") .FormulaR1C1 = _ "=IF(R[5]C[16]=""Раствор"",""испытания проведены в соответствии с ГОСТ 5802"",""испытания проведены в соответствии с ГОСТ 10180 и ГОСТ 18105"")" .Value = .Value End With
'4. ' Сведения о применяемом материале
With Range("F17:P17") .FormulaR1C1 = _ "=IF(R[1]C[12]=""Бетон"",""Смеси бетонные ГОСТ 7473"",""Растворы строительные ГОСТ 28013"")" .Value = .Value End With
'5. ' Проектные требования
With Range("F18:P18") .FormulaR1C1 = _ "=IF(RC[12]=""Раствор"",""марка раствора "",""класс бетона "")&"""" &R[1]C[12]&""; требуемая прочность по данным поставщика R = ""&ROUND(IF(RC[12]=""Раствор"",VLOOKUP(R[1]C[12],Класс!R[-13]C[-2]:RC[-1],2,FALSE),VLOOKUP(R[1]C[12],Класс!R[-13]C[-5]:RC[-4],2,TRUE)),2)&"" МПа ""&IF(RC[12]=""Раствор"","""",""(при v = ""&IF(R[-1]C[12]="""",13.5/100,R[-1]C[12]/100)&"")"")" .Value = .Value End With
'6. ' Условия проведения испытания
With Range("F21:P21") .FormulaR1C1 = "=""АКТ отбора контрольных образцов №""&MID(R[-10]C[-4],SEARCH(""-"",R[-10]C[-4],1)-4,4)" .Value = .Value End With
'7. ' Дата испытания
With Range("E26:F26") .FormulaR1C1 = "=R[-1]C+RC[10]" .Value = .Value End With
'8. ' Возраст бетона
With Range("O26") .FormulaR1C1 = "=MID(R[-15]C[-13],SEARCH(""-"",R[-15]C[-13],1)+1,2)" .Value = .Value End With
' ФОРМУЛЫ В ТАБЛИЦЕ ИСПЫТАНИЙ '***************************************************************************************************************************************
'1. Изменения наименования шапки в графе (14)
With Range("O28:P29") .FormulaR1C1 = _ "=IF( R[-2]C>27, ""Контроль прочности"" & IF(R[-10]C[3]=""раствор"", "" раствора, %"", "" Вф > В"" ) & """", IF(R[-10]C[3]=""раствор"", ""Набор прочности раствора, %"", ""Фактический класс бетона Вф"" ) )" .Value = .Value End With
'2. Маркировка образца в графе (2)
With Range("C31:C36") .FormulaR1C1 = "=MID(R[-20]C[-1],SEARCH(""№"",R[-20]C[-1],1)+1,8)" .Value = .Value End With
'3. Линейные размеры образцов, мм в графах (4; 5; 6)
With Range("E31:E36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",100,71))" .Value = .Value End With
With Range("F31:F36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",100,71))" .Value = .Value End With
With Range("G31:G36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",100,71))" .Value = .Value End With
'4. Площадь образца, см в графе (7)
With Range("H31:H36") .FormulaR1C1 = "=IF(RC[-4]="""","""",MROUND(RC[-3]*RC[-2]/100,1))" .Value = .Value End With
'5. Плотность образца, кг/м в графе (8)
With Range("I31:I36") .FormulaR1C1 = "=IF(RC[-5]="""","""",RC[-5]/RC[-4]/RC[-3]/RC[-2]*1000000)" .Value = .Value End With
'6. Средняя плотность серии образцов, кг/м в графе (9)
With Range("J31:J36") .FormulaR1C1 = "=AVERAGE(RC[-1]:R[5]C[-1])" .Value = .Value End With
'7. Отклонение от средней плотности, кг/м в графе (10)
With Range("K31:K36") .FormulaR1C1 = "=IF(RC[-2]="""","""",(RC[-2]-R31C[-1]))" .Value = .Value End With
'8. Прочность бетона, приведенная к базовому размеру образца, Мпа в графе (12)
With Range("M31:M36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",RC[-1]*0.95/RC[-5]*10,(RC[-1]/((RC[-5]/10))*1)))" .Value = .Value End With
'9. Средняя прочность серии образцов, Мпа в графе (13)
With Range("N31:N36") .FormulaR1C1 = _ "=IF(AND(R18C18=""Раствор"",COUNT(R31C13:R36C13)=3),AVERAGE(R31C13:R36C13),IF(AND(R18C18=""Раствор"",COUNT(R31C13:R36C13)>3),""Только 3-и образца"",IF(COUNT(R31C13:R36C13)>5,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1)-SMALL(R31C13:R36C13,2))/4),2),IF(COUNT(R31C13:R36C13)=5,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1))/4),2),IF(COUNT(R31C13:R36C13)=4,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1))/3),2),IF(COUNT(R31C13:R36C13)=3,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1))/2),2),IF(COUNT(R31C13:R36C13)<=2,ROUND(AVERAGE(R31C13:R36C13),2),)))))))" .Value = .Value End With
'10. в графе (14)
With Range("O31:P36") .FormulaR1C1 = _ "=IF(R[-13]C[3]=""Раствор"",IF(VALUE(R[-5]C)>27,ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE),ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE)),IF(VALUE(R[-5]C)>27,(IF(ROUND(RC[-1]*0.8,)>--VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""B""&ROUND(RC[-1]*0.8,)&"" > B""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""В""&ROUND(RC[-1]*0.8,)&"" < В""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE))),(""B""&ROUND(RC[-1]*0.8,))))" .Value = .Value End With
'2. 'Испытания провел
With Range("I44:L44") .FormulaR1C1 = "=VLOOKUP(RC[5],Сотрудники!R[-43]C[-8]:R[-35]C[-7],2,FALSE)" .Value = .Value End With
'Включаем обновление экрана после каждого события Application.ScreenUpdating = True
'Включаем события Application.EnableEvents = True
[/vba]
Gustav, Спасибо за ответ и еще раз пояснения. Просто сев за другой комп у меня получилось произвести запись Macro Recorder
Цитата
В таблице в столбце 13 таблицы есть формула:
как раз на ура и последующие также. А вот с выводом и применение
Цитата
"& _"
я уже нашел просто в просторах инета такое решение (но смысл один разбить формулу) ну а за то что только 25 строк (((( я только узнал Применение Вашего метода для меня показалось сложным и не стал использовать (я просто не смог сообразить а как мне потом это воткнуть в свои коды)
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
'ПРЯЧЕМ ФОРМУЛЫ С ГЛАЗ ДОЛОЙ
'Больше не обновляем страницы после каждого действия Application.ScreenUpdating = False
'Отключаем события Application.EnableEvents = False
'1.
With Range("M5:P5") .FormulaR1C1 = "=R[21]C[-8]" .Value = .Value End With
'2.
With Range("B12:P12") .FormulaR1C1 = _ "=""испытаний контрольных образцов ""&IF(R[6]C[16]=""Раствор"",""раствора"",""бетона"")&"" на прочность при сжатии""" .Value = .Value End With
'3.
With Range("B13:P13") .FormulaR1C1 = _ "=IF(R[5]C[16]=""Раствор"",""испытания проведены в соответствии с ГОСТ 5802"",""испытания проведены в соответствии с ГОСТ 10180 и ГОСТ 18105"")" .Value = .Value End With
'4. ' Сведения о применяемом материале
With Range("F17:P17") .FormulaR1C1 = _ "=IF(R[1]C[12]=""Бетон"",""Смеси бетонные ГОСТ 7473"",""Растворы строительные ГОСТ 28013"")" .Value = .Value End With
'5. ' Проектные требования
With Range("F18:P18") .FormulaR1C1 = _ "=IF(RC[12]=""Раствор"",""марка раствора "",""класс бетона "")&"""" &R[1]C[12]&""; требуемая прочность по данным поставщика R = ""&ROUND(IF(RC[12]=""Раствор"",VLOOKUP(R[1]C[12],Класс!R[-13]C[-2]:RC[-1],2,FALSE),VLOOKUP(R[1]C[12],Класс!R[-13]C[-5]:RC[-4],2,TRUE)),2)&"" МПа ""&IF(RC[12]=""Раствор"","""",""(при v = ""&IF(R[-1]C[12]="""",13.5/100,R[-1]C[12]/100)&"")"")" .Value = .Value End With
'6. ' Условия проведения испытания
With Range("F21:P21") .FormulaR1C1 = "=""АКТ отбора контрольных образцов №""&MID(R[-10]C[-4],SEARCH(""-"",R[-10]C[-4],1)-4,4)" .Value = .Value End With
'7. ' Дата испытания
With Range("E26:F26") .FormulaR1C1 = "=R[-1]C+RC[10]" .Value = .Value End With
'8. ' Возраст бетона
With Range("O26") .FormulaR1C1 = "=MID(R[-15]C[-13],SEARCH(""-"",R[-15]C[-13],1)+1,2)" .Value = .Value End With
' ФОРМУЛЫ В ТАБЛИЦЕ ИСПЫТАНИЙ '***************************************************************************************************************************************
'1. Изменения наименования шапки в графе (14)
With Range("O28:P29") .FormulaR1C1 = _ "=IF( R[-2]C>27, ""Контроль прочности"" & IF(R[-10]C[3]=""раствор"", "" раствора, %"", "" Вф > В"" ) & """", IF(R[-10]C[3]=""раствор"", ""Набор прочности раствора, %"", ""Фактический класс бетона Вф"" ) )" .Value = .Value End With
'2. Маркировка образца в графе (2)
With Range("C31:C36") .FormulaR1C1 = "=MID(R[-20]C[-1],SEARCH(""№"",R[-20]C[-1],1)+1,8)" .Value = .Value End With
'3. Линейные размеры образцов, мм в графах (4; 5; 6)
With Range("E31:E36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",100,71))" .Value = .Value End With
With Range("F31:F36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",100,71))" .Value = .Value End With
With Range("G31:G36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",100,71))" .Value = .Value End With
'4. Площадь образца, см в графе (7)
With Range("H31:H36") .FormulaR1C1 = "=IF(RC[-4]="""","""",MROUND(RC[-3]*RC[-2]/100,1))" .Value = .Value End With
'5. Плотность образца, кг/м в графе (8)
With Range("I31:I36") .FormulaR1C1 = "=IF(RC[-5]="""","""",RC[-5]/RC[-4]/RC[-3]/RC[-2]*1000000)" .Value = .Value End With
'6. Средняя плотность серии образцов, кг/м в графе (9)
With Range("J31:J36") .FormulaR1C1 = "=AVERAGE(RC[-1]:R[5]C[-1])" .Value = .Value End With
'7. Отклонение от средней плотности, кг/м в графе (10)
With Range("K31:K36") .FormulaR1C1 = "=IF(RC[-2]="""","""",(RC[-2]-R31C[-1]))" .Value = .Value End With
'8. Прочность бетона, приведенная к базовому размеру образца, Мпа в графе (12)
With Range("M31:M36") .FormulaR1C1 = "=IF(RC[-1]="""","""",IF(R18C18=""Бетон"",RC[-1]*0.95/RC[-5]*10,(RC[-1]/((RC[-5]/10))*1)))" .Value = .Value End With
'9. Средняя прочность серии образцов, Мпа в графе (13)
With Range("N31:N36") .FormulaR1C1 = _ "=IF(AND(R18C18=""Раствор"",COUNT(R31C13:R36C13)=3),AVERAGE(R31C13:R36C13),IF(AND(R18C18=""Раствор"",COUNT(R31C13:R36C13)>3),""Только 3-и образца"",IF(COUNT(R31C13:R36C13)>5,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1)-SMALL(R31C13:R36C13,2))/4),2),IF(COUNT(R31C13:R36C13)=5,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1))/4),2),IF(COUNT(R31C13:R36C13)=4,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1))/3),2),IF(COUNT(R31C13:R36C13)=3,ROUND(((SUM(R31C13:R36C13)-SMALL(R31C13:R36C13,1))/2),2),IF(COUNT(R31C13:R36C13)<=2,ROUND(AVERAGE(R31C13:R36C13),2),)))))))" .Value = .Value End With
'10. в графе (14)
With Range("O31:P36") .FormulaR1C1 = _ "=IF(R[-13]C[3]=""Раствор"",IF(VALUE(R[-5]C)>27,ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE),ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE)),IF(VALUE(R[-5]C)>27,(IF(ROUND(RC[-1]*0.8,)>--VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""B""&ROUND(RC[-1]*0.8,)&"" > B""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),""В""&ROUND(RC[-1]*0.8,)&"" < В""&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE))),(""B""&ROUND(RC[-1]*0.8,))))" .Value = .Value End With
'2. 'Испытания провел
With Range("I44:L44") .FormulaR1C1 = "=VLOOKUP(RC[5],Сотрудники!R[-43]C[-8]:R[-35]C[-7],2,FALSE)" .Value = .Value End With
'Включаем обновление экрана после каждого события Application.ScreenUpdating = True