Макросы в excel подстановка значений

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Всем доброго времени суток!  

  Похоже «венцом» схемы реализации моих перерасчетов будет исполнение данной задачки.  
Помогите пожалуйста с данной проблемой..  

  В написании макросов абсолютный НОЛЬ, хотя учиться никогда не поздно, а лучше всего это делать на конкретном схожем примере..  
Перерасчетов подобных, у меня предостаточно, помогите пожалуйста на одном примере, а с остальными постараюсь как нибудь разобраться  

  Так вот, суть возникшей сложности :  

  Необходим макрос или формула, которые значения ячеек из диапазона О8:О3000 листа Данные последовательно подставят в ячейку С77 листа Расчеты , а значения ячеек из диапазона К8:К3000 листа Данные последовательно подставят в ячейку Н76 листа Расчеты, при том что подставление должно идти параллельно по строкам А8:АP8  
Это связано с тем, что значения О8 и К8 являются исходными данными для формул, которые распологаются на листе Расчеты и ячейки С77 и Н76 являются входными ячейками в существующую цепь перерасчетов. А вот результат последовательных перерасчетов из ячейки Н120 листа Расчеты необходимо вернуть на лист Данные в ячейки столбца R  
Помогите пожалуйста реализовать данную схему  !    
Было бы замечательно, привязать исполнение данного макроса к кновке «ВЫПОЛНИТЬ ПЕРЕСЧЕТ»  

  на основе этой подсказки постараюсь реализовать остальные схемы перерасчетов, которые фигурирую на даном листе.  вот только входные ячейки листа Расчеты останутся прежними, а именно С77 и Н76. В связи с этим возникает вопрос — Как организовать выполнение двух и более макросов,которые имеют входные и выходные данные на одних и тех же листах, но ссылаются на разные диапазоны ячеек. Вернее на листе Данные у них диапазоны разные, а вот на листе Расчеты ячейки одни и те же..  

  Не знаю, как доходчиво смог изложить существующую проблему..    Четко понимаю, что куда нужно подставлять, а вот не знаю как организовать это подставление последовательным и без «наворачивания» книги лишними дополнительными листами..

 

Примерно так  

  Sub bb()  
Dim i&, Inp1 As Range, Inp2 As Range, Out As Range  
Set Inp1 = [Расчеты!C77]
Set Inp2 = [Расчеты!H76]
Set Out = [Расчеты!H120]
With Sheets(«Данные»)  
For i = 8 To 3000  
   Inp1 = .Cells(i, «O»)  
   Inp2 = .Cells(i, «K»)  
   .Cells(i, «R») = Out  
Next  
End With  
End Sub

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Все работает !!!!  

  Спасибо !  

  Вот только вопрос — как избавиться от #ЗНАЧ!?    
Сообщение об ошибке возникает в столбце R в том случае если нет значений в ячейках  диапазонов О8:О3000 и K8:K3000  

  и еще один момент — исполнение макроса подстановки, необходимо выполнять только в случае наличия значений и в ячейки О8 и в К8. Если в какой то из них нет значения, то R8 оставлять пустой, а переходить на проверку и заполнение О8, К8 и R8 соответственно.

 

Так как ??   Может кто нибудь помочь внести корректировки в макрос ?

 

Добавьте оператор If  

  Sub bb()  
Dim i&, Inp1 As Range, Inp2 As Range, Out As Range  
Set Inp1 = [Расчеты!C77]
Set Inp2 = [Расчеты!H76]
Set Out = [Расчеты!H120]
With Sheets(«Данные»)  
For i = 8 To 3000  
if .Cells(i, «O»)<>»» and .Cells(i, «K»)<>»» then  
Inp1 = .Cells(i, «O»)  
Inp2 = .Cells(i, «K»)  
.Cells(i, «R») = Out  
end if  
Next  
End With  
End Sub

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Уважаемый, Казанский, Вы в очередной раз стали «соломинкой для утопающего» :)  

  Огромной спасибо !  

  все работает замечательно!  

  надеюсь, на основе этого макроса смогу реализовать намеченные задумки по пересчетам..

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Уважаемый, Казанский!  
Макрос работает «на ура»! :) Вот только чем больше исходных значений.., тем дольше приходится ждать окончания работы макроса.  Занимает кучу времени!  
Да и каждый раз пересчет выполняется с самого начала, не смотря на то, что результат предыдущей работы макроса уже фигурирует на листе..  

  Я находил несколько вариантов ускорения работы макроса на сайте, но не соображу как их можно корректно внести в данный макрос.  
Если не составит труда, подскажите пожалуйста, как можно ускорить работу данного макроса при использовании входных диапазонов в 10-15000 значений-строк..

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

{quote}{login=skif}{date=14.05.2012 03:39}{thema=}{post}Занимает кучу времени!{/post}{/quote}  
охотно верю :)  
это ж сдохнуть можно — записать два значения в ячейки листа, дождаться, когда закончится пересчет листа, считать результат из ячейки листа и записать его опять на лист в другое место…  

  и так — несколько тысяч раз подряд.  
на месте Excel’я я бы Вас убил :))  
(шутка)  

  >> как можно ускорить…  
имхо, очень желательно перенести все расчеты в макрос — ускорение будет в разы, а то и в десятки раз.  
правда, тут всё зависит от самих расчётов :)  

  у меня был случай — ускоряли с человеком его самодельный макрорекодерный макрос с кое-как прикрученными циклами… суть была такая же — изменение в цикле входных данных для расчетов, запись на лист, расчет, считывание с листа, запись в журнал работы.  

  просидели один день + две ночи, ускорили почти в 2000 раз (я сам удивился! :)  
правда, там некоторая часть ускорения пришлась просто на отказ от селектов и активейтов (чего в макросе Казанского нет) — раз в 15-20. остальное — 100-120-кратное ускорение — только за счет переноса всех расчетов в макрос.

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

ну…   вижу у Вас опыт комментирования сообщений большой.. ;)  
а если по делу — предложение перегнать пересчеты в макрос хорошее, НО — к большому моему сожалению, уровень познаний в написании макросов у меня не велик (можно сказать вообще отсутствует), а привлекать людей, не вижу смысла, т.к. макрос подстановки данных всего лишь «маленькая шестеренка» в общем «механизме» пересчетов..  Весь «механизм» работает благополучно.., вот только ожидание результата немного напрягает..  
Конечно, если это время исполнения макроса невозможно сократить.., то вопрос сам собой снимается. :) чудеса иногда случаются.., но только там где это возможно :)

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Можно сократить на некоторую долю — если заполнять результатами не ячейки по-одной, а созданный пустой массив.  
В конце одним махом его выгрузить на лист.  
Если расчёты не слишком сложные — может быть время сократится даже на треть.

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

ну, если переносить расчеты в макрос не можете / не хотите,  
то могу дать только пару мелких предложений в дополнение к макросу Казанского.    

  Sub bb()  
Dim i&, Inp1 As Range, Inp2 As Range, Out As Range  
Set Inp1 = [Расчеты!C77]
Set Inp2 = [Расчеты!H76]
Set Out = [Расчеты!H120]
Application.ScreenUpdating=False  
Application.Calculation = xlCalculationManual  
With Sheets(«Данные»)  
For i = 8 To 3000  
if Len(.Cells(i, «O»)) then  
if Len(.Cells(i, «K»)) then  
Inp1.Value = .Cells(i, «O»).Value  
Inp2.Value = .Cells(i, «K»).Value  
Application.Calculate  
.Cells(i, «R»).Value = Out.Value  
end if  
end if  
Next  
End With  
Application.Calculation=xlCalculationAutomatic  
End Sub  

  ускорение однозначно будет, а вот насколько значительным — судить сложно.

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

{quote}{login=Hugo}{date=14.05.2012 05:35}{thema=}{post}Можно сократить на некоторую долю — если заполнять результатами не ячейки по-одной, а созданный пустой массив.  
В конце одним махом его выгрузить на лист.  
Если расчёты не слишком сложные — может быть время сократится даже на треть.{/post}{/quote}  
Предложение интересное, но данные в диапазонах возникают ежесуточно и из них сделать готовый массив данных невозможно.  
Работа макроса инициализируется по нажатию на кнопку запуска и его ускорить думаю возможно, если не высчитывать уже имеющиеся значения, а «продолжить» дальше

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Попробуйте так (без проверки):  

  Sub bb()  
   Dim i&, Inp1 As Range, Inp2 As Range, Out As Range  
   Dim a, b, c  
   Set Inp1 = [Расчеты!C77]
   Set Inp2 = [Расчеты!H76]
   Set Out = [Расчеты!H120]
   With Sheets(«Данные»)  
   a = .Range(«O8:O3000»).Value  
   b = .Range(«K8:K3000»).Value  
   c = .Range(«R8:R3000»).Value  
       For i = 1 To 2992  
           If a(i, 1) <> «» Then  
           If b(i, 1) <> «» Then  
               Inp1 = a(i, 1)  
               Inp2 = b(i, 1)  
               c(i, 1) = Out  
           End If  
           End If  
       Next  
    .Range(«R8:R2992»).Value = c  
   End With  
End Sub

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

только сейчас заметил:  

  вероятно, в макросе имеется небольшпя неточность для случаев пустых ячеек в столбцах O и K — сейчас макрос просто пропускает такие строки, НЕ МЕНЯЯ соответствующую ячейку в столбце R.  
скорее всего, это логически неправильно, поэтому сразу после строки  
With Sheets(«Данные»)  

  я советую добавить строку  
.[r8:r3000].clearcontents

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Если данные обрабатываются группами — то думаю несложно этот код доработать:  
1.определить разницу между последней заполненной строкой в столбцах K и R  
2.создать массивы из этих трёх диапазонов  
3.обработать как выше, но цикл for i=1 to ubound©  

  Но тестить не на чем — сообразите хоть какие данные и формулы в файле.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Сам что-то придумал… :)  

  Sub bb()  
   Dim i&, Inp1 As Range, Inp2 As Range, Out As Range  
   Dim a, b, c  
   Dim iLastRow1&, iLastRow2&  

     Set Inp1 = [Расчеты!C77]
   Set Inp2 = [Расчеты!H76]
   Set Out = [Расчеты!H120]
   With Sheets(«Данные»)  
       iLastRow1 = .Range(«O» & Rows.Count).End(xlUp).Row  
       iLastRow2 = .Range(«R» & Rows.Count).End(xlUp).Row  
       a = .Range(«O» & iLastRow2 & «:O» & iLastRow1).Value  
       b = .Range(«K» & iLastRow2 & «:K» & iLastRow1).Value  
       c = .Range(«R» & iLastRow2 & «:R» & iLastRow1).Value  
       For i = 1 To UBound©  
           If a(i, 1) <> «» Then  
               If b(i, 1) <> «» Then  
                   Inp1 = a(i, 1)  
                   Inp2 = b(i, 1)  
                   c(i, 1) = Out  
               End If  
           End If  
       Next  
       .Range(«R» & iLastRow2 & «:R» & iLastRow1).Value = c  
   End With  
End Sub

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Попробовал предложенные варианты и убедился, что есть тут место для чуда :)  все работает ЗНАЧИТЕЛЬНО ШУСТРЕЕ и вполне устраивает.    

  Товарищи, аль Господа,  ikki & Hugo   крайне признателен Вам за активное участие и содействие.  Спасибо !

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Hugo, данный макрос интересен, но есть один нюанс — при целенаправленном/случайном удалении какого-нибудь значения из диапазонов в столбцах О, К, R  после первого исполнения макроса, блокируется его работа при повторном исполнении/перерасчете.  Дальнейшее выполнение не возможно, до тех пор пока не удалить все данные расчета по столбцу R.  Это не очень удобно, т.к. провоцирует дополнительные манипуляции пользователя.  
Если ни где ни чего не удалять в столбцах, то действительно все работает достаточно быстро.

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

У меня возник дополнительный вопрос — каким образом и где конкретно необходимо изменить макрос  

  Sub bb()  
Dim i&, Inp1 As Range, Inp2 As Range, Out As Range  
Dim a, b, c  
Set Inp1 = [Расчеты!C77]
Set Inp2 = [Расчеты!H76]
Set Out = [Расчеты!H120]
With Sheets(«Данные»)  
a = .Range(«O8:O3000»).Value  
b = .Range(«K8:K3000»).Value  
c = .Range(«R8:R3000»).Value  
For i = 1 To 2992  
If a(i, 1) <> «» Then  
If b(i, 1) <> «» Then  
Inp1 = a(i, 1)  
Inp2 = b(i, 1)  
c(i, 1) = Out  
End If  
End If  
Next  
.Range(«R8:R2992»).Value = c  
End With  
End Sub  

  для того чтоб использовать дополнительную «троицу» диапазоновстолбцов листа Данные, так же подставляя их в те же самые «входные ячейки» листа Расчеты.  
На пример подстановка данных из столбцов  C и G c заполнением результата в столбец I.  
Подстановка «троицы №2» можно выполнить после, исполнения «троицы №1» о которой говорилось ранее и на которую написан данный макрос.  

  Если проще это расписать на макросе предложенном ikki, то можно и на нем..  Это не принципиально. Скорость исполнения обоих макросов приемлима. более того скажу, что оба макроса «взял на заметку» для дальнейшей работы..

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

Каким бы хорошим не был макрос, он не будет работать (или ничего не обработает), если удалять данные. Исключите вот это:    
«при целенаправленном/случайном удалении какого-нибудь значения из диапазонов в столбцах О, К, R»

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Дело в том, что есть задумки об использовании нескольких «троиц» столбцов данных для увеличения статистики перерасчетов.  Комп вроде «мощный» намерен напрягать его по полной.. :) пусть отрабатывает свою стоимость :)

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

{quote}{login=Юрий М}{date=15.05.2012 08:00}{thema=}{post}Каким бы хорошим не был макрос, он не будет работать (или ничего не обработает), если удалять данные. {/post}{/quote}  
Ваше замечание логично, но к сожаление без этого не обойтись. «Вылеты из приемлимых» значений в столбце R все же приходится удалять и вторичный запуска этого макроса неизбежен.  
Конечно можно организовать Кнопку по «стиранию» всего диапазона R, но повторяюсь, что это дополнительные манипуляции

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=skif}{date=15.05.2012 08:19}{thema=Re: }{post}Конечно можно организовать Кнопку по «стиранию» всего диапазона R, но повторяюсь, что это дополнительные манипуляции{/post}{/quote}Зачем кнопку? Перечитайте сообщение ikki от 14.05.2012, 17:53

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Вы правы. Спасибо, что обратили мое внимание на рекомендацию ikki.  

  может порекомендуете с чего начать в познании азов VBB? не постыжусь слова «для чайников» :)

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

Список полезной литературы можно посмотреть в «Копилке»

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Так как с дополнительным вопрос — каким образом и где конкретно необходимо изменить макрос ?  

  Sub bb()  
Dim i&, Inp1 As Range, Inp2 As Range, Out As Range  
Dim a, b, c  
Set Inp1 = [Расчеты!C77]
Set Inp2 = [Расчеты!H76]
Set Out = [Расчеты!H120]
With Sheets(«Данные»)  
a = .Range(«O8:O3000»).Value  
b = .Range(«K8:K3000»).Value  
c = .Range(«R8:R3000»).Value  
For i = 1 To 2992  
If a(i, 1) <> «» Then  
If b(i, 1) <> «» Then  
Inp1 = a(i, 1)  
Inp2 = b(i, 1)  
c(i, 1) = Out  
End If  
End If  
Next  
.Range(«R8:R2992»).Value = c  
End With  
End Sub  

  для того чтоб использовать дополнительную «троицу» диапазоновстолбцов листа Данные, так же подставляя их в те же самые «входные ячейки» листа Расчеты.  
На пример подстановка данных из столбцов C и G c заполнением результата в столбец I.  
Подстановка «троицы №2» можно выполнить после, исполнения «троицы №1» о которой говорилось ранее и на которую написан данный макрос.  

  Если проще это расписать на макросе предложенном ikki, то можно и на нем.. Это не принципиально.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Чтоб сильно не мудрить, напишите ещё один такой макрос Sub cc() с другими диапазонами в строках  
a = .Range(«O8:O3000»).Value  
b = .Range(«K8:K3000»).Value  
c = .Range(«R8:R3000»).Value  
.Range(«R8:R2992»).Value = c  
и может быть числом в строке  
For i = 1 To 2992  
Кстати, выгрузка вероятно должна быть  
.Range(«R8:R3000»).Value = c  
что-то я там накосячил чуть..  

  Ну и затем выполнять макрос  

  sub запускающий()  
bb  
cc  
end sub

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Согласно Вашим рекомендациям я все и сделал  
Все работает ОТЛИЧНО !   спасибо ОГРОМНОЕ !   :)  

  P.S.: чуток занят был.., по сему благодарю с некоторым опозданием. НО ИСКРЕННЕ! :)

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

#30

26.05.2012 21:04:02

{quote}{login=Hugo}{date=15.05.2012 11:40}{thema=}{post}Чтоб сильно не мудрить, напишите ещё один такой макрос Sub cc() с другими диапазонами в строках… Ну и затем выполнять макрос  
sub запускающий()…{/post}{/quote}  
Если не сложно.. Подскажите, пожалуйста, как эти существующие однотипные макросы запускать одновременно на исполнение по нажатию на одну кнопку ?  
Макросы с кнопкой все в одном листе книги..

0 / 0 / 0

Регистрация: 04.04.2020

Сообщений: 43

1

Макрос для подстановки значений в формулу и копирования результата вычисления

06.10.2021, 11:32. Показов 2794. Ответов 10


Студворк — интернет-сервис помощи студентам

Доброго дня, во вложении файл с примером. Записью макроса обойтись не могу, т.к. нужно задавать диапазон для таблицы с исходными числами для подстановки в макрос.

Есть формула, результат на выходе которой, условно зависит от одной задаваемой величины (на самом деле там много параметров, но нужно прогнать расчет для выявления зависимости от одного показателя). Нужен макрос который будет брать эти величины, подставлять их в заданную ячейку (откуда значение уже берет формула), затем копировать полученное значение результата расчета в отдельный столбец рядом со столбцом задаваемой величины. Нужно циклом прогнать расчет по всем заданным числам, и вывести результат расчета в соседний столбец.

Спасибо!



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

06.10.2021, 11:32

Ответы с готовыми решениями:

Макрос для поиска и подстановки значений перебором
Добрый день.
Возможно тема уже была, но поиск не помог.

Мне необходим макрос, который бы…

Макрос для сравнения значений в массивах и копирования на отдельный лист
Добрый день!

Нужна Ваша помощь.
Во вложении на Листе 1 имеются данные с номерами вагонов,…

Как создать макрос для копирования, вставки, формулы и двойной вставки одних и тех же значений
Привет, сторонники Excel.

Я благодарен за поддержку, которую вы мне оказываете. Я действительно…

Макрос на вычисления лучшего результата
Здравствуйте, возникла у меня такая проблема, пытаются нам пропихнуть VBA, но если в теории я еще…

10

2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,143

06.10.2021, 13:32

2

SergeyBelov,
Проверьте инструкцию в файле- там есть неточности:
в ячейке Е2 — 134 , а по инструкции должно быть 1222

Здесь и макрос не нужен…



0



5942 / 3154 / 698

Регистрация: 23.11.2010

Сообщений: 10,524

06.10.2021, 13:42

3

Narimanych, да не, все верно, в случае 1 в В4 должна быть единица, тогда мин = 134.
А вот что должно быть в С4, непонятно.
И да, вероятно макрос и не нужен



0



0 / 0 / 0

Регистрация: 04.04.2020

Сообщений: 43

06.10.2021, 14:45

 [ТС]

4

Во вложении ход расчета. Видимо я не совсем понятно расписал суть.
Значение 134 в E1 получается если значение «1» из ячейки D1 подставить в B1. Далее вниз по столбцу D методом перебора заданных в нём значений.
В контексте файла примера, да, макрос не нужен, т.к. эту формулу можно зашить сразу в столбец E. Но, как я написал в разъяснении, формула дана упрощенная, для наглядности и понимания структуры ввода и вывода параметров, по факту у меня формула которая учитывает 600 ячеек в строке в ширину. Смысл макроса подстановка значений из таблички столбца D в ячейку B1, из которой формула в строке 1 будет брать значение, ссылка на это значение во всех 600 ячейках (в ширину) этой строки заморожена, затем другая формула в строке 2 обрабатывает эти 600 значений в строке 1, и в ячейке B2 появляется число, которое нужно скопировать и занести в столбец E. Данную подстановку нужно сделать для (задаваемого) диапазона значений D111 (в файле примера), и заполнить в ячейках E1:E11 соответствующие им значения полученные из формулы.
Макрос я самостоятельно адаптирую под мою структуру файла. Суть того с какими ячейками и как он должен работать, описывает файл примера.

Миниатюры

Макрос для подстановки значений в формулу и копирования результата вычисления
 



0



530 / 467 / 183

Регистрация: 11.12.2013

Сообщений: 2,459

06.10.2021, 15:00

5

как мне кажется ничего подставлять в ячейку В4 не надо, просто считайте значение из ячейки D1 в переменную и дальше в макросе используйте эту переменную для вычислений.



0



0 / 0 / 0

Регистрация: 04.04.2020

Сообщений: 43

06.10.2021, 15:18

 [ТС]

6

Цитата
Сообщение от Алекcей
Посмотреть сообщение

как мне кажется ничего подставлять в ячейку В4 не надо, просто считайте значение из ячейки D1 в переменную и дальше в макросе используйте эту переменную для вычислений.

Логично, но, в моем случае та часть файла которая связана с ячейкой B4 и формулами в стоках 1 и 2, должна остаться нетронутой. Файл посчитан по конкретному значению B4. А макрос нужен как раз что бы иметь табличку со значениями в столбце E, которые могут получится при различных соответствующих им значениям D. Тот макрос который мне нужен, это что бы взять и провести обсчет неповоротливого файла, подставляя в ячейку B4 разные значения. Структуру формул менять нельзя. Можно конечно вручную повбивать значения в B4 и копировать значения из B2, но мне нужно проверить скажем 50 чисел.

Привожу фрагмент записи макроса:

Вот нужно сделать такой же алгоритм только что бы его можно было задать сразу через указание ячеек получения данных для подстановки D111 и ячеек вывода данных E1:E11

Код

Sub Perebor()


    Range("D4").Select
    Selection.Copy
    Range("B4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("B2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("E4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D5").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("B4").Select
    ActiveSheet.Paste
    Range("B2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("E5").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D6").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("B4").Select
    ActiveSheet.Paste
    Range("B2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("E6").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("E8").Select
End Sub



0



530 / 467 / 183

Регистрация: 11.12.2013

Сообщений: 2,459

06.10.2021, 16:44

7

не уверен что сделал то, что нужно, но посмотрите на всякий случай



1



0 / 0 / 0

Регистрация: 04.04.2020

Сообщений: 43

07.10.2021, 14:24

 [ТС]

8

Добрый день. Видимо я своим файлом примера ввел в заблуждение. Приведу более развернутое описание. Ведется расчет срока окупаемости (курсовая), есть файл с расчетом. Его структура на изображении. В сами формулы макрос не должен вмешиваться. Задача макроса брать значения из таблички «вариация тарифа» и подставлять в ячейку отмеченную стрелочкой, затем полученное значение из другой ячейки «срок окупаемости» копировать и заносить в таблицу в соседний столбец. Сам файл трогать нельзя. Поэтом и прошу помочь с макросом, т.к. он нужен как «примочка» к текущему расчету что бы ускорить обсчет различных величин тарифа и получить соответствующие им сроки окупаемости.
Спасибо!

Миниатюры

Макрос для подстановки значений в формулу и копирования результата вычисления
 



0



5942 / 3154 / 698

Регистрация: 23.11.2010

Сообщений: 10,524

07.10.2021, 14:57

9

SergeyBelov, лучше приложите файл, замените свои подписи на «овцы» и «бараны», оно точно не к чему)



1



0 / 0 / 0

Регистрация: 04.04.2020

Сообщений: 43

07.10.2021, 15:29

 [ТС]

10

Во вложении файл с задачей. Насколько смог подробно описал требуемые для макроса действия.



0



SergeyBelov

0 / 0 / 0

Регистрация: 04.04.2020

Сообщений: 43

08.10.2021, 15:39

 [ТС]

11

Нашел на эксельпедии вот такой макрос:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub PereborDiapazonaYacheek() 
'Шаг 1: Объявить переменные 
Dim MyRange As Range Dim MyCell As Range
 'Шаг 2: Определение целевого диапазона.
 Set MyRange = Range("D6:D17") 
'Шаг 3: Запуск цикла через диапазон. 
For Each MyCell In MyRange 
'Шаг 4: Какое-либо действие с каждой ячейкой.
[B] If MyCell.Value > 3000 Then 
MyCell.Font.Bold = True End If [/B]
'Шаг 5: Перейти к следующей ячейке в диапазоне Next MyCell End Sub

Если заменить 2 выделенные строки кода на действие копировать в такую то ячейку и потом скопировать результат из третьей, и затем записать в четвертую, этот алгоритм будет работать? Я так понимаю что будет все записываться в одну ячейку. Что бы макрос записал столбец с результатом, нужно параллельно запускать второй цикл для заполнения ячеек с результатом?

Спасибо!



0



Во вложении очень полезный макрос «Подстановка», написанный под версию Excel 2003.
Он подставляет данные по ключу из одной книги в другую, может суммировать, выбирать большее или меньшее из подставляемых значений. Очень удобно.
Добавляется автоматически в Надстройки при запуске файла.

При изменении настроек безопасности в Excel и установки компонентов VBA он прекрасно работает в версии 2007. Но вот в Excel 2010 работать не хочет.
Помогите, пожалуйста, разобраться, в чём проблема и «починить» файлик.

Запускается так: наводим на «Подстановка» в списке надстроек, в выпадающем списке выбираем Лист-источник, далее двойной щелчок по любой ячейке в столбце с данными, которые хотим подставить, нажимаем ОК. Потом двойной щелчок мышью по ячейке в столбце с ключами. Наживаем ОК. Потом переходим в файл, куда будем подставлять. Наводим мышкой на Подстановка, выбираем Лист-получатель. Опять выбираем столбец, куда подставляем и по каким ключам. Наводим на Подстановка и нажимаем Выполнить и заполнить пустые (например). И макрос по типу ВПР всё подставит (просуммирует).
[moder]Дайте теме более конкретное название в соответствии с Правилами форума[/moder]

При работе с табличными данными в Excel часто требуется отредактировать большой объем значений в ячейках, дописать текст в конце или в начале значений, подставить заданный символ в определенное положение либо заменить один символ другим во всех значениях ячеек заданного диапазона.

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

Кроме стандартных решений, встроенных в приложение Excel, описанные выше задачи можно решать при помощи разработок, использующих встроенный в приложения Office язык программирования VBA (Visual Basic for Application). Об одной из таких разработок и пойдет речь далее.

Надстройка для Excel работает со значениями выделенных диапазонов ячеек. Значением для подстановки может служить любой символ либо их сочетание. Кроме этого предусмотрена возможность задать для подстановки одиночный символ по его ASCII-коду.

kak podstavit simvol v znacheniya yacheek diapazona

CompleteSolutionнадстройка для быстрой замены символов и подстановки значений

Подстановка значения в конце либо в начале значений ячейки

Для быстрой подстановки указанного значения во все значения выделенного диапазона ячеек достаточно лишь выделить диапазон, указать подставляемое значение и выбрать соответствующую опцию в разделе выбора позиции для подстановки.

Подстановка значения в заданную позицию

Быстрая вставка заданного одиночного символа или значения из нескольких символов в определенную позицию исходных значений осуществляется также просто, необходимо активировать опцию «Номер позиции» и установить в нем числовое значение – то есть именно ту позицию, в которую будет произведена вставка.

Вставка непечатаемых символов

Чтобы вставить непечатаемый (невидимый) символ, например, перевод строки, соответствующий сочетанию горячих клавиш Alt+Enter, в диалоговом окне надстройки можно использовать возможность ввода ASCII-кода вместо самого символа. Таким образом, для вставки перевода строки необходимо выбрать опцию «Символ с ASCII-кодом:» и в текстовом поле указать значение 10.

Стандартная замена значений

При использовании стандартного поиска и замены значений, который активируется нажатием сочетания горячих клавишь Ctrl+F, происходит замена ВСЕХ найденных значений, но часто нужно произвести выборочную замену, например найти и заменить только те значения, которые находятся после десятого символа или сделать только три замены, оставив остальные найденные значения без изменений. Это позволяет сделать функция, используемая в надстройке.

Замена значений от заданной позиции

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

Замена значений с заданным количеством замен

Установка флажка в поле «количество замен» позволяет ограничить количество замен установленным числовым значением. Дополнительные условия для поиска и замены допускается использовать как по отдельности, так и одновременно, что позволяет сделать этот инструмент гораздо более гибким по сравнению со стандартными средствами Excel.

Под выпадающим списком понимается содержание в одной ячейке нескольких значений. Когда пользователь щелкает по стрелочке справа, появляется определенный перечень. Можно выбрать конкретное.

Очень удобный инструмент Excel для проверки введенных данных. Повысить комфорт работы с данными позволяют возможности выпадающих списков: подстановка данных, отображение данных другого листа или файла, наличие функции поиска и зависимости.

Создание раскрывающегося списка

Путь: меню «Данные» — инструмент «Проверка данных» — вкладка «Параметры». Тип данных – «Список».

Создание выпадающего списка.

Ввести значения, из которых будет складываться выпадающий список, можно разными способами:

  1. Вручную через «точку-с-запятой» в поле «Источник».
  2. Ввод значений.

  3. Ввести значения заранее. А в качестве источника указать диапазон ячеек со списком.
  4. Проверка вводимых значений.

  5. Назначить имя для диапазона значений и в поле источник вписать это имя.

Имя диапазона.
Раскрывающийся список.

Любой из вариантов даст такой результат.



Выпадающий список в Excel с подстановкой данных

Необходимо сделать раскрывающийся список со значениями из динамического диапазона. Если вносятся изменения в имеющийся диапазон (добавляются или удаляются данные), они автоматически отражаются в раскрывающемся списке.

  1. Выделяем диапазон для выпадающего списка. В главном меню находим инструмент «Форматировать как таблицу».
  2. Форматировать как таблицу.

  3. Откроются стили. Выбираем любой. Для решения нашей задачи дизайн не имеет значения. Наличие заголовка (шапки) важно. В нашем примере это ячейка А1 со словом «Деревья». То есть нужно выбрать стиль таблицы со строкой заголовка. Получаем следующий вид диапазона:
  4. Выпадающий список.

  5. Ставим курсор в ячейку, где будет находиться выпадающий список. Открываем параметры инструмента «Проверка данных» (выше описан путь). В поле «Источник» прописываем такую функцию:

Ввод значения в источник.

Протестируем. Вот наша таблица со списком на одном листе:

Список и таблица.

Добавим в таблицу новое значение «елка».

Добавлено значение елка.

Теперь удалим значение «береза».

Удалено значение береза.

Осуществить задуманное нам помогла «умная таблица», которая легка «расширяется», меняется.

Теперь сделаем так, чтобы можно было вводить новые значения прямо в ячейку с этим списком. И данные автоматически добавлялись в диапазон.

Ввод данных из списка.

  1. Сформируем именованный диапазон. Путь: «Формулы» — «Диспетчер имен» — «Создать». Вводим уникальное название диапазона – ОК.
  2. Создание имени.

  3. Создаем раскрывающийся список в любой ячейке. Как это сделать, уже известно. Источник – имя диапазона: =деревья.
  4. Снимаем галочки на вкладках «Сообщение для ввода», «Сообщение об ошибке». Если этого не сделать, Excel не позволит нам вводить новые значения.
  5. Сообщение об ошибке.

  6. Вызываем редактор Visual Basic. Для этого щелкаем правой кнопкой мыши по названию листа и переходим по вкладке «Исходный текст». Либо одновременно нажимаем клавиши Alt + F11. Копируем код (только вставьте свои параметры).
  7. Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim lReply As Long
     
        If Target.Cells.Count > 1 Then Exit Sub
        If Target.Address = "$C$2" Then
         If IsEmpty(Target) Then Exit Sub
           If WorksheetFunction.CountIf(Range("Деревья"), Target) = 0 Then
              lReply = MsgBox("Добавить введенное имя " & _
                             Target & " в выпадающий список?", vbYesNo + vbQuestion)
              If lReply = vbYes Then
                  Range("Деревья").Cells(Range("Деревья").Rows.Count + 1, 1) = Target
              End If
           End If
         End If
    End Sub
     
  8. Сохраняем, установив тип файла «с поддержкой макросов».
  9. Сообщение об ошибке.

  10. Переходим на лист со списком. Вкладка «Разработчик» — «Код» — «Макросы». Сочетание клавиш для быстрого вызова – Alt + F8. Выбираем нужное имя. Нажимаем «Выполнить».

Макрос.

Когда мы введем в пустую ячейку выпадающего списка новое наименование, появится сообщение: «Добавить введенное имя баобаб в выпадающий список?».

Нажмем «Да» и добавиться еще одна строка со значением «баобаб».

Выпадающий список в Excel с данными с другого листа/файла

Когда значения для выпадающего списка расположены на другом листе или в другой книге, стандартный способ не работает. Решить задачу можно с помощью функции ДВССЫЛ: она сформирует правильную ссылку на внешний источник информации.

  1. Делаем активной ячейку, куда хотим поместить раскрывающийся список.
  2. Открываем параметры проверки данных. В поле «Источник» вводим формулу: =ДВССЫЛ(“[Список1.xlsx]Лист1!$A$1:$A$9”).

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

Как сделать зависимые выпадающие списки

Возьмем три именованных диапазона:

Три именованных диапазона.

Это обязательное условие. Выше описано, как сделать обычный список именованным диапазоном (с помощью «Диспетчера имен»). Помним, что имя не может содержать пробелов и знаков препинания.

  1. Создадим первый выпадающий список, куда войдут названия диапазонов.
  2. Список диапазонов.

  3. Когда поставили курсор в поле «Источник», переходим на лист и выделяем попеременно нужные ячейки.
  4. Таблица со списком.

  5. Теперь создадим второй раскрывающийся список. В нем должны отражаться те слова, которые соответствуют выбранному в первом списке названию. Если «Деревья», то «граб», «дуб» и т.д. Вводим в поле «Источник» функцию вида =ДВССЫЛ(E3). E3 – ячейка с именем первого диапазона.
  6. Второй раскрывающийся список.

    Выбор нескольких значений из выпадающего списка Excel

    Бывает, когда из раскрывающегося списка необходимо выбрать сразу несколько элементов. Рассмотрим пути реализации задачи.

    1. Создаем стандартный список с помощью инструмента «Проверка данных». Добавляем в исходный код листа готовый макрос. Как это делать, описано выше. С его помощью справа от выпадающего списка будут добавляться выбранные значения.
    2. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("Е2:Е9")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              If Len(Target.Offset(0, 1)) = 0 Then
                  Target.Offset(0, 1) = Target
              Else
                  Target.End(xlToRight).Offset(0, 1) = Target
              End If
              Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub
       
    3. Чтобы выбранные значения показывались снизу, вставляем другой код обработчика.
    4. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("Н2:К2")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              If Len(Target.Offset(1, 0)) = 0 Then
                  Target.Offset(1, 0) = Target
              Else
                  Target.End(xlDown).Offset(1, 0) = Target
              End If
              Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub
       
    5. Чтобы выбираемые значения отображались в одной ячейке, разделенные любым знаком препинания, применим такой модуль.

    6. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("C2:C5")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              newVal = Target
              Application.Undo
              oldval = Target
              If Len(oldval) <> 0 And oldval <> newVal Then
                  Target = Target & "," & newVal
              Else
                  Target = newVal
              End If
              If Len(newVal) = 0 Then Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub

    Не забываем менять диапазоны на «свои». Списки создаем классическим способом. А всю остальную работу будут делать макросы.

    Выпадающий список с поиском

    1. На вкладке «Разработчик» находим инструмент «Вставить» – «ActiveX». Здесь нам нужна кнопка «Поле со списком» (ориентируемся на всплывающие подсказки).
    2. Вставить ActiveX.

    3. Щелкаем по значку – становится активным «Режим конструктора». Рисуем курсором (он становится «крестиком») небольшой прямоугольник – место будущего списка.
    4. Элемент ActiveX.

    5. Жмем «Свойства» – открывается перечень настроек.
    6. Свойства ActiveX.

    7. Вписываем диапазон в строку ListFillRange (руками). Ячейку, куда будет выводиться выбранное значение – в строку LinkedCell. Для изменения шрифта и размера – Font.

    Скачать пример выпадающего списка

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

Понравилась статья? Поделить с друзьями:
  • Макросы в excel функция в макросе
  • Макросы в excel по все строками
  • Макросы в excel функция for
  • Макросы в excel перенос ячеек
  • Макросы в excel форматирование таблиц