На чтение 4 мин. Просмотров 33.1k.
Итог: ознакомьтесь с 3 советами по написанию и созданию формул в макросах VBA с помощью этой статьи и видео.
Уровень мастерства: Средний
Автоматизировать написание формул
Написание формул может быть одной из самых трудоемких частей
вашей еженедельной или ежемесячной задачи Excel. Если вы работаете над
автоматизацией этого процесса с помощью макроса, вы можете попросить VBA
написать формулу и ввести ее в ячейки.
Поначалу написание формул в VBA может быть немного сложнее,
поэтому вот три совета, которые помогут сэкономить время и упростить процесс.
Совет № 1: Свойство Formula
Свойство Formula является членом объекта Range в VBA. Мы можем использовать его для установки / создания формулы для отдельной ячейки или диапазона ячеек.
Есть несколько требований к значению формулы, которые мы устанавливаем с помощью свойства Formula:
- Формула представляет собой строку текста, заключенную в кавычки. Значение формулы должно начинаться и заканчиваться кавычками.
- Строка формулы должна начинаться со знака равенства = после первой кавычки.
Вот простой пример формулы в макросе.
Sub Formula_Property() ' Формула представляет собой строку текста, заключенную в кавычки ' Начинается со знака = Range("B10").Formula = "=SUM(B4:B9)" End Sub
Свойство Formula также можно использовать для чтения существующей формулы в ячейке.
Совет № 2: Используйте Macro Recorder
Если ваши формулы более сложные или содержат специальные
символы, их будет сложнее написать в VBA. К счастью, мы можем использовать
рекордер макросов, чтобы создать код для нас.
Вот шаги по созданию кода свойства формулы с помощью средства записи макросов.
- Включите средство записи макросов (вкладка «Разработчик»> «Запись макроса»)
- Введите формулу или отредактируйте существующую формулу.
- Нажмите Enter, чтобы ввести формулу.
- Код создается в макросе.
Если ваша формула содержит кавычки или символы амперсанда, макрос записи будет учитывать это. Он создает все подстроки и правильно упаковывает все в кавычки. Вот пример.
Sub Macro10() ' Используйте средство записи макросов для создания кода для сложных формул с ' специальны символы и относительные ссылки ActiveCell.FormulaR1C1 = "=""Total Sales: "" & TEXT(R[-5]C,""$#,###"")" End Sub
Совет № 3: Нотация формулы стиля R1C1
Если вы используете средство записи макросов для формул, вы
заметите, что он создает код со свойством FormulaR1C1.
Нотация стиля R1C1 позволяет нам создавать как относительные (A1), абсолютные ($A$1), так и смешанные ($A1, A$1) ссылки в нашем макрокоде.
R1C1 обозначает строки и столбцы.
Относительные ссылки
Для относительных ссылок мы указываем количество строк и
столбцов, которые мы хотим сместить от ячейки, в которой находится формула.
Количество строк и столбцов указывается в квадратных скобках.
Следующее создаст ссылку на ячейку, которая на 3 строки выше
и на 2 строки справа от ячейки, содержащей формулу.
Отрицательные числа идут вверх по строкам и столбцам слева.
Положительные числа идут вниз по строкам и столбцам справа.
Абсолютные ссылки
Мы также можем использовать нотацию R1C1 для абсолютных ссылок. Обычно это выглядит как $A$2.
Для абсолютных ссылок мы НЕ используем квадратные скобки. Следующее создаст прямую ссылку на ячейку $A$2, строка 2, столбец 1
При создании смешанных ссылок относительный номер строки или
столбца будет зависеть от того, в какой ячейке находится формула.
Проще всего использовать макро-рекордер, чтобы понять это.
Свойство FormulaR1C1 и свойство формулы
Свойство FormulaR1C1 считывает нотацию R1C1 и создает
правильные ссылки в ячейках. Если вы используете обычное свойство Formula с
нотацией R1C1, то VBA попытается вставить эти буквы в формулу, что, вероятно,
приведет к ошибке формулы.
Поэтому используйте свойство Formula, если ваш код содержит
ссылки на ячейки ($ A $ 1), свойство FormulaR1C1, когда вам нужны относительные
ссылки, которые применяются к нескольким ячейкам или зависят от того, где
введена формула.
Если ваша электронная таблица изменяется в зависимости от
условий вне вашего контроля, таких как новые столбцы или строки данных,
импортируемые из источника данных, то относительные ссылки и нотация стиля
R1C1, вероятно, будут наилучшими.
Я надеюсь, что эти советы помогут. Пожалуйста, оставьте
комментарий ниже с вопросами или предложениями.
Вставка формулы со ссылками в стиле A1 и R1C1 в ячейку (диапазон) из кода VBA Excel. Свойства Range.FormulaLocal и Range.FormulaR1C1Local.
Свойство Range.FormulaLocal
FormulaLocal — это свойство объекта Range, которое возвращает или задает формулу на языке пользователя, используя ссылки в стиле A1.
В качестве примера будем использовать диапазон A1:E10, заполненный числами, которые необходимо сложить построчно и результат отобразить в столбце F:
Примеры вставки формул суммирования в ячейку F1:
Range(«F1»).FormulaLocal = «=СУММ(A1:E1)» Range(«F1»).FormulaLocal = «=СУММ(A1;B1;C1;D1;E1)» |
Пример вставки формул суммирования со ссылками в стиле A1 в диапазон F1:F10:
Sub Primer1() Dim i As Byte For i = 1 To 10 Range(«F» & i).FormulaLocal = «=СУММ(A» & i & «:E» & i & «)» Next End Sub |
В этой статье я не рассматриваю свойство Range.Formula, но если вы решите его применить для вставки формулы в ячейку, используйте англоязычные функции, а в качестве разделителей аргументов — запятые (,) вместо точек с запятой (;):
Range(«F1»).Formula = «=SUM(A1,B1,C1,D1,E1)» |
После вставки формула автоматически преобразуется в локальную (на языке пользователя).
Свойство Range.FormulaR1C1Local
FormulaR1C1Local — это свойство объекта Range, которое возвращает или задает формулу на языке пользователя, используя ссылки в стиле R1C1.
Формулы со ссылками в стиле R1C1 можно вставлять в ячейки рабочей книги Excel, в которой по умолчанию установлены ссылки в стиле A1. Вставленные ссылки в стиле R1C1 будут автоматически преобразованы в ссылки в стиле A1.
Примеры вставки формул суммирования со ссылками в стиле R1C1 в ячейку F1 (для той же таблицы):
‘Абсолютные ссылки в стиле R1C1: Range(«F1»).FormulaR1C1Local = «=СУММ(R1C1:R1C5)» Range(«F1»).FormulaR1C1Local = «=СУММ(R1C1;R1C2;R1C3;R1C4;R1C5)» ‘Ссылки в стиле R1C1, абсолютные по столбцам и относительные по строкам: Range(«F1»).FormulaR1C1Local = «=СУММ(RC1:RC5)» Range(«F1»).FormulaR1C1Local = «=СУММ(RC1;RC2;RC3;RC4;RC5)» ‘Относительные ссылки в стиле R1C1: Range(«F1»).FormulaR1C1Local = «=СУММ(RC[-5]:RC[-1])» Range(«F2»).FormulaR1C1Local = «=СУММ(RC[-5];RC[-4];RC[-3];RC[-2];RC[-1])» |
Пример вставки формул суммирования со ссылками в стиле R1C1 в диапазон F1:F10:
‘Ссылки в стиле R1C1, абсолютные по столбцам и относительные по строкам: Range(«F1:F10»).FormulaR1C1Local = «=СУММ(RC1:RC5)» ‘Относительные ссылки в стиле R1C1: Range(«F1:F10»).FormulaR1C1Local = «=СУММ(RC[-5]:RC[-1])» |
Так как формулы с относительными ссылками и относительными по строкам ссылками в стиле R1C1 для всех ячеек столбца F одинаковы, их можно вставить сразу, без использования цикла, во весь диапазон.
Добрый день! Скажите можно ли скопировать формулу макросом в активную ячейку =F12*E12*(1+NDS)*(1-DISCOUNT3M) (формула находиться допустим на листе1 в ячейке «A1» Либо сразу вставлять формулу из макроса. |
|
Nic70y Пользователь Сообщений: 3289 Win7 MSO 2013 |
#2 27.07.2013 21:56:04 Какое-то не соответствие
|
||
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
В который раз…))) Если уж макрос — зачем формула? Вычисляйте прямо в коде и вставляйте уже значение. |
Требуется как раз получить не значение а ячейку с формулой, которая и будет уже выполнять свои действия. |
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#5 27.07.2013 23:45:19
… и вернёт значение )) Как хотите… |
||
ikki Пользователь Сообщений: 9709 |
три раза перечитал. что надо сделать с формулой, чтобы её искорёжить требуемым образом? может, начнём с начала, а не с середины? фрилансер Excel, VBA — контакты в профиле |
Ну просто значение останется значением в ячейке, а формула будет работать на листе, что собственно и требуется. |
|
Nic70y Пользователь Сообщений: 3289 Win7 MSO 2013 |
Александр.М, я думал Вы просто ошиблись в строках, но ikki уточнил, а Вы ему так и не ответили. |
vikttur Пользователь Сообщений: 47199 |
Т.е. если при изменении исходных данных для формулы макрос вместо этой формулы вставит значение в ячейку, то это плохо? |
Что касается задачи: есть основная таблица, считает склад, представляет из себя большой список позиций и формул. Работает в скрытом режиме, все действия осуществляются с другого листа макросами и только мышью. Решение: жмем на кнопочку «добавить позицию» появляется лист (форма) с указаниями, кнопочками и обязательными полями, поля заполняются в соответствии с новой позицией, артикул, название и тд Макрос в свою очередь выполняет выше указанный ряд действий в соответствии с формой. В двух словах, надо макрасом в определенном месте таблицы создать новую строку и правильно заполнить |
|
ikki Пользователь Сообщений: 9709 |
#11 28.07.2013 02:21:53 спасибо за пояснения. правда, намного легче не стало. но так и не понятно — зачем копировать формулы с листа формы?
фрилансер Excel, VBA — контакты в профиле |
||
ikki Пользователь Сообщений: 9709 |
гм… фрилансер Excel, VBA — контакты в профиле |
формулы в таблице =F12*E12*(1+NDS)*(1-DISCOUNT3M) я просто не могу предположить как разница может повлиять на дальнейшую работу программы Еще проще, вот выделил я ячейку E2, выполнить макрос, макос вставил формулу в Е2: =B2+C2/D2 |
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#14 28.07.2013 03:04:15
Вот без формул: выделяйте ячейки в жёлтом диапазоне. Прикрепленные файлы
|
||
vikttur Пользователь Сообщений: 47199 |
Нужно еще на изменение влияющих ячеек. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Я просто показать, что можно и без формул выполнять требуемые вычисления)) А на влияющие — событие Change — согласен. Но автору всё равно нужны формулы)) |
marussia Пользователь Сообщений: 64 |
Коллеги! Подскажите, где ошибка… где Kolvo1 и Kolvo2 — переменные с цифровым значением |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#18 16.09.2015 12:22:05 marussia, замените .Value на .FormulaLocal
Изменено: JayBhagavan — 16.09.2015 12:25:24 <#0> |
||
Get a formula from a cell using VBA in Excel.
This method returns the actual formula instead of the output value.
Get the Formula of a Cell into a Macro
We use the Formula property for this.
To get the formula in cell A1, type this in a macro:
Range("A1").Formula
I will put MsgBox in front of this line of code so we can see the output in Excel:
MsgBox Range("A1").Formula
Go back to Excel and run it on a cell that has a date and this is the result:
In cell A1, you can see the actual visible output, which is the date, and in the message box pop-up you can see the formula that was used to create the output.
Using Formula in VBA means that the macro will get the formula that we see in the message box.
Notes
This is pretty straightforward, if you want to get the value of a cell that is easy and you can read about it in the link.
Download the attached workbook to see this example in Excel.
Excel VBA Course — From Beginner to Expert
200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides
Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)
View Course
Similar Content on TeachExcel
Get Text from Comments in Excel Including the Author of the Comment — UDF
Macro: Output all text from a cell comment, including comment author, with this UDF in Excel. Thi…
Loop through a Range of Cells in Excel VBA/Macros
Tutorial: How to use VBA/Macros to iterate through each cell in a range, either a row, a column, or …
Limit the Total Amount a User Can Enter into a Range of Cells in Excel
Tutorial: How to limit the amount that a user can enter into a range of cells in Excel. This works…
Me Keyword in Excel Macros & VBA
Tutorial: The Me keyword in Excel VBA allows you to refer to either the current worksheet, workbook,…
Select Ranges of Cells in Excel using Macros and VBA
Tutorial: This Excel VBA tutorial focuses specifically on selecting ranges of cells in Excel. This…
Subscribe for Weekly Tutorials
BONUS: subscribe now to download our Top Tutorials Ebook!
Excel VBA Course — From Beginner to Expert
200+ Video Lessons
50+ Hours of Video
200+ Excel Guides
Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)
View Course
mor_sergey 77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
||||
1 |
||||
Формула эксель через макрос08.08.2018, 14:51. Показов 16080. Ответов 36 Метки нет (Все метки)
toiai, ребята знающие, подскажите пожалуйста…..как такую формулу сделать програмно…в макрос. Код =(СУММЕСЛИ(D6:AH6;">0";D6:AH6)-СУММЕСЛИ(D6:AH6;"<0";D6:AH6))-$CR$5 вот что получается:
написать все что в больших скобках получилось…не знаю как из всего этого вычесть содержимое ячейки. как граммотно применить «Address(0, 0)»? спасибо за советы
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
08.08.2018, 14:51 |
Ответы с готовыми решениями: Макрос для Эксель Макрос эксель. Фильтровка Макрос для таблицы эксель с поиском Макрос на сохранение двух листов эксель в отдельные файлы mht 36 |
Ruella 471 / 161 / 79 Регистрация: 07.10.2015 Сообщений: 377 |
||||||||
08.08.2018, 16:11 |
2 |
|||||||
mor_sergey, честно говоря, непонятно, при чем тут Address… А может, я вообще задачу не понимаю
2. А если хотите там видеть саму формулу (с вычислениями, разумеется), то попытайтесь следующим образом (правда, может выдать ошибку):
1 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
08.08.2018, 16:19 [ТС] |
3 |
Ruella, спасибо большое за отклик, попробую еще раз….но мне нужно параметрически сделать….таблица генерироваться по-разному будет….и привязать нужно формулу к ячейкам. cells(1,1).Address в дебагпринте пишет именно адрес ячейки и основную часть формулы таким способом перенесли (делал не я), не пойму как грамотно то же самое сделать, но с одной ячейкой…вычесть из того, что уже написано
0 |
Ruella 471 / 161 / 79 Регистрация: 07.10.2015 Сообщений: 377 |
||||
08.08.2018, 16:31 |
4 |
|||
mor_sergey, все равно мало что поняла
Все равно не срабатывает?
1 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
08.08.2018, 16:34 [ТС] |
5 |
тип мис меч пишет) не соответствие типо…я так пробывал, только без адрес без скобок в конце
0 |
Ruella 471 / 161 / 79 Регистрация: 07.10.2015 Сообщений: 377 |
||||
08.08.2018, 16:47 |
6 |
|||
mor_sergey, ну, не знаю… Я попробовала так (заменила в вышеуказанном только ссылку на последнюю ячейку, остальное оставила):
и все сработало, как полагается. Адрес ячейки, разумеется, можно заменить на нужный.
1 |
mor_sergey 77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
||||
08.08.2018, 20:21 [ТС] |
7 |
|||
Ruella, синтаксис……незнал как написать…Вы мне дали на водку) все работает
0 |
1811 / 1134 / 345 Регистрация: 11.07.2014 Сообщений: 3,999 |
|
09.08.2018, 07:01 |
8 |
А я НЕ ЗНАЛ, что НА ВОДКУ должен давать тот, который помогает, казалось бы надо наоборот.
1 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
09.08.2018, 07:50 [ТС] |
9 |
Burk, как всегда острите….. Оговорочка по Фрейду. Так было задумано
0 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
13.08.2018, 12:42 [ТС] |
10 |
Ruella, не могу придумать как посчитать сумму последовательных(друг за другом идущих) закрашенных ячеек в строке и если она >42, то действие (какое не придумал) если функцией, то как применить в коде Спасибо
0 |
471 / 161 / 79 Регистрация: 07.10.2015 Сообщений: 377 |
|
13.08.2018, 16:40 |
11 |
mor_sergey, а можно немножко поконкретнее? что значит «закрашенных ячеек» и «идущих подряд» (по строкам, по столбцам или еще как)? В общем, огласите задачу целиком, плиз
1 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
13.08.2018, 16:47 [ТС] |
12 |
Ruella, хочу чтобы контроллировались часы работы…… Миниатюры
0 |
471 / 161 / 79 Регистрация: 07.10.2015 Сообщений: 377 |
|
13.08.2018, 21:06 |
13 |
mor_sergey, все равно вопросы остаются
1 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
13.08.2018, 21:27 [ТС] |
14 |
Ruella, Здорово…но Вы правы:1. правило должно работать для каждой строки (для каждого человека) 2. таблица заполняется вручную и если больше нормы, то либо подсказка, либо может подсказка+ невозможность еще часов добавить… на картинке моей(скриншоте) видно, что доп графа есть….норма рабочей смены…….8 и 11 ч
0 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
13.08.2018, 22:17 [ТС] |
15 |
Ruella, вставил Ваш код….все просчитывает, но в конце division by zero и указывает на а вообще нужно как в #14 Миниатюры
0 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
14.08.2018, 11:52 [ТС] |
16 |
Ruella,
но в конце division by zero и указывает на исправил…нижняя граница была со смещением на строку… Добавлено через 4 часа 10 минут
0 |
471 / 161 / 79 Регистрация: 07.10.2015 Сообщений: 377 |
|
14.08.2018, 11:58 |
17 |
mor_sergey, ну, это смотря что Вы хотите. Имеет ли смысл запускать всю эту перерисовку при каждой активации листа? или даже при каждом открытии книги? Если принудительный запуск неудобен, то попробуйте подобрать более подходящее событие — например, при изменении каких-то конкретных ячеек на листе (каких именно — Вам виднее)
1 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
14.08.2018, 12:02 [ТС] |
18 |
именно…при изменении только рабочей области(без шапки и расчетных ячеек разумеется). Какие коррективы в код внести, чтобы макрос не сам заполнял, а считал то, что заполняет человек Добавлено через 14 секунд
0 |
471 / 161 / 79 Регистрация: 07.10.2015 Сообщений: 377 |
|
14.08.2018, 12:17 |
19 |
mor_sergey, я уже малость запуталась
1 |
77 / 11 / 0 Регистрация: 28.03.2018 Сообщений: 828 |
|
14.08.2018, 12:31 [ТС] |
20 |
Ruella, человек заполняет таблицу, макрос контроллирует, чтобы сумма последовательно заполненных(др за др) ячеек не была больше 42 (в Вашем коде сделано именно как надо), если больше, след ячейка остается пустая(вых) и выха должно быть два.ну а потом по циклу…..и так для каждой строки. Немного переделать Ваш код нужно….не соображу как
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
14.08.2018, 12:31 |
Помогаю со студенческими работами здесь Макрос создания нового листа в Эксель с названием от 1 и далее нарастающим итогом Спасите, пожалуйста, создать макрос, который запишет темы писем в Эксель
Формула или макрос Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |