Как оптимизировать функцию VBA в Excel. В vba функция
Математические функции (Visual Basic)
Рекомендуем использовать Visual Studio 2017
Эта документация перемещена в архив и не поддерживается.
Visual Studio 2013
Методы класса Math предоставляют тригонометрические, логарифмические и других общих математические функции.
В следующей таблице перечислены методы класса Math. Можно использовать их в программе Visual Basic.
Abs | Возвращает абсолютное значение числа. |
Acos | Возвращает угол, косинус которого равен указанному числу. |
Asin | Возвращает угол, синус которого равен указанному числу. |
Atan | Возвращает угол, тангенс которого равен указанному числу. |
Atan2 | Возвращает угол, тангенс которого равен отношению двух указанных чисел. |
BigMul | Возвращает полный продукт 2 32 разрядных чисел. |
Ceiling | Возвращает наименьшее целое значение, которое меньше или равно указанному Decimal или Double. |
Cos | Возвращает косинус указанного угла. |
Cosh | Возвращает гиперболический косинус указанного угла. |
DivRem | Возвращает частное 2 32 или 64 разрядного разрядных знаковых целых чисел, а также возвращает остаток в параметре вывода. |
Exp | Возвращает e (основание натуральных логарифмов), возведенное в заданную степень. |
Floor | Возвращает наибольшее целое число, которое меньше или равно числу указанного типа Decimal или Double. |
IEEERemainder | Возвращает остаток от деления, результаты из указанного числа другим указанным количеством. |
Log | Возвращает естественный ( e) базового логарифм заданного числа или логарифм заданного числа в определенной базе. |
Log10 | Возвращает логарифм с основанием 10 указанного числа. |
Max | Возвращает большее 2 чисел. |
Min | Возвращает меньшее из двух чисел. |
Pow | Возвращает указанное число, возведенное в указанную степень. |
Round | Возвращает значение Decimal или значение Double, округленное до разным значений или с указанным количеством цифр. |
Sign | Возвращает значение типа Integer, показывающее знак числа. |
Sin | Возвращает синус указанного угла. |
Sinh | Возвращает гиперболический синус указанного угла. |
Sqrt | Возвращает квадратный корень из указанного числа. |
Tan | Возвращает тангенс указанного угла. |
Tanh | Возвращает гиперболический тангенс указанного угла. |
Truncate | Вычисляет неотъемлемую часть номера, определенных в Decimal или Double. |
Для использования этих функций без уточнения импортировать пространство имен Math в проект, добавив следующий код в начало файла источника:
В этом примере метод Abs класса Math используется для вычисления абсолютного значения числа.
' Returns 50.3. Dim MyNumber1 As Double = Math.Abs(50.3) ' Returns 50.3. Dim MyNumber2 As Double = Math.Abs(-50.3)В этом примере метод Atan класса Math используется для вычисления значения числа пи.
Public Function GetPi() As Double ' Calculate the value of pi. Return 4.0 * Math.Atan(1.0) End FunctionВ этом примере метод Cos класса Math используется для возврата косинуса угла.
Public Function Sec(ByVal angle As Double) As Double ' Calculate the secant of angle, in radians. Return 1.0 / Math.Cos(angle) End FunctionВ этом примере метод Exp класса Math используется для возврата числа e, возведенного в степень.
Public Function Sinh(ByVal angle As Double) As Double ' Calculate hyperbolic sine of an angle, in radians. Return (Math.Exp(angle) - Math.Exp(-angle)) / 2.0 End FunctionВ этом примере метод Log класса Math используется для возврата натурального логарифма числа.
Public Function Asinh(ByVal value As Double) As Double ' Calculate inverse hyperbolic sine, in radians. Return Math.Log(value + Math.Sqrt(value * value + 1.0)) End FunctionВ этом примере метод Sign класса Math используется для определения знака числа.
' Returns 1. Dim MySign1 As Integer = Math.Sign(12) ' Returns -1. Dim MySign2 As Integer = Math.Sign(-2.4) ' Returns 0. Dim MySign3 As Integer = Math.Sign(0)В этом примере метод Sin класса Math используется для возврата синуса угла.
Public Function Csc(ByVal angle As Double) As Double ' Calculate cosecant of an angle, in radians. Return 1.0 / Math.Sin(angle) End FunctionВ этом примере метод Sqrt класса Math используется для вычисления квадратного корня числа.
' Returns 2. Dim MySqr1 As Double = Math.Sqrt(4) ' Returns 4.79583152331272. Dim MySqr2 As Double = Math.Sqrt(23) ' Returns 0. Dim MySqr3 As Double = Math.Sqrt(0) ' Returns NaN (not a number). Dim MySqr4 As Double = Math.Sqrt(-4)В этом примере метод Tan класса Math используется для возврата тангенса угла.
Public Function Ctan(ByVal angle As Double) As Double ' Calculate cotangent of an angle, in radians. Return 1.0 / Math.Tan(angle) End FunctionПространство имен: System
Сборка: mscorlib (в mscorlib.dll)
Ссылки
Основные понятия
msdn.microsoft.com
Функция суммы в VBA | Programmerz.ru
У меня проблема с суммированием ячеек в vba. Мне нужно использовать ячейки (a, b):
Range("A1").function="=SUM(Range(Cells(2,1),Cells(3,2)))"но это не сработает.
Функция не является свойством / методом из диапазона.
Если вы хотите суммировать значения, используйте следующее:
Range("A1").Value = Application.Sum(Range(Cells(2, 1), Cells(3, 2)))РЕДАКТИРОВАТЬ:
если вы хотите, чтобы формула использовалась следующим образом:
Range("A1").Formula = "=SUM(" & Range(Cells(2, 1), Cells(3, 2)).Address(False, False) & ")" 'The two false after Adress is to define the address as relative (A2:B3). 'If you omit the parenthesis clause or write True instead, you can set the address 'as absolute ($A$2:$B$3).Если вы всегда будете использовать один и тот же адрес диапазона, то вы можете использовать его как Rory:
Поместите функцию стоимость в клетку
Application.Sum часто не работает хорошо в моем опыте (или, по крайней мере, среда разработчика VBA не нравится по какой-либо причине).
Функция, которая работает лучше всего для меня, - это Excel.WorksheetFunction.Sum()
Пример:
Dim Report As Worksheet 'Set up your new worksheet variable. Set Report = Excel.ActiveSheet 'Assign the active sheet to the variable. Report.Cells(11, 1).Value = Excel.WorksheetFunction.Sum(Report.Range("A1:A10")) 'Add the function result.Поместите функцию непосредственно в ячейку
Другой метод, который вы искали, я думаю, это разместить функцию непосредственно в ячейке. Это можно сделать, введя строку функции в значение ячейки. Вот пример, который дает тот же результат, что и выше, за исключением того, что значение ячейки присваивается функции, а не результат функции:
Dim Report As Worksheet 'Set up your new worksheet variable. Set Report = Excel.ActiveSheet 'Assign the active sheet to the variable. Report.Cells(11, 1).Value = "=Sum(A1:A10)" 'Add the function. Range("A1").Function="=SUM(Range(Cells(2,1),Cells(3,2)))"Пытаться
Range("A1").Formula="=SUM(" & Range(Cells(2,1),Cells(3,2)).Address(False,False) & ")" Range("A10") = WorksheetFunction.Sum(Worksheets("Sheet1").Range("A1", "A9"))где
Range("A10") является ячейкой ответа
Range("A1", "A9") - это диапазон для вычисления
programmerz.ru
Использование функций Microsoft Excel в Visual Basic — howtoo.ru
Большинство функций рабочего листа Microsoft Excel можно использовать в коде Visual Basic (список этих функций: List of Worksheet Functions Available to Visual Basic)
Часть функций Excel в Visual Basic просто не нужны. Например, вместо функции Concatenate (СЦЕПИТЬ) в коде Visual Basic для объединения текстов используется оператор &.
Вызов функции рабочего листа из Visual Basic
В Visual Basic функции рабочего листа (worksheet ) Microsoft Excel доступны через объект WorksheetFunction.
Здесь сначала объявляется переменная myRangeкак объект типа Range, и затем ей назначается диапазон ячеек A1:C10 на листе Sheet1. Переменной answer присваивается результат применения функции Min к myRange. Полученное значение answer отображается в окне сообщения.
Диапазон ячеек необходимо объявить как объект Range!
Например, в формуле в ячейке таблицы Excel=MATCH(9,A1:A10,0)а в коде Visual Basic —
Sub FindFirst() myVar = Application.WorksheetFunction.Match(9, Worksheets(1).Range("A1:A10"), 0) MsgBox myVar End SubФункции Visual Basic (без префикса WorksheetFunction) могут иметь такое же имя, как и функция Excel, но работать иначе. Например, Application.WorksheetFunction.Log и Log возвращают разные значения.
Вставка функции рабочего листа в ячейку
Чтобы вставить функцию в ячейку, нужно присвоить ее свойству Formula соответствующего объекта Range.
Например:
Sub InsertFormula() Worksheets("Sheet1").Range("A1:B3").Formula = "=RAND()" End Subрезультат функции RAND (она возвращает случайное число) присваивается свойству Formula диапазона ячеек A1:B3 на листе Sheet1в активной книге Excel.
источник (Using Microsoft Excel Worksheet Functions in Visual Basic [Excel 2003 VBA Language Reference] Office 2003)
howtoo.ru
Функции VBA и массивы значений
Создание функций с бесконечным количеством аргументов
В предыдущих примерах мы создавали функции, в которых в качестве аргументов выступало одно значение. Но есть функции, у которых в качестве переменной выступает массив значений. Примерами таких функций встроенных в Excel служат функции СУММ, ВПР, МАКС, СРЗНАЧ и так далее. Давайте теперь создадим свою похожую функцию.
Далее приведен код функции, которая суммирует все четные значения.
Function СуммаЧетных(Диапазон As Range) As Double Dim r As Range Dim S As Double For Each r In Диапазон If r.Value Mod 2 = 0 Then S = S + r.Value Next СуммаЧетных = S End FunctionВ первой строке данной функции можно увидеть, что переменной Диапазон мы присвоили тип Range (Диапазон As Range). Таким образом, в качестве аргумента функции мы можем использовать диапазон ячеек. Применим эту функцию на рабочем листе Excel.
Как видно из рисунка, мы не перечисляли каждое значение, а использовали диапазон ячеек A2:A11.
Теперь немного разберем код. Мы использовали цикл For Each - Next. Его задача пройтись по каждой ячейке нашего диапазона. Предварительно мы объявили еще одну переменную r типа Range. Она будет хранить значение каждой ячейки.
For Each r In ДиапазонДалее идет проверка значения ячейки и если оно кратно 2, то мы суммируем результат во временную переменную S.
If r.Value Mod 2 = 0 Then S = S + r.ValueВ конце, после цикла, мы присваиваем функции СуммаЧетных значение просуммированных элементов S.
Создание функций с неопределенным количеством аргументов
Предыдущая функция имеет недостаток - если вы попытаетесь использовать в качестве переменной несмежный диапазон ячеек, то получите ошибку. Иногда требуется более универсальная функция, так как на старте мы можем не знать количество аргументов, которые будут использоваться. Например, всем известная функция СУММ может принимать неограниченное количество аргументов =СУММ(A1;B1:B5;1;2;3), функция все рано вернет верный результат.
Вы можете создать свою аналогичную функцию в VBA, указав к последнему (или единственному) аргументу ключевое слово ParamArray.
ParamArray - данный модификатор применяется только к последнему аргументу. Аргумент с данным модификатором всегда должен иметь тип данных Variant и всегда является необязательным, ключевое слов Optional не указывается дополнительно
Теперь давайте создадим функцию, которая может принимать произвольное количество аргументов/ А в качестве результата возвращать всю туже сумму нечетных значений.
Function СуммаЧетных2(ParamArray Значения() As Variant) As Double Dim v As Variant Dim S As Double For Each v In Значения If v Mod 2 = 0 Then S = S + v Next СуммаЧетных2 = S End FunctionДанная функция может принимать любое количество аргументов, однако аргументы не могут быть многомерные, это означает, что мы не можем указывать диапазоны, а должны перечислить все значения или все ячейки. Как это показано на рисунке далее.
Что же делать, если необходимо использовать различные диапазоны ячеек, а не перечислять каждый элемент отдельно. Рассмотрим следующий код функции, который реализует эту возможность.
Function СуммаЧетных3(ParamArray Диапазоны() As Variant) As Double Dim v As Variant Dim r As Variant Dim S As Double For Each v In Диапазоны For Each r In v If r Mod 2 = 0 Then S = S + r Next Next СуммаЧетных3 = S End FunctionУ нас добавился еще один цикл For Each - Next. Т.е. сначала мы проходим по всем аргументам (диапазонам ячеек), а после проходим по всем ячейкам этих диапазонов.
Этот код тоже далек от идеала: если мы будем использовать вместо диапазонов значения, то получим ошибку. Поэтому если необходимо создать идеальную функцию, например как СУММ (она может обработать любые типы аргументов), то придется потрудится и дополнительно проверять тип аргументов. Но об это уже поговорим в другой раз. Перейдем к созданию еще одного типа функций.
Создание функции, возвращающих массив значений
Надеюсь вы знаете, как использовать формулы массивов в Excel. Эти функции вводятся на рабочий лист Excel с помощью сочетания клавиш Ctrl + Shift + Enter. Сейчас мы создадим функцию, которая возвратит массив значений. Например, выведет нам список всех месяцев.
Function СписокМесяцев() СписокМесяцев = Array("Январь", "Февраль", "Март", "Апрель", _ "Май", "Июнь", "Июль", "Август", _ "Сентябрь", "Октябрь", "Ноябрь", "Декабрь") End FunctionЕсли мы введем функцию в одну ячейку, то увидим, что результатом будет только Январь. Чтобы понять как работает функция необходимо выделить 12 ячеек по горизонтали, ввести =СписокМесяцев() и нажать сочетание клавиш Ctrl + Shift + Enter.
Если необходимо вывести список месяцев по вертикали, то можно дополнительно использовать функцию =ТРАНСП(СписокМесяцев()).
Возможно покажется, что функции, возвращающие массив достаточно бесполезны. Однако это не так, да они реже используются на рабочем листе Excel, но я надеюсь что они будут незаменимой вещаю в ваших будущих программах на VBA.
Скачать
micro-solution.ru
Как оптимизировать функцию VBA в Excel Bilee
Должна удвоить скорость
Public Function Yield(Name As String, Price As Double) Dim Lookup As Range, rw As Integer Set Lookup = Range("LookupRange") rw = Application.WorksheetFunction.Match(Name, Lookup.Resize(ColumnSize:=1), 0) Yield = 100 * Application.Run("otherCustomFunction", Lookup.Cells(rw, 3), Lookup.Cells(rw, 7), Price) End FunctionЭто потому, что вы только просматриваете диапазон с именем «LookupRange» один раз, а не дважды, и вы смотрите только правильную линию один раз, а не дважды.
Вероятно, в 4 раза быстрее
Если мы получим диапазон в коде, который использует функцию yield , нам нужно сделать это только один раз
Public Function Yield(Lookup As Range, Name As String, Price As Double) rw = Application.WorksheetFunction.Match(Name, Lookup.Resize(ColumnSize:=1), 0) Yield = 100 * Application.Run("otherCustomFunction", Lookup.Cells(rw, 3), Lookup.Cells(rw, 7), Price) End Function Public Sub CallingRoutine() Dim Lookup As Range, rw As Integer Set Lookup = Range("LookupRange") ' Some code For Each someItem In someSet Dim amount As Double, Name As String, Price As Double ' Some code to deter;ine name and price amount = Yield(Lookup, Name, Price) ' Some code that used the yield Next someThing End SubСуществует вариант этой стратегии, в котором вы объявляете Lookup вне всех подпрограмм, например, со словарем ниже.
На порядок быстрее, если вы часто Yield Доходу.
- Вы просматриваете названный диапазон
- Вы запрашиваете все значения из excel сразу
- Вы ищете Name s в словаре, что намного эффективнее, чем поиск в диапазоне
Это код:
Public Function Yield(Name As String, Price As Double) If LookDict Is Nothing Then Set LookDict = New Dictionary Dim LookVal As Variant, rw As Integer, ToUse As ToUseType LookVal = Range("LookupRange").Value For rw = LBound(LookVal, 1) To UBound(LookVal, 1) Set ToUse = New ToUseType ToUse.Row3Val = LookVal(rw, 3) ToUse.Row7Val = LookVal(rw, 7) LookDict.Add LookVal(rw, 1), ToUse Next rw End If Set ToUse = LookDict.Item(Name) Yield = 100 * Application.Run("otherCustomFunction", _ ToUse.Row3Val, ToUse.Row7Val, Price) End Function Public Sub CallingRoutine() ' Some code For Each someItem In someSet Dim amount As Double, Name As String, Price As Double ' Some code to deter;ine name and price amount = Yield(Name, Price) ' Some code that used the yield Next someThing End Subwww.bilee.com
Функции преобразования типов данных в VBA
Часто в программировании возникает необходимость перевести один тип в другой (по доступным типам данных в VB читаем в этой статье). Например, число в строку или строку в дату. Для перевода (преобразования) типов в VBA есть множество функций позволяющих это сделать. Но есть один момент, преобразовать возможно только тот тип или значение, которое подходит по формату нового типа. К примеру, если преобразовать строку "356" в целый тип, то на выходе мы получим число, но если в этой строке будет находиться символ, не относящийся к числу "356р", то преобразование завершится ошибкой несовпадения типов (Type mismatch).
В таблице ниже приведен полный список функций преобразования и тип, в который происходит преобразование:
Функция | Возвращает тип | Действие |
CBool | Boolean | Преобразует значение в булевый тип |
CByte | Byte | Преобразует значение в тип Byte |
CCur | Currency | Преобразует значение в тип Currency |
CDate | Date | Преобразует значение в Дату и Время |
CDbl | Double | Преобразует значение в тип Double |
CDec | Decimal | Преобразует значение в подтип Decimal типа Variant |
CInt | Integer | Преобразует значение в целый тип |
CLng | Long | Преобразует значение в длинное целое |
CSng | Single | Преобразует значение в тип Single |
CStr | String | Преобразует значение в строку |
CVar | Variant | Преобразует значение в тип Variant |
Использование функций преобразования типов
Работать с функциями преобразования легко. К примеру, необходимо преобразовать число 4568 в строку:
Dim OutStr as StringOutStr = CStr(4568)
Преобразование строки или числа в булевый тип
Dim OutBool as Boolean'Функция вернет значение TrueOutBool = CBool(1)OutBool = CBool ("TRUE")
Преобразование строки или числа в дату и время
Dim OutDate as DateOutDate = CDate("25/06/03 23:35")OutDate = CDate("25.06.03")OutDate = CDate("37797,9826388889")
Примечание: Функции преобразования можно использовать непосредственно в выражении избегая создания лишних переменных. Например: x=y+CInt("456")+z
www.programm-school.ru