Страницы: 1
RSS
"Пользовательская" функция без VBA
 
Добрый день!  
 
Возможно ли в 2007 excel создание пользовательской функции на основе встроенных? Простейший пример функции, которую регулярно приходится прописывать:  
 
Если(еошибка(впр("*"&RC[-1]&"*";RC2:RC4;2;0));0;впр("*"&RC[-1]&"*";RC2:RC4;2;0))
 
Я бы хотел поменять ее, например, на евпр(RC[-1];RC2:RC4;2;0), без потери быстродействия.
 
То есть, грубо говоря, я пишу "евпр", а excel сам проставляет все кавычки и т.п.  
 
Возможно ли это? Какие еще есть варианты решения?  
 
Спасибо!
 
Дайте/присвойте формуле имя латынью...
 
Могу посоветовать использовать программу Punto Switcher для автозамены введённых слов.  
 
К примеру, вы вводите в строке формул (или в ячейке) слово ЕВПР, нажимаете пробел, - и тут же этот ваш ЕВПР заменяется на строку  
Если(еошибка(впр(;;2;0));0;впр("*"&&"*";;2;0))  
 
Конечно, это немного не то, что вы хотели, но всё же лучше, чем ничего...  
 
Примеры моих автозамен: http://ExcelVBA.ru/pictures/20110725-e67-14kb.jpg
 
в ячейку D7 вводите евпр(RC[-1];RC2:RC4;2;0), только без равенства, а всоседнюю
может вот так ="если(еошибка(впр"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(D7;"евпр(";"(""*""&";1);";";"&""*"";";1)&";0;впр"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(D7;"евпр(";"(""*""&";1);";";"&""*"";";1), а потом просто поставите равно.
 
Может так ?
 
С.М., тогда уж можно и так:  
http://excelvba.ru/XL_Files/Sample__25-07-2011__22-38-37.zip
 
Игорь, тогда уж так - чтобы пустые ячейки тоже выдавали 0.
 
Большое спасибо!  
 
Идея с автозаменой очень интересная, можно поиграть.  
 
По поводу примеров от С.М. и EducatedFool - честно, говоря. не совсем понял, как это работает. Макросов в книге, вроде бы, нет, как тогда определена функция/автозамена? Можно ли сохранить ее в Personal.xlsb и использовать потом во всех проектах?  
 
И, наконец, самое главное - обязательно ли определять диапозоны в строке ЕВПР :=...?  
 
Затраты на это сравнимы с написанием всех стандартных еошибок, экономи времени, на первый взгляд, не получается.
 
> обязательно ли определять диапозоны в строке ЕВПР :=...?  
 
эта строка - лишь информация для вас, что означают эти загадочные формулы.  
можете смело их удалить из ячеек.  
 
Формулы надо искать через меню Вставка - Имя - Присвоить:  
http://www.ExcelVBA.ru/pictures/20110726-9sn-24kb.jpg
 
EducatedFool  
 
Еще один вопрос. Нельзя ли Пунто научить при автозамене сразу цеплять диапазоны? То есть написать евпр(а1;a2;a3;a4) и получить на выходе если(еошибка(впр("*"&a1&"*";a2;a3;a4));0;впр("*"&a1&"*";a2;a3;a4))?
 
> Нельзя ли Пунто научить при автозамене сразу цеплять диапазоны?  
 
Нет. В Punto Switcher автозамена - просто дополнительная опция, поэтому никаких наворотов ожидать от него не стоит.  
 
Поищите в инете специализированные программы автозамены - наверняка, попадётся что-нибудь подходящее.  
 
PS: Я бы не стал искать (потом ещё настраивать придётся помучиться),  
а написал бы макрос (в личную книгу макросов), который анализировал бы вводимые в ячейки значения,  
и, в случае обнаружения в ячейках конструкций вида "евпр(СписокЗначений)" (без кавычек, без знака равенства), формировал бы в ячейке соответствующую формулу (с подстановкой заданных диапазонов)
 
Наверное, это правильная мысль.  
 
Подскажите, пожалуйста, как:  
 
а) Сделать, чтобы макрос проверял каждую ячейку после введения в нее формулы  
б) Научить его работать с частями формулы. Ведь нужно найти в ней евпр, понять, где он закончился, вычленить из него переменные и потом вставить развернутую функцию только вместо этого евпр.  
 
Спасибо!
 
Сделал вам автозамену - пример её работы в файле:  
http://excelvba.ru/XL_Files/Sample__01-09-2010__16-50-13.zip  
(макросы должны быть разрешены)  
 
 
Принцип работы: в любую ячейку вводим формулу типа =евпр(C6:D11;F7:G10;2;0)  
(со знаком равенства, как обычно)  
После нажатия Enter макрос моментально преобразовывает эту формулу в  
=ЕСЛИ(ЕОШИБКА(ВПР("*"&C6:D11&"*";F7:G10;2;0));0;ВПР("*"&C6:D11&"*";F7:G10;2;0))  
 
 
Что вам осталось сделать:  
1) модернизировать код, чтобы он работал для любой книги (попутно оформив его в виде надстройки) - примеров на форуме множество  
2) набить в код кучу шаблонов типа этих:  
 
       Case "ЕВПР": Маска = "=Если(Еошибка(ВПР(""*""&%1&""*"";%2;%3;%4));0;ВПР(""*""&%1&""*"";%2;%3;%4))"  
       Case "ХЗ": Маска = "=ГПР(ПОИСКПОЗ(ЕСЛИ(%1;%2;%4));0;впр(""*""&%2&""*"";%3;%4;0))"  
 
 
 
 
Вот весь код: (новые маски сможете по аналогии добавить самостоятельно)  
 
Option Compare Text  
 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  
   If Target.Count > 1 Then Exit Sub    ' если больше одной ячейки изменено  
   On Error Resume Next  
   NewFormula = АвтоЗаменаФормулы(Target.FormulaLocal)  
   Application.EnableEvents = False  
   If Len(NewFormula) Then Target.FormulaLocal = NewFormula  
   Application.EnableEvents = True  
End Sub  
 
 
Function АвтоЗаменаФормулы(ByVal txt As String) As String  
   ' получает в качестве параметра txt введённую сокращённую формулу  
   If Not txt Like "=?*(*)" Then Exit Function  
 
   Функция = Mid(Split(txt, "(")(0), 2)    ' между знаком РАВНО и СКОБКОЙ  
   СтрокаПараметров = Split(Split(txt, "(")(1), ")")(0)  
   Параметры = Split(СтрокаПараметров, ";")    ' массив параметров  
 
   Select Case Функция  
       Case "ЕВПР": Маска = "=Если(Еошибка(ВПР(""*""&%1&""*"";%2;%3;%4));0;ВПР(""*""&%1&""*"";%2;%3;%4))"  
       Case "ХЗ": Маска = "=если(еошибка(впр(""*""&%1&""*"";%2;%3;%4));0;впр(""*""&%1&""*"";%2;%3;%4))"  
       Case Else  
   End Select  
 
   If Len(Маска) Then  
       НоваяФормула = Маска  
       For i = LBound(Параметры) To UBound(Параметры)  
           НоваяФормула = Replace(НоваяФормула, "%" & CStr(i + 1), Параметры(i))  
       Next i  
       АвтоЗаменаФормулы = НоваяФормула  
   End If  
End Function
 
Большое спасибо!  
 
Буду тестировать.
 
EducatedFool  
 
Не могу разобраться, как сделать, чтобы макрос работал для любой книги. Я сохранил книгу с ним как надстройку, подцепил ее к excel через настройки, но почему-то код не работает. Про какие изменения в нем Вы писали?  
 
Кроме того, нужно его модернизировать, чтобы он мог находить евпр в середине формулы, иначе смысла в подобной замене немного.  
 
Возможно ли это сделать?
 
Подскажите, пожалуйста, как решить 2 оставшиесе проблемы:  
 
1) Как модифицировать код, чтобы сделать макрос доступным для любой книги  
2) Как научить его корректно обрабатывать функцию в середине выражения.
 
{quote}{login=Alexal}{date=01.08.2011 02:42}{thema=}{post}  
1) Как модифицировать код, чтобы сделать макрос доступным для любой книги  
2) Как научить его корректно обрабатывать функцию в середине выражения.{/post}{/quote}  
 
1. Пример есть здесь:  
http://www.excel-vba.ru/chto-umeet-excel/kak-otsledit-sobytienaprimer-vydelenie-yacheek-v-lyuboj-knige/  
 
2. Это заметно усложнит код (особенно если там вложенные функции будут - внутри ЕВПР).  
Сразу надо было говорить...  
Я делать не буду - может, кто из форумчан поможет.
 
Да, видимо, я был недостаточно точен.  
 
Спасибо за ссылку!
Страницы: 1
Читают тему
Наверх
Loading...