Помоги, как создать формулу которая ищет первое снизу от данной ячейки не пустое значение в колонке и возвращает его это значение? Нужно чтобы при изменении данных эта ячейка сама перечтитывалась.
Я создала фуккцию но она не хочет возвращать значение, пишет что ошибка в значении.
Вам надо чтобы функция возвращала последнее значение в столбце или значение, которое находится под активной ячейкой?
Допустим в столбце С такой набор значений:
12
112
14
16
Выделена ячейка 112 - какое значение должна отображать функция?
В ячейки, где нужен результат, вставьте функцию.
Функция принимает ссылку c на ячейку,
относительно которой надо вести поиск,
то есть ссылку на ячейку, куда вставляется функция.
Function ПоискНеПусто(c)
Application.Volatile True ' - для автоматического пересчета при изменении любой ячеки
If c.Offset(1, 0) <> "" Then ' Если сразу следующая ячейка не пуста,
ПоискНеПусто = c.Offset(1, 0).Value ' то она и возвращается,
Else ' Иначе ищется первая не пустая:
ПоискНеПусто = c.End(xlDown) ' - эквивалент Ctr+ArrowDown
End If
End Function
Попутно выопрос к знатокам:
Наверное, функция и сама, без дополнительных параметров, должна знать, в какую ячейку вставлена - как это определяется?
Наверное, функция и сама, без дополнительных параметров, должна знать, в какую ячейку вставлена - как это определяется?
Вопрос, между прочим, очень интересный, и я сам был бы рад знать ответ на него.
с каких пор функции "вставляются в ячейки"?
Алекс, это ж проще пареной репы. Пользовательские функции заносятся в раздел User Defined и вставляются в ячейки так же как и обычные формулы:
=имяФункции(параметры)
Вот пример:
'Код модуля
Function Tomorrow() As Date
Tomorrow = Date + 1
End Function
Далее в ячейке пишем:
=Tomorrow()
Если формат ячейки - Дата, то в ней появится завтрашняя дата.
Кверт, я откопал, как определить, из какой ячейки вызвается функция. Для этого используется свойство Application.Caller:
Function TheAddress()
'пересчитываем функцию при изменении листа
Application.Volatile
'то, что вызвало функцию
Dim theCaller As Object
Set theCaller = Application.Caller
'если функция была вызвана из диапазона,
If TypeName(theCaller) = "Range" Then
'возвращаем его адрес
TheAddress = theCaller.Address(False, False)
Else
'иначе - возвращаем FALSE
TheAddress = False
End If
End Function