Excel vba вставить формулу в ячейку

Обновлено: 01.07.2024

Я пытаюсь написать некоторый VBA, который будет добавлять текст заголовка к 3 ячейкам, а затем заполнять формулу вплоть до последней строки. Я написал ниже, что пишет заголовки без проблем, но когда он попадает в мой первый .Formula , он бросает

Ошибка приложения или объекта

Что нужно изменить, чтобы этот макрос успешно выполнялся? (Формулы были извлечены непосредственно из формулы в ячейке, поэтому я знаю, что они являются действительными формулами, по крайней мере, на «переднем конце»)

3 ответа

Проблема, вероятно, в том, что вы избегаете кавычек с формулой.

Что вам нужно это:

Для первого, например. Другие цитаты должны быть удвоены.

В качестве дополнительного примечания было бы также лучше указать лист, над которым вы работаете, что-то вроде:

Если вы этого не сделаете, иногда вы можете столкнуться с ошибками при запуске кода.

Первый вопрос - выбор ячеек. Для этого макрос должен выбрать ячейку, а затем определить адрес ячейки. Если вам действительно нужно выбрать ячейку, используйте Application.ScreenUpdating = False . Тогда макрос не должен показывать выбор курсора ячейки. Отбрасывание выбора и включение диапазона в строку кода назначения формулы, как показано ниже, увеличит скорость / эффективность.

Range("E2:E" & Cells(Rows.Count, "C").End(xlUp).Row) является версией кода выбора последней ячейки в пустом столбце (строка 1048576), затем с помощью нажатия клавиши ctrl и клавиши вверх для определения самой нижней / последней использованной ячейки. Это дает вам счетчик строк 1 каждый раз, так как столбец пуст. Так как вы ищете последний ряд. Может быть быстрее отсчитывать сверху. Мой любимый метод для этого - цикл. Увеличивайте переменную в цикле, ища последнюю строку. Затем переменная может быть использована вместо вашей стратегии снизу вверх.

Точно так же, как TSQL, кавычки должны иметь свои кавычки.

Вот результирующий код. Это заполнит диапазон, начиная с последней строки в Excel.

Помимо использования двойных кавычек, вам может понадобиться использовать 0 в первых двух формулах, в противном случае они могут вычислять пустые строки. Это может дать неожиданные результаты для последней формулы, то есть неправильно вернуть «Issue».

Если у вас нет пустых столбцов между вашими данными и 3 новыми столбцами, вы можете использовать CurrentRegion, чтобы определить количество строк:

А так не пробовали?

Почему у меня ошибка? Вроде все правильно!
Sub ЗаписьФормул()
'Вычисление последней занятой строки на листе Преподаватели
n = WorksheetFunction.CountA(Worksheets ("Преподаватели").Range("A:A"))
krit = Worksheets("Преподаватели").Cells(n , 1).Value
Cells(n, 1).FormulaLocal = "=СУММЕСЛИ(Нагрузка!CB:CB;[krit];Нагрузка!AG:AG)"
' здесь пишем остальные формулы
Application.Calculation = xlCalculationAutomatic
End Sub Последний раз редактировалось EducatedFool; 12.05.2009 в 11:59 .

Помогите пожалуйста, не могу вставить формулы!

'Вычисление последней строки на листе Группа
n = WorksheetFunction.CountA(Worksheets ("Нагрузка").Range("A:A"))

'определяем адреса ячеек по которым будем высчитывать
krit = "Нагрузка!" & Cells(n - 2, 3).Address 'c
krit1 = "Нагрузка!" & Cells(n - 2, 5).Address 'e
krit2 = "Нагрузка!" & Cells(n - 2, 35).Address 'ai
krit3 = "Нагрузка!" & Cells(n - 2, 2).Address 'b
krit4 = "Нагрузка!" & Cells(n - 2, 9).Address 'i
krit5 = "Нагрузка!" & Cells(n - 2, 32).Address 'af
krit6 = "Нагрузка!" & Cells(n - 2, 33).Address 'ag
krit7 = "Нагрузка!" & Cells(n - 2, 34).Address 'ah
krit8 = "Нагрузка!" & Cells(n - 2, 8).Address 'h
krit9 = "Нагрузка!" & Cells(n - 2, 13).Address 'm
krit10 = "Нагрузка!" & Cells(n - 2, 16).Address 'p
krit11 = "Нагрузка!" & Cells(n - 2, 21).Address 'u
krit12 = "Нагрузка!" & Cells(n - 2, 70).Address 'br
krit14 = "Нагрузка!" & Cells(n - 2, 51).Address 'ao
krit15 = "Нагрузка!" & Cells(n - 2, 67).Address 'bo
krit16 = "Нагрузка!" & Cells(n - 2, 68).Address 'bp
krit17 = "Нагрузка!" & Cells(n - 2, 69).Address 'bq

' записываем формулы в ячейки
'Cells(n - 2, 8).FormulaLocal = "=ЕСЛИ(" & krit2 & ">0;ИНДЕКС(Группы!L:L;ПОИСКПОЗ( " & krit1 & ";Группы;0));"")"
'Cells(n - 2, 40).FormulaLocal = "=ЕСЛИ(" & krit12 & ">0;ИНДЕКС(Группы!M:M;ПОИСКПОЗ( " & krit1 & ";Группы;0));"")"

Функция (Function) отличается от подпрограммы (Sub) тем, что она всегда возвращает какое-либо значение. Если функция размещается в ячейке рабочего листа, то в этой ячейке мы видим значение, которое функция возвратила.

В качестве примера мы создадим функцию, вычисляющую объем цилиндра по формуле: V=π*D²/4*H, где

  • V – объем цилиндра;
  • π – число Pi;
  • D – диаметр основания цилиндра;
  • H – высота цилиндра.

Первая функция на VBA Excel

Создайте или откройте файл Excel с расширением .xlsm (Книга Excel с поддержкой макросов). В версиях Excel по 2003 год – с расширением .xls.

Перейдите в редактор VBA, нажав сочетание клавиш «Левая_клавиша_Alt+F11».

Если вы не создавали ранее в этом проекте VBA стандартный программный модуль, нажмите кнопку «Module» во вкладке «Insert» главного меню. То же подменю откроется при нажатии на вторую кнопку после значка Excel на панели инструментов.


Ссылка на модуль появится в проводнике слева. Если модуль создан ранее, дважды кликните по его ссылке в проводнике, и он откроется справа для редактирования.


В открывшемся окне добавления шаблона процедуры выберите «Function», вставьте в поле «Name» название функции «ObyemTsilindra» и нажмите «OK».


Шаблон функции добавится на лист модуля.


Вставьте в скобки через запятую аргументы функции (D, H), а внутрь шаблона следующую строку:

В этой строке, функции (слева) присваивается значение, вычисленное в выражении справа. Выражение повторяет нашу первоначальную формулу вычисления объема цилиндра, где «WorksheetFunction.Pi» – это функция рабочего листа, возвращающая число Pi.


Функция, вычисляющая объем цилиндра по диаметру основания и высоте готова.

Вставка функции в ячейку

Вставить пользовательскую функцию в ячейку можно как вручную: =ObyemTsilindra(Ячейка1;Ячейка2) , так и с помощью мастера функций.

Выберите ячейку, в которую вы хотите вставить формулу, и вызовите матер функций.


В открывшемся окне «Вставка функции» выберите категорию «Определенные пользователем», а в открывшемся списке – функцию «ObyemTsilindra» и нажмите «OK».


В окне «Аргументы функции» в полях аргументов выберите соответствующие ячейки, кликнув по ним на рабочем листе, и нажмите «OK».


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

Была задача по переносу вычислений из экселя. Чтобы не лезть и не смотреть формулу в каждой ячейке я написал небольшой макрос, который их выводит.

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

Получается вот такая штука, которую гораздо проще разобрать и перенести

VBA Excel - вывести формулы в ячейки Microsoft Excel, Vba, Макрос

Sub DrawFormulas()
For Each Cell In Selection
CellFormula = Cell.Formula
If Left(CellFormula, 1) <> "=" Then CellFormula = " story__tags tags"> [моё] Microsoft Excel Vba Макрос


MS, Libreoffice & Google docs

466 постов 12.8K подписчиков

Правила сообщества

1. Не нарушать правила Пикабу

2. Публиковать посты соответствующие тематике сообщества

3. Проявлять уважение к пользователям

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

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

Важно - сообщество призвано помочь, а не постебаться над постами авторов! Помните, не все обладают 100 процентными знаниями и навыками работы с Office. Хотя вы и можете написать, что вы знали об описываемом приёме раньше, пост неинтересный и т.п. и т.д., просьба воздержаться от подобных комментариев, вместо этого предложите способ лучше, либо дополните его своей полезной информацией и вам будут благодарны пользователи.

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

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

Скажите, а как вывести одну ячейку из диапазона? Например, у меня Сумма с А1 до D20, но я не хочу, чтобы участвовала ячейка B8.

Суко, 120 сохранили себе, а плюса не поставили

Заюзать VBA всегда веселее, я автоматизировал создание BOM листов для десятка изделий, без ВБА каждый раз на день работы и вероятность ошибок, с VBA - теперь один лист меняю, расставляю галочки, в кикие изделия детали входят, добавляю туда же картинку если надо и вжух! пара минут работы скрипта и печатай PDFs! Теперь нет мученья выпустить документацию в SAP.

То есть кликнуть на формулу тебе лень, а писать лист кода нет. О задротище.


Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом)

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Не хочу вас пугать, но буду на VBA можно написать и вредоносную программу, которая запустится сразу после открытия файла, поэтому включать все макросы по умолчанию стоит только на ваш страх и риск, если вы часто ими пользуетесь и вам сильно надоели всплывающие окошки с предупреждениями. Лично я на всякий случай выключаю поддержку макросов перед тем, как открыть файл, который мне кто-то малознакомый присылает. За пять лет проблем не было.

Итак, если вы все сделали правильно, у вас появится такая вкладка:

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Пока давайте заранее решим, что максимальная снаряженная масса котиков – 5 кг. Тогда код будет такой:

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Такой вот нехитрый макрос.

Но давайте добавим в него чуть-чуть универсальности и интерактивности.

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

Изменим код вот так

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

То есть, вместо скучной пятерки вы получаем число от пользователя через метод InputBox:

Макросы VBA для Excel: выделение значений цветом (PERSONAL.xlsb, переменные, цикл For Each, всплывающие окна, заливка ячеек цветом) Макрос, Vba, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макрос будет работать пока вы не закроете автокад. Выбирать файл нужно тут:

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Теперь у нас есть отдельный модуль. Самое время разобраться целиком с окошком редактора VBA.

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Sub – это так в VBA обозначается процедура. Если бы мы хотели написать функцию, то у нас было бы

Function <имяФункции>() … End Function

Все, что мы напишем промеж строк

Sub writeLengths()

И

End Sub

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

В тех круглых скобках, при необходимости, пишут входные параметры. Когда появится в них необходимость, вы быстро поймете, как и зачем их использовать. Сегодня не будем.

А что нам надо? Да только свет в оконце. Нам надо, чтобы макрос брал все полилинии в чертеже (пускай пока вообще все полилинии, ок?), узнавал, какой они длины (ДАННЫЕ УДАЛЕНЫ) и вставлял в чертеж текст с ее значением.

Код будет очень простой, а он будет выглядеть вот так:

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Макросы - это просто и полезно. Пост первый, вступительный Макрос, Vba, AutoCAD, Microsoft Excel, Урок, Длиннопост

Читайте также: