Excel vba ссылки в формуле

Вставка формулы со ссылками в стиле 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 одинаковы, их можно вставить сразу, без использования цикла, во весь диапазон.


Хитрости »

19 Февраль 2021              6709 просмотров


Использование относительных ссылок в макросах


Если Вы уже записывали макросы обработки таблиц, то наверняка сталкивались с ситуацией, когда макросом в таблицу добавляется столбец с формулами, которые потом необходимо распространить на все строки. Но если количество строк в таблице изменяется, то макрос работает некорректно: если строк стало больше, то формулы проставляются не на все строки, а если строк стало меньше – то появляются строки с лишними формулами.
Если Вы еще не знаете что такое макрос и как его записывать и воспроизводить, то рекомендуется сначала ознакомиться со статьей: Что такое макрос и где его искать?
К примеру, возьмем таблицу такого вида:
Исходная таблица
В конце таблицы нам необходимо добавить столбец «Стоимость», прописав в нем нехитрую формулу перемножения количества на цену:
=F2*G2
Перед записью макроса выделяем ячейку H1. При обычной записи макроса наши шаги такие:
1. Выделили I1
2. Записали в неё заголовок «Стоимость»
3. Перешли в I2
4. Записали формулу: =F2*G2
5. Распространили формулу до конца таблицы (через автозаполнение или путем копирования ячейки с формулой и вставки в остальные ячейки)
Макрос работает отлично. Пока количество строк не изменится. Если при записи макроса в таблице было 319 строк, а потом добавилось еще 20, то записанный макрос создаст формулу только в первых 319 строках. Все дело в том, что при обычной записи макрос использует абсолютную адресацию ячеек. Т.е. в нем каждый наш шаг обозначает выделение ячеек с конкретно указанным адресом (I1, I2, I319 и т.д.):
Пример абсолютных ссылок
Как выйти из такой ситуации? Все не слишком сложно. В группе кнопок код на вкладке Разработчик есть кнопка «Относительные ссылки». Если нажать её до записи макроса(или во время), то ссылки на ячейки будут уже запоминаться не как конкретный адрес, а как смещение относительно последней выделенной ячейки.
Например, запишем два простых макроса, которые будут делать одно и то же действие – перемещение вниз таблицы и выделение ячеек от нижней до верхней. Только первый макрос будет записан обычным способом, а перед записью второго мы нажмем кнопку «Относительные ссылки». Наши действия будут следующими (одинаковыми для обоих макросов):
1. До записи макроса выделяем ячейку I2
2. Начинаем запись макроса
3. Выделяем ячейку H2
4. Комбинацией клавиш Ctrl+↓(стрелка вниз) перемещаемся вниз таблицы
5. Стрелка вправо (т.е. выделяем последнюю ячейку в столбце I)
6. Комбинацией клавиш Ctrl+Shift+↑(стрелка вверх) выделяем столбец I от последней ячейки до первой
7. Завершаем запись макроса
Теперь можно посмотреть на код обоих макросов:
Сравнение кодов
Отличия очевидны: в первом используется обращение к ячейкам по их конкретным адресам. Во втором же все действия происходят относительно последней выделенной ячейки(на Range(«A1») не обращаем внимания – это из другой оперы и если их удалить ничего не изменится). Из этого можно сделать вывод, что для создания гибких универсальных макросов с использованием относительных ссылок необходимо как можно меньше использовать мышку и максимально стараться применять горячие клавиши. Попробую пояснить почему: когда мы применяем то же автозаполнение (наведение курсора мыши на нижний правый угол ячейки и протягивание вниз или двойной щелчок левой кнопкой мыши) – оно применяется к конкретно определенному количеству ячеек. Т.е. даже относительные ссылки не помогут заполнить его формулами, как того требует наша изначальная задача. Но если использовать горячие клавиши перемещения и выделения (Ctrl+стрелка и Ctrl+Shift+стрелка), то мы можем создать макрос, которому уже будет не важно сколько строк в нашей таблице. Чтобы в этом убедиться, запишем макрос из начала статьи, но уже с использованием относительных ссылок и исключительно клавиш для перемещения. Наши действия:
1. Перед записью макроса выделяем ячейку H1
2. Начали запись макроса
3. Нажимаем кнопку Относительные ссылки(если она еще не нажата)
4. Выделяем I1
5. Записываем в неё заголовок «Стоимость»
6. Переходим в I2
7. Записываем в I2 формулу: =F2*G2
8. Комбинацией клавиш Ctrl+C(или при помощи контекстного меню мыши) копируем ячейку с формулой
9. Стрелкой вправо перемещаемся в ячейку H2
10. Комбинацией клавиш Ctrl+↓(стрелка вниз) перемещаемся вниз таблицы
11. Стрелка вправо (т.е. выделяем последнюю ячейку в столбце I)
12. Комбинацией клавиш Ctrl+Shift+↑(стрелка вверх) выделяем столбец I от последней ячейки до первой
13. Комбинацией клавиш Ctrl+V вставляем скопированную формулу
14. Нажимаем Esc для сброса буфера обмена
15. Запись макроса можно завершить
Если теперь попробовать применить такой макрос к таблице, у которой строк больше или меньше, чем было при записи макроса – все пройдет идеально. Макрос создаст столбец и запишет в нем формулу только на нужное количество строк.
Более того. Если наша таблица находится уже в другом листе и даже начинается не с первой ячейки, а где-то в середине:
Хаотично расположенная таблица
Нам достаточно будет выделить ячейку заголовка последнего столбца(K5) и запустить наш макрос. Он без проблем добавит столбец с формулой в нужном месте и на все строки. Макрос же без использования относительных ссылок в такой ситуации спасует по полной: он создаст формулы начиная с ячейки I2 и до заголовка, только испортив таблицу и не сделав ничего полезного.
Так же хочу дополнить, что Относительные ссылки играют роль исключительно во время записи макроса. Во время воспроизведения совершенно не важно включены они или нет. Плюс можно(а иногда и нужно) комбинировать во время записи макросов режим относительных ссылок с обычным режимом. Например, когда столбцов в таблице у нас всегда одинаковое количество и таблица всегда в одном месте, и столбец мы добавляем всегда в столбец I. Но формулы при этом надо протягивать на разное количество строк. Тогда можно начать запись макроса обычным режимом, а после того, как записали название столбца — включить режим относительных ссылок, чтобы определение последней ячейки таблицы не зависело от количества строк в этой таблице.


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

In this Article

  • Formulas in VBA
  • Macro Recorder and Cell Formulas
  • VBA FormulaR1C1 Property
    • Absolute References
    • Relative References
    • Mixed References
  • VBA Formula Property
  • VBA Formula Tips
    • Formula With Variable
    • Formula Quotations
    • Assign Cell Formula to String Variable
    • Different Ways to Add Formulas to a Cell
    • Refresh Formulas

This tutorial will teach you how to create cell formulas using VBA.

Formulas in VBA

Using VBA, you can write formulas directly to Ranges or Cells in Excel. It looks like this:

Sub Formula_Example()

    'Assign a hard-coded formula to a single cell
    Range("b3").Formula = "=b1+b2"
    
    'Assign a flexible formula to a range of cells
    Range("d1:d100").FormulaR1C1 = "=RC2+RC3"

End Sub

There are two Range properties you will need to know:

  • .Formula – Creates an exact formula (hard-coded cell references). Good for adding a formula to a single cell.
  • .FormulaR1C1 – Creates a flexible formula. Good for adding formulas to a range of cells where cell references should change.

For simple formulas, it’s fine to use the .Formula Property.  However, for everything else, we recommend using the Macro Recorder

Macro Recorder and Cell Formulas

The Macro Recorder is our go-to tool for writing cell formulas with VBA.  You can simply:

  • Start recording
  • Type the formula (with relative / absolute references as needed) into the cell & press enter
  • Stop recording
  • Open VBA and review the formula, adapting as needed and copying+pasting the code where needed.

I find it’s much easier to enter a formula into a cell than to type the corresponding formula in VBA.

vba formula formular1c1

Notice a couple of things:

  • The Macro Recorder will always use the .FormulaR1C1 property
  • The Macro Recorder recognizes Absolute vs. Relative Cell References

VBA FormulaR1C1 Property

The FormulaR1C1 property uses R1C1-style cell referencing (as opposed to the standard A1-style you are accustomed to seeing in Excel).

Here are some examples:

Sub FormulaR1C1_Examples()

    'Reference D5 (Absolute)
    '=$D$5
    Range("a1").FormulaR1C1 = "=R5C4"
    
    'Reference D5 (Relative) from cell A1
    '=D5
    Range("a1").FormulaR1C1 = "=R[4]C[3]"
    
    'Reference D5 (Absolute Row, Relative Column) from cell A1
    '=D$5
    Range("a1").FormulaR1C1 = "=R5C[3]"
    
    'Reference D5 (Relative Row, Absolute Column) from cell A1
    '=$D5
    Range("a1").FormulaR1C1 = "=R[4]C4"

End Sub

Notice that the R1C1-style cell referencing allows you to set absolute or relative references.

Absolute References

In standard A1 notation an absolute reference looks like this: “=$C$2”.  In R1C1 notation it looks like this: “=R2C3”.

To create an Absolute cell reference using R1C1-style type:

  • R + Row number
  • C + Column number

Example:  R2C3 would represent cell $C$2 (C is the 3rd column).

    'Reference D5 (Absolute)
    '=$D$5
    Range("a1").FormulaR1C1 = "=R5C4"

Relative References

Relative cell references are cell references that “move” when the formula is moved.

In standard A1 notation they look like this: “=C2”. In R1C1 notation, you use brackets [] to offset the cell reference from the current cell.

Example: Entering formula “=R[1]C[1]” in cell B3 would reference cell D4 (the cell 1 row below and 1 column to the right of the formula cell).

Use negative numbers to reference cells above or to the left of the current cell.

    'Reference D5 (Relative) from cell A1
    '=D5
    Range("a1").FormulaR1C1 = "=R[4]C[3]"

Mixed References

Cell references can be partially relative and partially absolute.  Example:

    'Reference D5 (Relative Row, Absolute Column) from cell A1
    '=$D5
    Range("a1").FormulaR1C1 = "=R[4]C4"

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

VBA Formula Property

When setting formulas with the .Formula Property you will always use A1-style notation.  You enter the formula just like you would in an Excel cell, except surrounded by quotations:

    'Assign a hard-coded formula to a single cell
    Range("b3").Formula = "=b1+b2"

VBA Formula Tips

Formula With Variable

When working with Formulas in VBA, it’s very common to want to use variables within the cell formulas.  To use variables, you use & to combine the variables with the rest of the formula string. Example:

Sub Formula_Variable()
    Dim colNum As Long
    colNum = 4

    Range("a1").FormulaR1C1 = "=R1C" & colNum & "+R2C" & colNum

End Sub

VBA Programming | Code Generator does work for you!

Formula Quotations

If you need to add a quotation (“) within a formula, enter the quotation twice (“”):

vba formula quotations

Sub Macro2()
    Range("B3").FormulaR1C1 = "=TEXT(RC[-1],""mm/dd/yyyy"")"
End Sub

A single quotation (“) signifies to VBA the end of a string of text. Whereas a double quotation (“”) is treated like a quotation within the string of text.

Similarly, use 3 quotation marks (“””) to surround a string with a quotation mark (“)

MsgBox """Use 3 to surround a string with quotes"""
' This will print <"Use 3 to surround a string with quotes"> immediate window

Assign Cell Formula to String Variable

We can read the formula in a given cell or range and assign it to a string variable:

'Assign Cell Formula to Variable
Dim strFormula as String
strFormula = Range("B1").Formula

Different Ways to Add Formulas to a Cell

Here are a few more examples for how to assign a formula to a cell:

  1. Directly Assign Formula
  2. Define a String Variable Containing the Formula
  3. Use Variables to Create Formula
Sub MoreFormulaExamples ()
' Alternate ways to add SUM formula
' to cell B1
'
  Dim strFormula as String
  Dim cell as Range
  dim fromRow as long, toRow as long

  Set cell = Range("B1")

  ' Directly assigning a String
  cell.Formula = "=SUM(A1:A10)"

  ' Storing string to a variable
  ' and assigning to "Formula" property
  strFormula = "=SUM(A1:A10)"
  cell.Formula = strFormula

  ' Using variables to build a string 
  ' and assigning it to "Formula" property
  fromRow = 1
  toRow   = 10
  strFormula = "=SUM(A" & fromValue & ":A" & toValue & ")
  cell.Formula = strFormula
End Sub

Refresh Formulas

As a reminder, to refresh formulas, you can use the Calculate command:

Calculate

To refresh single formula, range, or entire worksheet use .Calculate instead:

Sheets("Sheet1").Range("a1:a10").Calculate

{quote}{login= VovaK}{date=23.09.2009 08:34}{thema=}{post}Не перестаю восхищаться широте возможностей синтаксиса VBA.  

  Спасибо Кирилл, но чтобы пользоваться надо понимать, поэтому еще вопрос:  

  Какую смысловую нагрузку и действие осуществляет символ «~» и что есть «хард-кодинг». Потому как […] использую только для именованных диапазонов.

  Владимир.  

  P.S. есть ли у Вас простенький пример с использованием этих конструкций,  
дюже мудреный синтаксис…{/post}{/quote}  

  1) под ~ я подразумевал «приблизительно равно»  
2) «хард-кодинг» — жесткое кодирование, т.е. содержимое [] не может задаваться переменными.
3) на самом деле, думаю я вас слегка запутал тильдами(~), синтаксис самый что ни наесть обычный :-)    

  ********************************************  
Для функции ДВССЫЛ()  

  а. точно также превращает текстовую ссылку в диапазон  
Range(«A1:A10»)    

  б. аналогично  
Application.Evaluate(«A1:A10»)    

  ********************************************  
Для функции ИНДЕКС()  

  а. данная конструкция точно воспроизводит эффект всех 4-х аргументов ИНДЕКС(). Range задает 1-й арг, Cells — 2-й и 3-й, а Area — 4-й  
Range(«A1:A10,B2:B5,D7:D12»).Area(2).Cells(3,1)  

  б. почти аналогично, но не учитывает области  
Range(«A1:A10»)(3,1)    

  ********************************************  
Для функции СМЕЩ()  

  а. данная конструкция точно воспроизводит эффект всех 5-и аргументов СМЕЩ().Range задает 1-й арг, Offset — 2-й и 3-й, а Resize — 4-й и 5-й  
Range(«A1:A10»).Offset(1,2).Resize(5,5)  

  ********************************************  
Это лишь примеры того, что Range позволяет использовать в качестве аргумента формулы рабочего листа возвращающие ссылку. Данные формулы должны быть на английском со всеми вытекающими. Формулы могут быть достаточно сложными, главное, чтобы они возвращали объект Range. Честно говоря, на практике сам еще никак не применял, но интересно :-)  

  а. Range(«INDIRECT(«»A1″»)»)  
б. Range(«INDEX((A1:A60,C1:D10),0,2,2)»)    
в. Range(«OFFSET(A1,2,5,3,10)»)    

  ********************************************  
Application.Evaluate() и [] по сути — одно и то же, но первая работает с текстовой строкой в качестве аргумента и, значит, принимает переменные, а вторая требует жесткого прописывания формулы и не работает с переменными. Писать в [] в некотором смысле — что писать в ячейку листа.

  а. Примеров с Application.Evaluate() на форуме масса, т.ч. я не буду ее особо расписывать.  

  б. про [] почти все знают, что можно ее использовать вместо Range(«A1»), но у нее возможностей побольше
[A1]
[A1:A5,C2:D5]
[MyDefinedName]
[2*2]
[A1+B1+VLOOKUP(«JAN»,Sheet3!A1:B11,2,0)]

1.2 Абсолютные и относительные ссылки

Запись абсолютных и относительных ссылок в формулах на рабочем листе

Например, если активна ячейка A4, то ссылку на ячейку D3 можно задать как D3 (стиль A1 ) или R[-1]C[3] (стиль R1C1 ).

При записи формулы в стиле A1 признаком абсолютной ссылки является знак доллара ($) перед адресом строки и/или столбца. В стиле R1C1 для задания абсолютной ссылки используются индексы ячейки. Например, на ячейку D3 указывает абсолютная ссылка $D$3 в стиле A1 и абсолютная ссылка R3C4 в стиле R1C1.

Запись абсолютных и относительных ссылок в процедурах VBA

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

По умолчанию после запуска макрорекодера кнопкаотжата, что означает, что при записи процедур используются абсолютные ссылки.

Команда вычисления размера вклада в ячейке B13 с использованием абсолютных ссылок (набор адреса ячейки со знаками $ во время записи макроса) будет выглядеть так:

ActiveCell.FormulaR1C1 = "=R10C2*(1+R12C2/12)^R11C2"

Можно установить использование относительных ссылок при записи процедур Для этого после запуска макрорекордера нажмите кнопку Относительная ссылкана панели инструментов Остановить запись (см.
рис.
1.2). Кнопка будет изображена на оранжевом фоне. Относительные ссылки будут использоваться до конца текущего сеанса работы в MS Excel или до повторного нажатия кнопки Относительная ссылка.

Важно:

  • Абсолютные ссылки всегда указывают на конкретную ячейку и команды, записанные с абсолютными ссылками, всегда выполняются с теми же ячейками, которые обрабатывались при создании макроса, независимо от положения активной ячейки, другими словами, независимо от выбранного объекта Range.
  • Относительные ссылки рассматриваются относительно выбранного объекта Range. Чтобы с помощью макроса обрабатывать произвольные ячейки, следует записать его команды с относительными ссылками.
  • Чтобы макрос всегда выполнял макрокоманды для определенной ячейки, а затем для других ячеек, связанных с предыдущей, нужно использовать абсолютные ссылки при записи команд для первой ячейки и относительные ссылки при записи команд для ячеек, связанных с первой.

Другой способ задания относительных ссылок — использование свойства Offset объекта Range.

Примеры

  1. Процедура Макрос1 закрашивает ячейки интервала B1:C5 желтым цветом (
    рис.
    1.8).

    Процедура Макрос1 записана с абсолютными ссылками

    Рис.
    1.8.
    Процедура Макрос1 записана с абсолютными ссылками

    Выделение интервала B1:C5 записано с абсолютными ссылками. При повторном выполнении процедуры снова будет выделен тот же интервал B1:C5, независимо от того, какая ячейка будет активной перед запуском процедуры.

  2. Процедура Макрос2 желтым цветом закрашивает интервал ячеек, смещенный относительно активной ячейки.

    Процедура Макрос2 записана с относительными ссылками

    Рис.
    1.9.
    Процедура Макрос2 записана с относительными ссылками

    В команде выделения интервала объект Range смещен относительно активной ячейки — свойство Offset устанавливает смещение на один столбец. Процедура Макрос2 окрасит интервал из двух столбцов и пяти строк, начинающийся в соседнем по отношению к активной ячейке столбце.

Понравилась статья? Поделить с друзьями:
  • Excel vba ссылки r1c1
  • Excel vba ссылка на ячейку другого листа в excel
  • Excel vba ссылка на имя
  • Excel vba ссылка на диапазон
  • Excel vba сравнить ячейки в excel