Страницы: 1
RSS
Ячейка в которую возвращается результат пользовательской функции
 
Всем доброго времени суток. Столкнулся с проблемой при написании пользовательской функции. Функция, если её вызвать через "=" в ячейке, а затем воспользоваться мастером функций для передачи ей аргументов, записывает результат не в ту ячейку из которой она была вызвана, а в ячейку на соседнем листе. При этом, если ей передать аргументы не через мастер функций, то результат она записывает куда надо. Может кто-то сталкивался с таким и знает в чем может быть причина такого поведения?
 
Ну хотя-бы код функции покажите. А лучше файл с ней и как ее применять
Согласие есть продукт при полном непротивлении сторон
 
Код
Function ВПР_тест(Где_ищем As Variant, _
                Условие_1 As Variant, Массив_условий_1 As Variant, _
                Optional Условие_2 As Variant, Optional Массив_условий_2 As Variant, _
                Optional Условие_3 As Variant, Optional Массив_условий_3 As Variant, _
                Optional Условие_4 As Variant, Optional Массив_условий_4 As Variant, _
                Optional Условие_5 As Variant, Optional Массив_условий_5 As Variant)
'======================================
look_book = Где_ищем.Parent.Parent.Name
look_list = Где_ищем.Parent.Index
look_mass_1 = Массив_условий_1.Address
If IsMissing(Массив_условий_2) Then
    look_mass_2 = Массив_условий_1.Address
    Условие_2 = Условие_1
Else
    look_mass_2 = Массив_условий_2.Address
End If

If IsMissing(Массив_условий_3) Then
    look_mass_3 = Массив_условий_1.Address
    Условие_3 = Условие_1
Else
    look_mass_3 = Массив_условий_3.Address
End If

If IsMissing(Массив_условий_4) Then
    look_mass_4 = Массив_условий_1.Address
    Условие_4 = Условие_1
Else
    look_mass_4 = Массив_условий_4.Address
End If

If IsMissing(Массив_условий_5) Then
    look_mass_5 = Массив_условий_1.Address
    Условие_5 = Условие_1
Else
    look_mass_5 = Массив_условий_5.Address
End If

Set Массив_условий_1 = Workbooks(look_book).Sheets(look_list).Range(look_mass_1)
Set Массив_условий_2 = Workbooks(look_book).Sheets(look_list).Range(look_mass_2)
Set Массив_условий_3 = Workbooks(look_book).Sheets(look_list).Range(look_mass_3)
Set Массив_условий_4 = Workbooks(look_book).Sheets(look_list).Range(look_mass_4)
Set Массив_условий_5 = Workbooks(look_book).Sheets(look_list).Range(look_mass_5)

'======================================

Set fst_found_cell = Массив_условий_1.Find(Условие_1, lookat:=xlWhole)
fst_found_cell_row = fst_found_cell.Row
start_found_address = fst_found_cell.Address


scnd_found_cell = Массив_условий_2(fst_found_cell_row)
thrd_found_cell = Массив_условий_3(fst_found_cell_row)
frth_found_cell = Массив_условий_4(fst_found_cell_row)
fth_found_cell = Массив_условий_5(fst_found_cell_row)

Do
    If CStr(scnd_found_cell) = CStr(Условие_2) And CStr(thrd_found_cell) = CStr(Условие_3) And CStr(frth_found_cell) = CStr(Условие_4) And CStr(fth_found_cell) = CStr(Условие_5) Then
        ВПР_тест = Где_ищем(fst_found_cell_row)
        Exit Do
    Else
        Set fst_found_cell = Массив_условий_1.Find(Условие_1, lookat:=xlWhole, after:=fst_found_cell)
        fst_found_cell_row = fst_found_cell.Row
        fst_found_cell_address = fst_found_cell.Address

        scnd_found_cell = Массив_условий_2(fst_found_cell_row)
        thrd_found_cell = Массив_условий_3(fst_found_cell_row)
        frth_found_cell = Массив_условий_4(fst_found_cell_row)
        fth_found_cell = Массив_условий_5(fst_found_cell_row)
    End If
Loop While start_found_address <> fst_found_cell_address

End Function


Код находился в файле надстройки, чтоб можно было запускать функцию из любой открытой книги. Принцип действия аналогичный с ИНДЕКС+ПОИСКПОЗ. Обособленный знаком "=" кусок - это уже эксперименты, думал может надо явно адрес книги и листа передавать как-то, что результат не перепрыгивал на другой лист.
 
Вы путаете UDF  и SUB
 
Зачем такие сложности?
Объявите Где_ищем As Range и скармливайте функции обычные диапазоны.
Согласие есть продукт при полном непротивлении сторон
 
Да вопрос не в сложности, я уже по всякому пробовал. Вопрос в том, что я вызываю функцию, допустим, из ячейки на листе 2 и пытаюсь получить данные с листа 1. Она отрабатывает, но результат записывает не в ячейку на листе 2, откуда она была вызвана, а в ячейку на листе 1. Причем происходит это только если аргументы функции заполнять через мастер функций.
 
Цитата
написал:
затем воспользоваться мастером функций для передачи ей аргументов
а как именно Вы вызываете мастер функций?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
На примере обычного ВПР, последовательность действий в 2х скринах. Т.е. если аргументы заполнить таким образом, то происходят эти непонятные перемещения.
 
Цитата
написал:
последовательность действий в 2х скринах
у меня не воспроизводится. Либо глюк офиса, либо что-то стороннее мешает.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ок, возможно действительно что-то сторонее мешает или из-за разницы в версиях эксель. Пробую с другой стороны зайти, но тоже сталкиваюсь с проблемой. Пытаюсь в аргумент передать диапазон вида "A:A&B:B", вижу что эксель формирует массив, но почему-то аргумент функции не хочет принимать этот массив. Если же выделить конкретные ячейки, например, "A1&B1", то никаких проблем не возникает.
Собственно вопрос, как в функцию вида

Код
Function test(lookup_array)


передать массив полученный от обьединения двух дапазонов "A1&B1"?
Страницы: 1
Наверх