2017-01-19 5 views
1

Я думаю, что я что-то просто с видом ...Создать пользовательскую функцию, которая работает, когда замедлен

Моя идея заключается в том, чтобы создать функцию в Excel, что проще установить, чем следующее: =INDEX($A$1:$A$5,AGGREGATE(15,6,ROW($B$1:$B$5)/($B$1:$B$5=1),ROW(1:1)))
(см ScottCraner's comment in this answer для этой функции на практике)

Я создал следующий UDF:

Public Function findUnique(ByVal indexRange As Range, matchRange As Range, matchVal As Long) 
' Trying to create a dynamic function of: 
' =INDEX($A$1:$A$5,AGGREGATE(15,6,ROW($B$1:$B$5)/($B$1:$B$5=1),ROW(1:1))) 

findUnique = Evaluate("=Index(" & indexRange.Address & ",AGGREGATE(15,6,Row(" & matchRange.Address & _ 
    ")/(" & matchRange.Address & "=" & matchVal & "),Row(" & ActiveCell.Row & ":" & ActiveCell.Row & ")))") 

End Function 

И почти работ. Кроме того, когда я перетаскиваю из первой строки, данные не обновляются. Я должен щелкнуть в ячейку «повторного запуска» функции, чтобы получить правильные данные, чтобы показать:

enter image description here

(Колонка D является то, что формула, введены правильно).

Но как я могу получить формулу для автоматического обновления без повторного входа в ячейку?

Я также попытался добавить четвертую переменную:

Public Function findUnique(ByVal indexRange As Range, matchRange As Range, matchVal As Long, curRow as Long) 

findUnique = Evaluate("=Index(" & indexRange.address & ",AGGREGATE(15,6,Row(" & matchRange.address & _ 
    ")/(" & matchRange.address & "=" & matchVal & "),Row(" & curRow & ":" & curRow & ")))") 

End Function 

и введите как: =findUnique($A$1:$A$5,$B$1:$B$5,1,ROW()) , но он просто возвращает ошибку #VALUE

(Кроме того, как я избежать ActiveCell.Row, как я это пробурено в моей голове, чтобы избежать использования Active ничего ...)

Спасибо за любые мысли или советы!

+0

Если вы 'Debug.Print ActiveCell.Row' - вы увидите, что это дело расшитое вас. Однако пока не найдено солна. – OldUgly

+0

@ OldUgly Я знал это! Ха-ха-да, я понял, что это причина, но не может понять, почему использование 'Row()' также приводит к ошибке. – BruceWayne

ответ

2

С этой SO answer, попробуйте следующее ...

With Application.Caller 
    CallerRow = .Row 
End With 
findUnique = Evaluate("=Index(" & indexRange.Address & ",AGGREGATE(15,6,Row(" & matchRange.Address & _ 
    ")/(" & matchRange.Address & "=" & matchVal & "),Row(" & CallerRow & ":" & CallerRow & ")))") 
+0

Ага, да! Я прочитаю больше [здесь] (http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx), но быстро, я полагаю, '.Caller' относится к ячейке, которая« называется »формулой? Это здорово и работает! – BruceWayne

 Смежные вопросы

  • Нет связанных вопросов^_^