function МояФункция(значение1 as string, область as range) as string
.
.
.
end function
yura613 писал(а):...ВПР(искомое_значение;таблица ;номер_столбца ;интервальный_просмотр)
и искомое_значение можно задвать как: А1(адресом ячейки), "тттт"(каким нибудь текстом) или А1+5
Function ПоискАдреса(область_для_поиска As Range, Критерий_для_поиска As String, _
Optional Имя_листа As String) As String
Dim myCell As Range
For Each myCell In область_для_поиска
If myCell.Value = Критерий_для_поиска Then
If Len(Имя_листа) > 0 Then
ПоискАдреса= Имя_листа & myCell.Address(False, False)
Else
ПоискАдреса= myCell.Address(False, False)
End If
Exit Function
End If
Next myCell
End Function
yura613 писал(а):Предназначена она для Экселя. Функция ищет заданное значение в указанной областе и возращает адрес искомого значения. Как реализовать эту задачу при помощи экселя я не догадался, поэтому напиасал эту функцию. Может быть есть и другое решение по-проще и по-лучше. У меня была загвоздка,я не мог сделать так чтобы критерий для поиска можно было задавать формулой или каким нибудь выражением. Теперь вроде работает.
только не пойму зачем нужно возвращать адрес ввиде стринга.
yura613 писал(а):А каким еще адрес может быть?
ДВССЫЛ - летучая
=МАКС(СУММ(СМЕЩ(ДВССЫЛ(ПоискАдреса('Планы продаж'!$J$7:$DF$7;G$4;"'Планы продаж'!"));$A9;0):СМЕЩ(ДВССЫЛ(ПоискАдреса('Планы продаж'!$J$7:$DF$7;G$4;"'Планы продаж'!"));$A9;СУММ('Планы продаж'!$C$6:$C$7)-1))-ГПР(G$3;Help_table!$C$7:$AO$22;$A9-3;0)-СУММ(СМЕЩ(ДВССЫЛ(ПоискАдреса(Help_table!$C$7:$AO$7;G$4;"Help_table!"));$A9+13;0):СМЕЩ(ДВССЫЛ(ПоискАдреса(Help_table!$C$7:$AO$7;G$4;"Help_table!"));$A9+13;СУММ('Планы продаж'!$C$6:$C$7)-1));0)
yura613 писал(а):я извиняюсь а что значит?ДВССЫЛ - летучая
yura613 писал(а):я извиняюсь а что значит?ДВССЫЛ - летучая
А в плане адрес стринговый, то да у меня возникла проблема и я потом использовал дополнительно функцию ДВССЫЛ. А если оставаться в рамках моей функции, то что надо было сделать чтобы не использовать потом дополнительно функцию ДВССЫЛ?
А вообще полная формула для которой я использовал эту функцию выглядит так:=МАКС(СУММ(СМЕЩ(ДВССЫЛ(ПоискАдреса('Планы продаж'!$J$7:$DF$7;G$4;"'Планы продаж'!"));$A9;0):СМЕЩ(ДВССЫЛ(ПоискАдреса('Планы продаж'!$J$7:$DF$7;G$4;"'Планы продаж'!"));$A9;СУММ('Планы продаж'!$C$6:$C$7)-1))-ГПР(G$3;Help_table!$C$7:$AO$22;$A9-3;0)-СУММ(СМЕЩ(ДВССЫЛ(ПоискАдреса(Help_table!$C$7:$AO$7;G$4;"Help_table!"));$A9+13;0):СМЕЩ(ДВССЫЛ(ПоискАдреса(Help_table!$C$7:$AO$7;G$4;"Help_table!"));$A9+13;СУММ('Планы продаж'!$C$6:$C$7)-1));0)
и я думаю, благодаря некоторым исправлениям ее уже немного можно подсократить. Хотя хотелось бы ужать формулу как можно больше.
=СУММ(ДВССЫЛ(ПоискАдреса(A2:A9;$A$2)):СМЕЩ(ДВССЫЛ(ПоискАдреса(A2:A9;$A$4));2;1))
yura613 писал(а):А так да погарячился немного вывешивая всю формулу. Лучше так:
- Код: Выделить всё
=СУММ(ДВССЫЛ(ПоискАдреса(A2:A9;$A$2)):СМЕЩ(ДВССЫЛ(ПоискАдреса(A2:A9;$A$4));2;1))
тут мне без ДВССЫЛ не обойтись. А хотелось бы без этой функции.
=СУММ(ИНДЕКС(A2:A9;ПОИСКПОЗ($A$2;A2:A9;0)):ИНДЕКС(B2:B9;2+ПОИСКПОЗ($A$4;A2:A9;0)))
yura613 писал(а):а как можно реализовать поиск в экселе по двум параметрам
Krasnaja Shapka писал(а):yura613 писал(а):а как можно реализовать поиск в экселе по двум параметрам
{=СУММ(ЕСЛИ(($A21=$A$4:$A$14)*(B$20=$C$4:$C$14);$B$4:$B$14;0))}
вводи формулой массива, ctrl + shift + enter
p.s. строки и столбцы в этой формуле могут быть другими, так как ты выложил рисунок без названия столбцов и строк...
yura613 писал(а):Genyaa а можно и без функции сцепить, просто через амперсант писать (&) и тоже работает.
=СУММЕСЛИ($D$4:$D$14;$A21&B$20;$B$4:$B$14)
=СУММЕСЛИ($A21&B$20;{"a"\"b"\"c"};$B$4:$B$14)
=СЧЁТЕСЛИ($A21&B$20;{"a"\"b"\"c"})
yura613 писал(а):KL я извиняюсь а как это можно так лихо массив в формулу добавить?
GSerg писал(а):Запятая горизонтальный.
{=СУММ(ЕСЛИ(($A27=$A$4:$A$14)*(B$20=$C$4:$C$14);$B$4:$B$14;0))}
yura613 писал(а):Я тут стал использовать предложенные вами функции, работать то они работают, но при их использовании увеличивается размер файла. Что в свою очередь будет затруднять перещеты. А можно ли наайти оптимальный вариант между весом файла и скоростью пересчета(Хотя вес файла я думаю более приоритетней)?
вариант с использованием такой функции
- Код: Выделить всё
{=СУММ(ЕСЛИ(($A27=$A$4:$A$14)*(B$20=$C$4:$C$14);$B$4:$B$14;0))}
весит меньше всех, но это все равно больше чем с использованим собственных функций. Хотя не известное как это будет работать при увеличении данных, например в 10 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4