I have a formula in a range of cells in a worksheet which evaluate to numerical values. How do I get the numerical values in VBA from a range passed into a function?
Let’s say the first 10 rows of column A in a worksheet contain rand() and I am passing that as an argument to my function…
public Function X(data as Range) as double
for c in data.Cells
c.Value 'This is always Empty
c.Value2 'This is always Empty
c.Formula 'This contains RAND()
next
end Function
I call the function from a cell…
=X(a1:a10)
How do I get at the cell value, e.g. 0.62933645?
Excel 2003, VB6
asked May 23, 2009 at 12:21
SimonSimon
78k25 gold badges88 silver badges118 bronze badges
5
The following code works for me when running from VBA (Excel 2003):
Public Function X(data As Range) As Double
For Each c In data.Cells
a = c.Value 'This works
b = c.Value2 'This works too (same value)
f = c.Formula 'This contains =RAND()
Next
End Function
a and b are the same and equal what I’m passing in (which is a range of cells with Rand() in them). I’m not sure what else is going on here.
Aha! You need to set X, no? I’m not sure what exactly you expect this function to do, but you need to set X (the name of the function) to the value you want returned. Add this line:
X = a
answered May 23, 2009 at 12:44
Richard MorganRichard Morgan
7,5819 gold badges49 silver badges86 bronze badges
3
I can’t replicate a problem using the layout you posted. I noticed a few syntax errors in your posted code (ie: «for» should be «for each»). But when I put =RAND() in A1:A10 and =X(A1:A10) I got a return just fine with this:
Public Function X(data As Range) As Double
Dim c As Excel.Range
Dim sum As Double
For Each c In data.Cells
sum = sum + c.Value
Next
X = sum
End Function
However, just to a expand a little more on a few of the other questions you brushed up against. You can evaluate a formula for a result like so:
Public Function X(data As Range) As Double
Dim c As Excel.Range
Dim sum As Double
For Each c In data.Cells
sum = sum + Excel.Evaluate(c.Formula)
Next
X = sum
End Function
But generally speaking you won’t want to, as this is basically calculating the same value twice.
answered May 27, 2009 at 8:54
OorangOorang
6,6001 gold badge34 silver badges52 bronze badges
1
Make sure you do a calculate before requesting the value.
To Speed up macros something like the following is often preformed..
'Set Reasonable default
Application.CutCopyMode = False
Application.ScreenUpdating = False
Application.Interactive = False
Application.Calculation = xlCalculationManual
in this state you must force calculation before the value will be available.
Public Function X(data As Range) As Double
'You may need the following as well
'Application.Calculate
Dim c As Range
For Each c In data.Cells
c.Calculate
c.Value 'This is now has a value
c.Value2 'This is now has a value
c.Formula 'This contains RAND()
Next
End Function
answered Mar 17, 2010 at 1:13
FrobbitFrobbit
1,62017 silver badges29 bronze badges
2
Вставка формулы со ссылками в стиле 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 одинаковы, их можно вставить сразу, без использования цикла, во весь диапазон.
0 / 0 / 0 Регистрация: 17.05.2012 Сообщений: 20 |
|
1 |
|
Как ячейки с формулой взять результат?20.06.2012, 15:54. Показов 6772. Ответов 4
Здравствуйте, помогите, пожалуйста. Есть ячейка, где по формуле считается значение. Нужно этот результат скопировать на другой лист. Копируется формула, а не цифра. Спасибо.
0 |
Штурмaн 0 / 0 / 0 Регистрация: 27.04.2009 Сообщений: 265 |
||||||||
20.06.2012, 16:18 |
2 |
|||||||
или вам обязательно надо через Copy-Paste?
легко находится через макрорекордер.Аналог телодвижения: Вставить-Значения
0 |
weeper 0 / 0 / 0 Регистрация: 05.06.2012 Сообщений: 37 |
||||
20.06.2012, 18:25 |
3 |
|||
0 |
Сумрак |
||||||||||||||||
20.06.2012, 19:07 |
4 |
|||||||||||||||
Это копируется Обьект Range, со всеми вытекающими последствиями. (т.е. с формулами в ячейке) Если нужно значение, то достаточно присвоить
или
если мне память не изменяет то при Paste — приемник получает фокус, что становится ошибкой при повторном
т.к. активной уже будет ячейка на 2 листе |
0 / 0 / 0 Регистрация: 27.04.2009 Сообщений: 265 |
|
20.06.2012, 20:33 |
5 |
если мне память не изменяет то при Paste В вопросе стоит «при копировании», но не указано, каким методом(ну,собсно, все как всегда), потому и дал на всякий случай Copy-Paste… [image]http://www.kvvmku.ru/forum/images/smiles/u_thinking02y.gif[/image]
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
20.06.2012, 20:33 |
5 |
Здравствуйте уважаемые знатоки. Прикрепленные файлы
Изменено: Евгений Смирнов — 02.04.2021 10:54:57 |
|
Nordheim Пользователь Сообщений: 3154 |
Что понимается под именем ячейки? «Все гениальное просто, а все простое гениально!!!» |
Без имен книги и без ячейки Изменено: Евгений Смирнов — 02.04.2021 10:51:26 |
|
Nordheim Пользователь Сообщений: 3154 |
Если честно, не совсем понимаю, как это вы себе представляете, взять данные из ничего? «Все гениальное просто, а все простое гениально!!!» |
Почему из ничего в Имя мы записываем формулу и получаем результат. меня интересует можно ли как либо записать без использования имени формулу чтобы получить результат ее вычислений |
|
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Nordheim, ага Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Nordheim Пользователь Сообщений: 3154 |
#7 02.04.2021 11:23:28
В какое имя и какую формулу? Формула возвращает имя Книги(листа, ячейки), сама формула расчитывается на листе или в коде? Изменено: Nordheim — 02.04.2021 11:27:24 «Все гениальное просто, а все простое гениально!!!» |
||
Евгений Смирнов Пользователь Сообщений: 539 |
#8 02.04.2021 11:28:10
Вот как написать чтобы она расчиталась в коде VBA Изменено: Евгений Смирнов — 02.04.2021 11:34:44 |
||
sokol92 Пользователь Сообщений: 4445 |
#9 02.04.2021 11:49:16 Метод Application.Evaluate «понимает» формулы. На данном сайте есть много замечательных сообщений от Казанского на эту тему. В Вашем примере:
Изменено: sokol92 — 02.04.2021 13:30:08 Владимир |
||
Просмотрел сообщения от Казанского на тему.Метод Application.Evaluate но так и не могу запихнуть формулу в метод Evaluate. |
|
sokol92 Пользователь Сообщений: 4445 |
|
Mershik Пользователь Сообщений: 8277 |
#12 02.04.2021 14:46:57
наверное из-за этого Не бойтесь совершенства. Вам его не достичь. |
||
sokol92 Пользователь Сообщений: 4445 |
Mershik, у Вас формула из #9 для примера из #1 не работает? |
Ігор Гончаренко Пользователь Сообщений: 13746 |
#14 02.04.2021 14:53:31
как только сможете обьяснить что вам нужно, скорее всего найдутся люди, которые расскажут как это сделать Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Mershik Пользователь Сообщений: 8277 |
#15 02.04.2021 15:46:24 sokol92, работает все — я имел ввиду автор же хочет не использовать
Не бойтесь совершенства. Вам его не достичь. |
||
Андрей_26 Пользователь Сообщений: 647 |
#16 02.04.2021 16:03:32
Можно! P.S. какой вопрос — такой ответ ) |
||
doober Пользователь Сообщений: 2204 |
#17 02.04.2021 16:07:14 Вангую.
<#0> |
||
sokol92 Пользователь Сообщений: 4445 |
#18 02.04.2021 16:19:48
Я понял следующим образом пример из #1: вычислить формулу, текст которой указан в ячейке C1, не корректируя имена книги (листа) и не меняя значения ячеек. Могу ошибаться в интерпретации, хотелось бы услышать мнение автора. Изменено: sokol92 — 02.04.2021 16:21:40 Владимир |
||
армянская народная мудрость гласит: Изменено: Ігор Гончаренко — 02.04.2021 17:07:49 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Евгений Смирнов Пользователь Сообщений: 539 |
#20 02.04.2021 17:23:37
вычислить формулу, текст которой указан в ячейке C1, не используя имена(Names) книги и ячейки листа.
как записать чтобы в переменной Х записался результат вычисления формулы
Вероятно в качестве оператора нужен Evaluate |
||||||
sokol92 Пользователь Сообщений: 4445 |
#21 02.04.2021 17:49:39
А я вижу этот код. Обновите страницу. Владимир |
||
Что то с браузером в другом скопировал код из сообщения 9 вроде получилось sokol92 Я вроде бы так пробовал но у меня почему то не получалось. Надо еще попробовать на других формулах самому Изменено: Евгений Смирнов — 02.04.2021 18:14:30 |
|
sokol92 Пользователь Сообщений: 4445 |
Нужно иметь в виду, что при обращении к методу Evaluate адреса ячеек должны быть указаны с учетом текущего стиля ссылок (A1 или RC). В документации ошибка — упоминается исключительно стиль A1. |
Евгений Смирнов Пользователь Сообщений: 539 |
#24 02.04.2021 19:05:19 sokol92
Спасибо за разъяснение я пробовал ещё вчера так и у меня вылезала ошибка, поэтому подумал что неправильно что-то написал
а сейчас все посмотрел и хотел еще спросить почему лезет ошибка, а вы уже все объяснили. Оказывается стиль ссылок надо смотреть Спасибо огромное Изменено: Евгений Смирнов — 02.04.2021 19:11:10 |
||
sokol92 Пользователь Сообщений: 4445 |
#25 02.04.2021 20:13:06 Для того, чтобы не зависеть от текущего стиля ссылок и не запутаться в сложных формулах, Казанский разработал подход, который ниже проиллюстрирован на Вашем примере. Макрос будет работать при любом стиле ссылок (Application.Range всегда использует стиль A1).
При необходимости можно использовать и другие параметры свойства Range.Address Владимир |
||
Евгений Смирнов Пользователь Сообщений: 539 |
#26 03.04.2021 04:48:48 sokol92
Спасибо за пример.На досуге поразбираюсь. |
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