Vba excel evaluate пример

Return to VBA Code Examples

This article will explain how to use the VBA Evaluate function.

vba evaluate

The Evaluate Function in Excel is a little known function that can be extremely useful when writing VBA code.

Evaluate Syntax

The function takes one argument, and converts what is held in that argument to an object or a value.

Evaluate (Name)

The name can be the name of an object (for example a cell address) or a formula. The Name cannot be longer than 255 characters.

There are a number of ways to use this function.

Return a Result to Excel with Evaluate

Let us consider the following values in cell B2.

vba evaluate value

If we want to add the values together, we could start with an equals (=) sign in cell B2 turning the values into a formula, and then get the value of 15.

However, in VBA code, using the Evaluate function, we can return the value 15 to the spreadsheet without entering a formula into cell B2.

Sub TestEvaluate()
  Dim rng As Range
  Set rng = Range("B2")
  ActiveCell = Evaluate(rng.Value)
  End Sub

First, we declare a range object and then populate that range object with the cell address B2.

We then use the Evaluate function to evaluate the value of the Range object and return the value to a different cell, in this case, C2.

vba evaluate return value

As we can see if we debug the code, the immediate window will give us the value returned by the Evaluate function.

vba evaluate immediate window

Format a Cell with Evaluate

We can also use the Evaluate function to format a cell.

Sub TestEvaluateFormat()
  Dim strBld As String
  Worksheets("Sheet3").Activate
  strBld = "C2"
  Application.Evaluate(strBld).Font.Bold = True
End Sub

This time we are passing a cell reference to a string variable, and then using that string variable in the Name argument of the Evaluate function to set the Bold property of the cell to true.

vba evaluate bold

Shorten Formulas with the Evaluate Function

The Evaluate function can be used to shorten formulas in VBA code.

Let us look at the following code example:

Sub GetTotals()
Dim dblSales As Double
Dim dblExpenses As Double
Dim dblProfit As Double

  dblSales = Worksheets("Sheet1").Range("F3") + Worksheets("Sheet2").Range("F3") + Worksheets("Sheet3").Range("F3")
  dblExpenses = Worksheets("Sheet1").Range("F4") + Worksheets("Sheet2").Range("F4") + Worksheets("Sheet3").Range("F4")
  dblProfit = dblSales - dblExpenses
End Sub

Using the Evaluate function, we can re-write the code as shown below:

Sub GetTotalsEvaluate()
Dim dblSales As Double
Dim dblExpenses As Double
Dim dblProfit As Double

  dblSales = Evaluate("Sheet1!F3+Sheet2!F3+Sheet3!F3")
  dblExpenses = Evaluate("Sheet1!F4+Sheet2!F4+Sheet3!F4")
  dblProfit = dblSales - dblExpenses
End Sub

The Evaluate object removes the need to use the Worksheet or Range object individually as we can write this in a text string.  The format in this text string is identical to the format you would have used in the function bar in Excel if you were to create the formula there.

vba evaluate function

excel vba evaluate

Some call it the most powerful command in Excel VBA, while others struggle with simple VBA macros oblivious of its existence – today we with explore the VBA Evaluate function or more precisely the VBA Application.Evaluate function. Evalute is a great if you want to easily reuse your Excel formulas in a context of a VBA macro.

We will start with the basics and then move on to more elaborate examples and uses of the VBA Evaluate function.

The Excel VBA Evaluate function converts a Microsoft Excel Name to an object or a value.

Syntax

The syntax for the Evaluate function in VBA is:

Evaluate( Name )

Name
A formula or the Name of the object you want to evaluate. The length of the Name must be less than or equal to 255 characters.

Examples

Below are examples of how to use the VBA Evaluate function.

Example 1: Simple formula evaluation

You can evaluate simple mathematical formulas:

Evaluate("1+1") 
'Result: 2

Example 2: Using Excel cells in formula evaluation

The real benefits of Evaluate come when you want to replicate features that you are used to using in Excel spreadsheets. Below as simply multiplication of 2 cells from the Activesheet.

Evaluate("A1*B2") 'Activeworksheet, A1 = 10, B2 = 2 
'Result: 20

Evaluate("'Sheet1'!A1*'Sheet1'!A1B2") '"Sheet1", A1 = 10, B2 = 2 
'Result: 20

Watch out for the first example above! As it might evaluate differently depending on the Activeworksheet used!

Example 3: Using functions in formula evaluation

vlookup table
This example is going to be a bit more complex for several reasons I will explain after the example.

Consider the table on the right I will use to run a simple VLOOKUP function. Let us pull up the value associated with the lookup name “Andrew”.

Evaluate("VLOOKUP(""Andrew"",A1:B5,2,FALSE)")
'Result: 2

Now there are several things you need to learn from the example above:

  • Escaping strings enclosed within double apostrophes with another set of apostrophes “” – otherwise expect errors
  • Use a comma (,) to separate all function arguments REGARDLESS of your default system list separator as VBA assumes the comma by default
  • You don’t need an equals sign before your formula. The Excel VBA Evaluate functions assumes this by default

Now that we know the basics of the Excel VBA Evaluate function lets us explores some useful tips.

Remember when using functions in Evaluate to use the commma “,” as a argument list separator regardless of your localization settings i.e. even if in Excel formulas you use other list separators e.g. “;”

Use Evaluate brackets instead of Range

Did you know you can encapsulate Excel formulas in VBA in brackets to achieve the same results are embracing them within the Evaluate function? See example on the right. The Evaluate function can be easily swapped with square brackets to achieve same resutl.

You can easily replace a VBA Range with square brackets as well:

'This is the same...
Range("A1").Value
'...as this 
[A1].Value

'This is the same...
Range("A1:A2").Select
'...as this
[A1:A2].Select

You can also seriously shorten your VBA code:

'Long version
Application.Sum(Range("A1:A2"))
    
'Short version    
[SUM(A1:A2)]

Array definition using VBA Evaluate

You can also define elements in a VBA Array in just a single line without needing to resort to the VBA Substring function like so:

Dim arr() As Variant
arr = [{10,30,40}]

Debug.Print arr(1)
'Result: 10

Summary

The VBA Evaluate function is a very powerful tool if you want to easily reference cells in your workbook in your VBA Macros. There are however many pitfalls in using this function as well as its square brackets equivalent. Here are some:

  • Prone to errors – typical error includes forgetting that without preceding cells with the worksheet name the statement with always reference the Activesheet
  • Slightly slower – if you intend to run your code multiple times you might see a slight performance disadvantage. Usually you won’t notice this at all

In summary I personally think it make sense to know the VBA Application.Evaluate function as sometimes quick and dirty is all you need. However, I would avoid using it in complex VBA macros as it is easy to make a mistake, this comes especially as I am not a fan of embedding static cell references e.g. Range(“A1”) vs Cells(1,1). What is your take?

Это глава из книги Билла Джелена Гуру Excel расширяют горизонты: делайте невозможное с Microsoft Excel.

Задача: необходимо изменить все ячейки диапазона на основе расчета. Вы планируете в коде VBA запустить цикл и перебрать все ячейки:

For Each cell In Selection
    cell.Value = -1 * cell.Value
Next cell

Решение: функция Evaluate позволяет выполнить эту работу быстрее цикла. Замените приведенный выше фрагмент кода одной строкой:

Selection.Value = Evaluate(Selection.Address & "*-1")

Скачать заметку в формате Word или pdf, примеры в формате Excel (с кодом VBA)

Таймер (подробнее см. Использование таймера для сравнения производительности формул) показал, что цикл обработал 100 000 ячеек за 8,3 секунды. Формула Evaluate выполнила ту же работу за 0,09 секунды — на 99% быстрее!

Вы можете решить, что эта классная функция будет вам полезна, чтобы быстро преобразовать любой диапазон данных. К сожалению, большинство функций Excel не могут использоваться внутри функции Evaluate. Например, попытка представить текст в ячейках C2:C99 строчными буквами:

Range("C2:C99").Value = Evaluate("LOWER(C2:C99)") [1]

приведет к неудаче – изменения затронут только ячейку С2. Общее правило таково: если функция Excel обычно не работает с массивом, то и функция Evaluate не будет возвращать массив.

Однако, форумчанин PGC01 (на MrExcel.com) написал прекрасные рекомендации, демонстрирующие, как заставить Evaluate работать с массивом путем введения дополнительного фиктивного массива. Чтобы решить вышеуказанную проблему PGC01 предложил использовать следующее выражение:

Range("C2:C99").Value = Evaluate("IF(ROW(2:99),LOWER(C2:C99))")

Фрагмент ROW(2:99) возвращает числа от 2 до 99. Далее функция IF получает на входе эти числа и возвращает TRUE (IF всегда возвращает TRUE для чисел, отличных от 0). Таким образом, текст внутри функции говорит: «Вот 98 вертикальных значений TRUE. Для каждого из них переведи символы в строчную форму для соответствующих ячеек из диапазона С2:С99».

Дополнительные сведения: вы можете также использовать Evaluate для изменения горизонтального массива:

Range("A1:J1") = Evaluate("IF(ROW1:10),UPPER(A1:J1))")

Использование Evaluate в прямоугольном диапазоне немного сложнее. Вам нужно представить и вертикальный массив – ROW(1:10), и горизонтальный массив – COLUMN(A:J) или TRANSPOSE(ROW(1:10)). Следующий код использует две функции IF, первая из которых представляет собой вертикальный массив, а вторая – горизонтальный:

Range("A1:L23") = Evaluate("IF(ROW(1:23),IF(TRANSPOSE(ROW(1:12)),LOWER(A1:L23)))")

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

Sub RectangularUpper()
    ‘ Преобразует все ячейки в выделенном диапазоне в верхний регистр
    Dim rngRectangle As Range, rngRows As Range, rngColumns As Range
    Set rngRectangle = Selection
    ‘ Определяет вертикальный вектор массива
    Set rngRows = rngRectangle.Resize(, 1)
    ‘ Определяет горизонтальный вектор массива
    Set rngColumns = rngRectangle.Resize(1)
    rngRectangle = Evaluate("IF(ROW(" & rngRows.Address & "), _
        IF(COLUMN(" & rngColumns.Address &"),UPPER(" & rngRectangle.Address & ")))")
End Sub

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

В приложенном Excel-файле вы найдете целый ряд макросов. Поизучайте, вам понравится!

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

Резюме: использование функции VBA Evaluate позволяет существенно ускорить работу кода; за счет хитрого приема функция может использоваться и для массивов.

Источник.

[1] Напоминаю, что функции листов Excel для использования в коде VBA не русифицированы.

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

Объект Application
обладает методом Evaluate, который либо
преобразует принимаемую строку в объект
Excel, либо вычисляет
задаваемое строкой выражение. Ниже
представлена подпрограмма, которая
сначала присваивает значение ячейке
С1 и формулу ячейке С2. Затем пользователь
задает строку-выражение, которое
подпрограмма вычисляет. В строке следует
использовать английские названия
функций листа, входящих в коллекцию
WorksheetFunction и функций известных вVBA.

Текст подпрограммы
приведен на рис. 8.14. Результаты на рис.
8.15 — 8.19.

Public Sub calc()

Dim s As String

Evaluate(«C1»).Value =
25

Evaluate(«C2»).Formula
= «=C1^2»

s = InputBox(«Enter expr»)

MsgBox s & «=» &
Application.Evaluate(s)

MsgBox Evaluate(«C2»).Value
* Application.Evaluate(s)

End Sub

Рис. 8.14. Excel макрос
для использования метода Evaluate

Рис. 8.15. Использования
функции листа ВПР

Рис. 8.16. Заполнение
ячеек С1 и С2

Рис. 8.17. Ввод выражения

Рис. 8.18. Использования
метода Evaluate для вычисления варажения

Рис. 8.19. Результат
двоякого использования метода Evaluate

        1. Омонимы

В VBA и Excel есть
похожие функции, которые порой называются
одинаково, а порой — по-разному.

Соответствие функций.
Табл.8.9.

Excel

VBA

Результат

ABS

Abs

ATAN

Atn

COS

Cos

EXP

Exp

Fix

Отбрасывает
дробную часть, для отрицательных дает
ближайшее отрицательное целое число,
большее либо равное указанному

ОТБР

Отбрасывает
дробную часть числа, так что остается
целое число

ОКРУГЛ

Округляет
число до указанного количества
десятичных разрядов

ОКРУГЛВНИЗ

Округляет
число до ближайшего меньшего по модулю
целого

ОКРУГЛВВЕРХ

Округляет
число по модулю до ближайшего большего
целого

ОКРУГЛТ

Возвращает
число, округленное с желаемой точностью

ОКРВНИЗ

Округляет
число до ближайшего меньшего по модулю
целого

ЦЕЛОЕ

Округляет
число до ближайшего меньшего целого

Int

Отбрасывает
дробную часть, для отрицательных дает
ближайшее отрицательное целое число,
меньшее либо равное указанному

LN

Log

СЛЧИС

Rnd

ЗНАК

Sgn

SIN

Sin

КОРЕНЬ

Sqr

TAN

Tan

Значительно хуже,
когда одному имени соответствуют разные
действия.

Функция в VBAможет иметь то же название что и в
Microsoft Excel, а работать совершенно по-другому.
Например, вMicrosoftExcelфункцияLogимеет два
аргумента, а вVBAфункция
с тем же именем имеет один аргумент.
Кроме того если задан один аргумент, то
вMicrosoftExcelфункцияLogэто логарифм
по основанию 10. В данная функция это
натуральный логарифм.

В VBA есть функция
с именем InputBox, а в Excel есть метод с тем
же именем.

Синтаксис
функции InputBox:

InputBox(prompt[, title] [,
default] [, xpos] [, ypos] [, helpfile, context])

Синтаксис функции
InputBox
содержит следующие именованные
аргументы:

promptОбязательный.
Строковое выражение, отображаемое как
сообщение в диалоговом окне. Максимальная
длина строки prompt составляет приблизительно
1024 символов и зависит от ширины
используемых символов. Строковое
значение prompt может содержать нескольких
физических строк. Для разделения строк
допускается использование символа
возврата каретки (Chr(13)), символа перевода
строки (Chr(10)) или комбинацию этих символов
(Chr(13) & Chr(10)).

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

defaultНеобязательный.
Строковое выражение, отображаемое в
поле ввода как используемое по умолчанию,
если пользователь не введет другую
строку. Если этот аргумент опущен, поле
ввода изображается пустым.

xpos Необязательный.
Числовое выражение, задающее расстояние
по горизонтали между левой границей
диалогового окна и левым краем экрана
(in points). Если этот аргумент опущен,
диалоговое окно выравнивается по центру
экрана по горизонтали.

yposНеобязательный.
Числовое выражение, задающее расстояние
по вертикали между верхней границей
диалогового окна и верхним краем экрана
(in points). Если этот аргумент опущен,
диалоговое окно помещается по вертикали
примерно на одну треть высоты экрана.

helpfileНеобязательный.
Строковое выражение, определяющее имя
файла справки, содержащего справочные
сведения о данном диалоговом окне. Если
этот аргумент указан, необходимо указать
также аргумент context.

contextНеобязательный.
Числовое выражение, определяющее номер
соответствующего раздела справочной
системы. Если этот аргумент указан,
необходимо указать также аргумент
helpfile.

Синтаксис метода
InputBox:

expression.InputBox(Prompt,
Title, Default, Left, Top, HelpFile, HelpContextId, Type)

expression Обязательный.
Выражение, которое возвращает объект
Application.

Синтаксис метода
InputBox
содержит следующие именованные
аргументы:

PromptОбязательный.
Строковое выражение, отображаемое как
сообщение в диалоговом окне

TitleНеобязательный.
Строковое выражение, отображаемое в
строке заголовка диалогового окна.
Значение по умолчанию «Input.»

DefaultНеобязательный.
Строковое выражение, отображаемое в
поле ввода как используемое по умолчанию,
если пользователь не введет другую
строку. Если этот аргумент опущен, поле
ввода изображается пустым.

Left Необязательный.
Числовое выражение, задающее расстояние
по горизонтали между левой границей
диалогового окна и левым краем экрана
(in points). Если этот аргумент опущен,
диалоговое окно выравнивается по центру
экрана по горизонтали.

TopНеобязательный.
Числовое выражение, задающее расстояние
по вертикали между верхней границей
диалогового окна и верхним краем экрана
(in points). Если этот аргумент опущен,
диалоговое окно помещается по вертикали
примерно на одну треть высоты экрана

HelpFile Необязательный.
Строковое выражение, определяющее имя
файла справки, содержащего справочные
сведения о данном диалоговом окне. Если
этот аргумент указан, необходимо указать
также аргумент HelpContextId.

HelpContextIdНеобязательный. Числовое выражение,
определяющее номер соответствующего
раздела справочной системы. Если этот
аргумент указан, необходимо указать
также аргумент HelpFile.

Type Необязательный
Variant. Задает тип возвращаемых данных.
Значение по умолчанию — text. Можно
использовать следующие значения:

Значения параметра
Type. Табл.8.10.

Значение

Смысл

0

Формула

1

Число

2

Текст
(строка)

4

Логическое
значение (ИСТИНА, ЛОЖЬ)

8

Ссылка
на диапазон

16

Значение
ошибки, например, #N/A

64

Массив
значений

Можно использовать
в качестве значения сумму значений.
Например, если желательно вводить и
числа, и строки, следует задать значение
Type равным 3=1+2.

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Application.Evaluate method (Excel)

vbaxl10.chm132095

vbaxl10.chm132095

excel

Excel.Application.Evaluate

031ce9e0-a7af-30f3-aa9f-fc776d8bf146

04/04/2019

medium

Application.Evaluate method (Excel)

Converts a Microsoft Excel name to an object or a value.

Syntax

expression.Evaluate (Name)

expression A variable that represents an Application object.

Parameters

Name Required/Optional Data type Description
Name Required Variant A formula or the name of the object, using the naming convention of Microsoft Excel. The length of the name must be less than or equal to 255 characters.

Return value

Variant

Remarks

The following types of names in Microsoft Excel can be used with this method:

  • Formulas.

  • A1-style references. Use any reference to a single cell in A1-style notation. All references are considered to be absolute references.

  • Ranges. Use the range, intersect, and union operators (colon, space, and comma, respectively) with references.

  • Defined names. You can specify any name in the language of the macro.

  • External references. Use the ! operator to refer to a cell or to a name defined in another workbook; for example, Evaluate("[BOOK1.XLS]Sheet1!A1").

  • Chart objects. You can specify any chart object name, such as Legend, Plot Area, or Series 1, to access the properties and methods of that object. For example, Charts("Chart1").Evaluate("Legend").Font.Name returns the name of the font used in the legend.

  • Form Control number. You can specify a number, as well as a name, to refer to Form Control on a worksheet. For example, for Label located on a worksheet (Developer tab — Insert — Form Controls — Label), both Evaluate("Label 1").Caption = "Hello" and Evaluate("1").Caption = "Hello" do the same.

Using square brackets (for example, «[A1:C5]») is identical to calling the Evaluate method with a string argument. For example, the following expression pairs are equivalent.

[a1].Value = 25 
Evaluate("A1").Value = 25 
 
trigVariable = [SIN(45)] 
trigVariable = Evaluate("SIN(45)") 
 
Set firstCellInSheet = Workbooks("BOOK1.XLS").Sheets(4).[A1] 
Set firstCellInSheet = _ 
    Workbooks("BOOK1.XLS").Sheets(4).Evaluate("A1")

The advantage of using square brackets is that the code is shorter. The advantage of using Evaluate is that the argument is a string, so you can either construct the string in your code or use a Visual Basic variable.

Example

This example turns on bold formatting in cell A1 on Sheet1.

Worksheets("Sheet1").Activate 
boldCell = "A1" 
Application.Evaluate(boldCell).Font.Bold = True

[!includeSupport and feedback]

Like this post? Please share to your friends:
  • Vba excel error codes
  • Vba excel error code
  • Vba excel err raise
  • Vba excel entirerow select
  • Vba excel entirerow insert