Могу посоветовать использовать программу Punto Switcher для автозамены введённых слов.
К примеру, вы вводите в строке формул (или в ячейке) слово ЕВПР, нажимаете пробел, - и тут же этот ваш ЕВПР заменяется на строку Если(еошибка(впр(;;2;0));0;впр("*"&&"*";;2;0))
Конечно, это немного не то, что вы хотели, но всё же лучше, чем ничего...
в ячейку D7 вводите евпр(RC[-1];RC2:RC4;2;0), только без равенства, а всоседнюю может вот так ="если(еошибка(впр"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(D7;"евпр(";"(""*""&";1);";";"&""*"";";1)&";0;впр"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(D7;"евпр(";"(""*""&";1);";";"&""*"";";1), а потом просто поставите равно.
Идея с автозаменой очень интересная, можно поиграть.
По поводу примеров от С.М. и EducatedFool - честно, говоря. не совсем понял, как это работает. Макросов в книге, вроде бы, нет, как тогда определена функция/автозамена? Можно ли сохранить ее в Personal.xlsb и использовать потом во всех проектах?
И, наконец, самое главное - обязательно ли определять диапозоны в строке ЕВПР :=...?
Затраты на это сравнимы с написанием всех стандартных еошибок, экономи времени, на первый взгляд, не получается.
Еще один вопрос. Нельзя ли Пунто научить при автозамене сразу цеплять диапазоны? То есть написать евпр(а1;a2;a3;a4) и получить на выходе если(еошибка(впр("*"&a1&"*";a2;a3;a4));0;впр("*"&a1&"*";a2;a3;a4))?
> Нельзя ли Пунто научить при автозамене сразу цеплять диапазоны?
Нет. В Punto Switcher автозамена - просто дополнительная опция, поэтому никаких наворотов ожидать от него не стоит.
Поищите в инете специализированные программы автозамены - наверняка, попадётся что-нибудь подходящее.
PS: Я бы не стал искать (потом ещё настраивать придётся помучиться), а написал бы макрос (в личную книгу макросов), который анализировал бы вводимые в ячейки значения, и, в случае обнаружения в ячейках конструкций вида "евпр(СписокЗначений)" (без кавычек, без знака равенства), формировал бы в ячейке соответствующую формулу (с подстановкой заданных диапазонов)
а) Сделать, чтобы макрос проверял каждую ячейку после введения в нее формулы б) Научить его работать с частями формулы. Ведь нужно найти в ней евпр, понять, где он закончился, вычленить из него переменные и потом вставить развернутую функцию только вместо этого евпр.
Принцип работы: в любую ячейку вводим формулу типа =евпр(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
Не могу разобраться, как сделать, чтобы макрос работал для любой книги. Я сохранил книгу с ним как надстройку, подцепил ее к excel через настройки, но почему-то код не работает. Про какие изменения в нем Вы писали?
Кроме того, нужно его модернизировать, чтобы он мог находить евпр в середине формулы, иначе смысла в подобной замене немного.
{quote}{login=Alexal}{date=01.08.2011 02:42}{thema=}{post} 1) Как модифицировать код, чтобы сделать макрос доступным для любой книги 2) Как научить его корректно обрабатывать функцию в середине выражения.{/post}{/quote}
2. Это заметно усложнит код (особенно если там вложенные функции будут - внутри ЕВПР). Сразу надо было говорить... Я делать не буду - может, кто из форумчан поможет.