Это глава из книги Билла Джелена Гуру 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 не русифицированы.
Return to VBA Code Examples
This article will explain how to use the VBA Evaluate function.
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.
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.
As we can see if we debug the code, the immediate window will give us the value returned by the Evaluate function.
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.
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.
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
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?
В 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
-
Омонимы
В 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 |
Значение |
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"
andEvaluate("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]