Значение формулы в ячейке excel vba

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

Simon's user avatar

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 Morgan's user avatar

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

Oorang's user avatar

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

Frobbit's user avatar

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

Visual Basic
1
Sheets("первый").Range("C1")=Sheets("второй").Range("C1")

или вам обязательно надо через Copy-Paste?
тогда надо так

Visual Basic
1
2
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

легко находится через макрорекордер.Аналог телодвижения: Вставить-Значения



0



weeper

0 / 0 / 0

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

Сообщений: 37

20.06.2012, 18:25

3

Visual Basic
1
2
' Формула "привращается" в цифру:
Cells(5, 3).Value = CDbl(Cells(5, 3).Value)



0



Сумрак

20.06.2012, 19:07

4

Visual Basic
1
Cells(1,1).copy Sheets(2).cells(1,1)

Это копируется Обьект Range, со всеми вытекающими последствиями. (т.е. с формулами в ячейке)

Если нужно значение, то достаточно присвоить

Visual Basic
1
Sheets(2).cells(1,1).value=Cells(1,1).value

или

Visual Basic
1
Sheets(2).cells(1,1).value=Cells(1,1).text

если мне память не изменяет то при Paste — приемник получает фокус, что становится ошибкой при повторном

Visual Basic
1
Cells(1,1).copy Sheets(2).cells(1,1)

т.к. активной уже будет ячейка на 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

 

Здравствуйте уважаемые знатоки.
Можно ли получить результат вычисления формулы записанной в ячейки С1 т.е. (5) в VBA без использования Имен и ячейки листа

Прикрепленные файлы

  • Тест.xls (26.5 КБ)

Изменено: Евгений Смирнов02.04.2021 10:54:57

 

Nordheim

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

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

Что понимается под именем ячейки?
Cells(Rowindex,Columnindex) — не подойдет?
Если же опустить имя листа, то данные будут использованы с того, который сейчас активный

«Все гениальное просто, а все простое гениально!!!»

 

Без имен книги и без ячейки
В файле эти 2 варианта сделаны

Изменено: Евгений Смирнов02.04.2021 10:51:26

 

Nordheim

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

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

Если честно, не совсем понимаю, как это вы себе представляете, взять данные из ничего?

«Все гениальное просто, а все простое гениально!!!»

 

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

 

Jack Famous

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

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

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Nordheim, ага  :D
Евгений Смирнов, вам зачем? Что значит «взять значение из ячейки без ячейки»? Спросить у того, кто занёс — так, наверное
Можно файл открыть, как архив и найти в зашифрованном содержимом…

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Nordheim

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

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

#7

02.04.2021 11:23:28

Цитата
Евгений Смирнов написал:
Почему из ничего в Имя мы записываем формулу и получаем результат.

В какое имя и какую формулу? Формула возвращает имя Книги(листа, ячейки), сама формула расчитывается на листе или в коде?
Может я не совсем понял вопрос темы? Вы хотите не зная листа и ячейки получить значение формулы из этих двух неизвестных объектов так?
Или ……?

Изменено: Nordheim02.04.2021 11:27:24

«Все гениальное просто, а все простое гениально!!!»

 

Евгений Смирнов

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

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

#8

02.04.2021 11:28:10

Цитата
сама формула расчитывается на листе или в коде?

Вот как написать чтобы она расчиталась в коде VBA
Те в 2 вариантах у меня 2 действия сначала записываем формулу в имя или ячейку а потом берем результат
можно ли без промежуточных действий сразу в VBA получить результат вычисления формулы

Изменено: Евгений Смирнов02.04.2021 11:34:44

 

sokol92

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

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

#9

02.04.2021 11:49:16

Метод

Application.Evaluate

«понимает» формулы. На данном сайте есть много замечательных сообщений от

Казанского

на эту тему.

В Вашем примере:

Код
  MsgBox Application.Evaluate("=MAX(COUNTIF('ПолучЗначФорм'!$A$1:$A$12,'ПолучЗначФорм'!$A$1:$A$12))")

Изменено: sokol9202.04.2021 13:30:08

Владимир

 

Просмотрел сообщения от

Казанского

на тему.Метод Application.Evaluate но так и не могу запихнуть формулу в метод Evaluate.
Зато увидел интересный способ заполнения массива.
Может кто-то все таки напишет как запихнуть формулу в этот метод.

 

sokol92

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

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

 

Mershik

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

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

#12

02.04.2021 14:46:57

Цитата
sokol92 написал:
‘ПолучЗначФорм’!

наверное из-за этого

Не бойтесь совершенства. Вам его не достичь.

 

sokol92

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

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

Mershik, у Вас формула из #9 для примера из #1 не работает?

 

Ігор Гончаренко

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

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

#14

02.04.2021 14:53:31

Цитата
Евгений Смирнов написал:
Может кто-то все таки напишет как запихнуть формулу в этот метод.

как только сможете обьяснить что вам нужно, скорее всего найдутся люди, которые расскажут как это сделать

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Mershik

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

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

#15

02.04.2021 15:46:24

sokol92, работает все — я имел ввиду автор же хочет не использовать

Цитата
Евгений Смирнов написал:
без использования Имен и ячейки листа

Не бойтесь совершенства. Вам его не достичь.

 

Андрей_26

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

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

#16

02.04.2021 16:03:32

Цитата
Евгений Смирнов написал:
Можно ли получить результат вычисления формулы записанной в ячейки С1 т.е. (5) в VBA без использования Имен и ячейки листа

Можно!

P.S. какой вопрос — такой ответ )

 

doober

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

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

#17

02.04.2021 16:07:14

Вангую.

Код
Function COUNT_IF()
Count = 1
    With ActiveSheet
        dx = .Range("a1").Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)
    End With
    With CreateObject("scripting.dictionary")
    For n = 1 To UBound(dx)
        If .Exists(dx(n, 1)) Then
            .Item(dx(n, 1)) = .Item(dx(n, 1)) + 1
           Count = IIf(Count > .Item(dx(n, 1)), Count, .Item(dx(n, 1)))
        Else
            .Item(dx(n, 1)) = 1
        End If
    Next
     End With
COUNT_IF = Count
End Function

<#0>

 

sokol92

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

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

#18

02.04.2021 16:19:48

Цитата
Mershik написал:
автор же хочет не использовать

Я понял следующим образом пример из #1: вычислить формулу, текст которой указан в ячейке C1, не корректируя имена книги (листа) и не меняя значения ячеек.
В #9 показано, как это сделать. Результаты вычислений совпадают.

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

Изменено: sokol9202.04.2021 16:21:40

Владимир

 

армянская народная мудрость гласит:
бросил дурак камень в воду — 100 умных достать не могут!

Изменено: Ігор Гончаренко02.04.2021 17:07:49

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Евгений Смирнов

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

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

#20

02.04.2021 17:23:37

Цитата
Я понял следующим образом пример из #1: вычислить формулу, текст которой указан в ячейке C1, не корректируя имена книги (листа) и не меняя значения ячеек

вычислить формулу, текст которой указан в ячейке C1, не используя имена(Names) книги  и  ячейки листа.
Таким оператором сразу получаем значение функции рабочего листа сумм

Код
MsgBox Application.WorksheetFunction.Sum(2, 3)

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

Код
=MAX(COUNTIF('ПолучЗначФорм'!R1C1:R12C1,'ПолучЗначФорм'!R1C1:R12C1))

Вероятно в качестве оператора нужен  Evaluate
X = Оператор(формула)
В сообщении 9 где написано <Код> там пусто.Никакого кода там нет

 

sokol92

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

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

#21

02.04.2021 17:49:39

Цитата
Евгений Смирнов написал:
Никакого кода там нет

А я вижу этот код. Обновите страницу.

Владимир

 

Что то с браузером в другом скопировал код из сообщения 9 вроде получилось
Теперь получилось Спасибо всем и лично

sokol92

Я вроде бы так пробовал но у меня почему то не получалось. Надо еще попробовать на других формулах самому
Потом отпишусь

Изменено: Евгений Смирнов02.04.2021 18:14:30

 

sokol92

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

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

Нужно иметь в виду, что при обращении к методу Evaluate адреса ячеек должны быть указаны с учетом текущего стиля ссылок (A1 или RC). В документации ошибка — упоминается исключительно стиль A1.

 

Евгений Смирнов

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

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

#24

02.04.2021 19:05:19

sokol92

Спасибо за разъяснение я пробовал ещё вчера так и у меня вылезала ошибка, поэтому подумал что неправильно что-то написал

Код
MsgBox Application.Evaluate("=MAX(COUNTIF('ПолучЗначФорм'!R1C1:R12C1,'ПолучЗначФорм'!R1C1:R12C1))")

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

Изменено: Евгений Смирнов02.04.2021 19:11:10

 

sokol92

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

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

#25

02.04.2021 20:13:06

Для того, чтобы не зависеть от текущего стиля ссылок и не запутаться в сложных формулах,

Казанский

разработал подход, который ниже проиллюстрирован на Вашем примере. Макрос будет работать при любом стиле ссылок (Application.Range всегда использует стиль A1).

Код
Sub Test()
 Dim s As String, rg1 As Range, rg2 As Range
 Set rg1 = Range("A1:A12")
 Set rg2 = Range("A1:A12")

 s = "=MAX(COUNTIF(%%1, %%2))" ' исходная формула, адреса диапазонов заменены на %%1, %%2
 s = Replace(s, "%%1", rg1.Address(ReferenceStyle:=Application.ReferenceStyle))
 s = Replace(s, "%%2", rg2.Address(ReferenceStyle:=Application.ReferenceStyle))
 MsgBox Evaluate(s)
End Sub

При необходимости можно использовать и другие параметры свойства

Range.Address

Владимир

 

Евгений Смирнов

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

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

#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

5f4c85a8b3d434417958fa3c838b85a7.jpg

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:

9fd379c46222835b5be956c846f42cc6.jpg

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

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

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

Понравилась статья? Поделить с друзьями:
  • Значение формулах excel 2010
  • Значение формул в excel срзнач
  • Значение формул excel на английском
  • Значение формул excel 2007
  • Значение любого числа в excel