Страницы: 1
RSS
Как вызвать функцию из процедуры?
 
Есть функция MySum- аналог функции СУММ (от уокенбаха)  
 
как вызвать ее из процедуры?  
например  
Sub pp()  
Dim i As Long  
Dim r As Range  
Set r = Range("a1:a4")  
MsgBox TypeName®  
MySum ®  
End Sub  
 
- возвращает ошибку  
 
как виноват и что делать?)  
 
Спасибо.
 
А что это за загадочные строки в макросе, на которых вылетает ошибка?  
 
For m = LBound(n) To UBound(n)  
   MySum = MySum(MySum, n(m))  
Next m  
 
Неужели сложно придумать 2 разных названия - одно для функции, другое - для переменной...  
А у Вас везде MySum.
 
Application.WorksheetFunction.Sum()
 
{quote}{login=EducatedFool}{date=19.01.2010 10:45}{thema=}{post}А что это за загадочные строки в макросе, на которых вылетает ошибка?  
 
For m = LBound(n) To UBound(n)  
   MySum = MySum(MySum, n(m))  
Next m  
 
Неужели сложно придумать 2 разных названия - одно для функции, другое - для переменной...  
А у Вас везде MySum.{/post}{/quote}  
 
Это не у меня - это я из учебника переписал) Вариант с Variant вообще не понял.
 
{quote}{login=VovaK}{date=19.01.2010 10:54}{thema=}{post}Application.WorksheetFunction.Sum(){/post}{/quote}  
 
меня не конечный результат интересует. а сам процесс =)
 
функция отличается от процедуры тем, что возвращает какое-либо значение..  
 
стандартный вызов функции:  
 
переменная=функция() - т.е. переменной присваивается значение, возвращаемое функцией.  
 
не менее стандартный вызов:  
 
if функция() then  - в этом случае значение функции просто используется(если оно не логическое, то по возможности будет преобразовано в таковое)  
 
 
вызов функции может быть и внутри сложного выражения, например:  
 
функция1()*функция2()/(функция3()+функция1()) - все три функции будут вызваны в надлежащем порядке, а их значения подставлены в выражение для дальнейшего вычисления..  
 
 
наконец, можно вызвать функцию с явным игнорированием возвращаемого значения:  
 
call функция()  
 
 
или просто по имени:  
 
функция()  
 
такое иногда применяется для универсальности кода, но я бы сказал, что это не слишком эффективно
Живи и дай жить..
 
Здравствуйте Слэн,  
 
Касательно последнего, если вызывать функцию как процедуру, то с какой целью? Процедура выполняет действие, оставляет след. Какой след будет оставлять функция без присвоения значения переменной? И еще, если она содержит аргументы, отладчик просто выдаст ошибку...    
Вообщем, Слэн, крыша пошатнулась - надо поправить... :)
 
Спасибо большое за разъяснения)
 
{quote}{login=The_Prist}{date=20.01.2010 10:41}{thema=Re: }{post}{quote}{login=VovaK}{date=20.01.2010 10:32}{thema=}{post}Здравствуйте Слэн,  
 
Касательно последнего, если вызывать функцию как процедуру, то с какой целью? Процедура выполняет действие, оставляет след. Какой след будет оставлять функция без присвоения значения переменной? И еще, если она содержит аргументы, отладчик просто выдаст ошибку...    
Вообщем, Слэн, крыша пошатнулась - надо поправить... :){/post}{/quote}VovaK, функция может присваивать значения глобальным переменным и иногда это используется. Функция просто вызывается и меняет значение глобальной переменной. Функция может не содержать ни одного аргумента.  
И, я полагаю, Слэн просто показал все методы вызова функции, как и просил автор топика, а если бы он указал для каждой свой аргумент это внесло бы дополнительную неясность. Так что Вы поторопились с крышей Слэна. Вы бы сначала проверили все указанные методы, прежде чем так утверждать.{/post}{/quote}  
 
спасибо за крышу(защиту) :)
Живи и дай жить..
 
Ну Вы даете, ребята, неужели Вы подумали что я про Слэна - у меня крыша пошатнулась и ее надо править, но ответ Дмитрия меня не удовлетворил. Если менять значение глобальной, то запись ничем не отличается Переменная = Функция(Option - Входящий параметр). Запись Call Функция() не укладывается в сознание, правда у ZVI я встречал такое решение, но в том случае изменения осуществлялись в самой входящей текстовой переменной, но ясности все одно не добавило.  
 
Потому и прошу, Слэн, поправьте мне крышу...:)
 
Пример хочется, если не сложно...
 
например, функции api.. они именно функции. но возвращается часто просто признак выполнения - 0 или номер ошибки.  
вы можете проверять его, а можете не проверять.. (проверять, конечно, правильнее)  
 
 
другой случай, как я ранее написал, для универсальности..  
 
допустим вам нужно узнать количество уникальных элементов или вывести сами уникальные элементы..  
 
в последнем случае вам может быть необязательно знать их количество  
 
так как для обоих действий алгоритм практически один, то и возникает желание объединить это в одну функцию, входящий параметр которой и будет определять, что нужно сделать: посчитать, вывести или и то и другое  
 
так вот если только вывести, то возвращаемое значение не нужно, и можно вызвать функцию просто для соверщения вывода, а значение ее не получать..  
 
 
с другой стороны, такое объединение не будет эффективным по скорости, ибо придется в цикле проверять значение параметра, а это время. если же параметр проверять только один раз, то тогда код будет неоптимален по размеру, ибо он все равно будет повторен два раза(или несколько) внутри функции.. но этим можно и пренебречь.  
 
как-то так.. диалектические рассуждения..
Живи и дай жить..
 
Слэн, но все вышесказанное можно и процедурой выполнить. Процедура меняет значения глобальных, выдает ошибки, меняет параметры... Самое главное - в чем отличие функции от процедуры при таком методе вызова? Или тупо функция выполняется как процедура и не ломать голову (пока еще на месте)?
 
процедуру нельзя использовать в выражениях...  
 
 
вернемся к уникальным элементам:  
 
 
я могу записать такую строку: if un() then  
 
где un определена как function un(optional ind=0, optional rng as range)as long  
 
ind=0 - количество элементов  
ind=1 - вывод элементов по адресу rng  
ind=2 - и количество и вывод..  
 
 
с процедурой такое не пройдет..  
 
в тоже время я могу написать:  
 
call un(1,range("a1"))
Живи и дай жить..
 
а могу написать две разные программы для каждого действия..
Живи и дай жить..
 
В том то и дело call un(1,range("a1")) - чисто процедура. Я же не могу, к примеру, вызвать эту функцию из ячейки и разложить значения в диапазоне Rng().  
 
Получается разницы то и нет, функция просто может использоваться как процедура.  
 
Если есть ошибка в рассуждениях - поправьте пожалуйста.
 
VovaK, функция вызываемая из ячейки может только возвращать значение. Функция, вызываемая из VBA делать все тоже, что и процедура. Плюс еще возвращает значение. Ваше дело - принимать его или нет.  
Если у Вас функция и что-то возвращает, и что-то еще творит, то при вызове ее с листа Вам будет доступно только значение, а при вызове из процедуры и это "еще что-то".  
 
 
2 слэн.  
>>или просто по имени:  
 
функция()  
 
Только без скобок. Со скобками стыдиться начинает. А аргументы после пробела, через запятую  
функция арг1, арг2
Bite my shiny metal ass!      
 
Спасибо Лузер, значит я все понял правильно.
Страницы: 1
Читают тему
Наверх