2014-12-17 3 views
0

Я пытаюсь создать функцию, которая ищет значение в заданном диапазоне ячеек, но оно не выполняется. Он должен вернуть ячейку, где значение найдено.Функция VBA не выполняется

Function searchInRange(where As Range, what As String) As Range 
For Each c In where.Cells 
Debug.Print (c.Value) 
    If c.Value = what Then 
     searchInRange = c 
    End If 
Next c 

End Function 

Я вызываю его из подмодуля, но он не выполняется. Если я иду на отладку, отладчик просто переходит к следующему оператору без ввода функции. Я не понимаю, почему

EDIT

Как и многие люди предложили, я отправляю модуль, который вызывает функцию. Это функция нажатия кнопки. Файл и лист правильно выбраны. Я знаю это, потому что последнее предложение (PE_Sheet.activate) работает правильно. С уважением.

Private Sub CommandButton1_Click() 
Dim PE_File As Workbook 
Dim PE_Sheet As Worksheet 
Dim cell As Range 


Set PE_File = Workbooks(getSelectedWorkbook()) 
Set PE_Sheet = PE_File.Worksheets("Monitored") 
Unload UserForm1 

searchAlarmFilter PE_Sheet.Range("A:A"), "5184" 

PE_Sheet.Activate 
End Sub 
+1

Можете ли вы опубликовать раздел кода, который вызывает функцию? – TheEngineer

+1

Если функция не указана в родительской суб/функции, вы должны смотреть на родительскую подфункцию/функцию вместо указанной выше. Как предложил @TheEngineer, разместите раздел, который вызывает указанную выше функцию – Alex

+0

, не то, что это проблема, но вы можете захотеть «выйти за», поскольку вы рискуете перезаписать ранние результаты. – NickSlash

ответ

3

Вы также должны set диапазоны

Public Function sir(where As Range, what As String) As Range 
Dim res As Range: Set res = Nothing 
For Each c In where.Cells 
    Debug.Print c.Value 
    If c.Value = what Then 
     Set res = c 
     Exit For 
    End If 
Next 
Set sir = res 
End Function 
0

С NickSlash был прав, а функция должна выглядеть, как он указал, что это только часть проблемы. Я не могу понять, почему jet, но разгрузка формы перед вызовом функции делает интерпретатор не выполняющим функцию. Кажется, что все переменные, которые каким-либо образом зависят от формы, выгружаются с помощью формы. Для меня это не имеет большого значения, но он работает именно так.

Таким образом, правильный способ вызова функции будет:

Private Sub CommandButton1_Click() 
Dim PE_File As Workbook 
Dim PE_Sheet As Worksheet 
Dim cell As Range 


Set PE_File = Workbooks(getSelectedWorkbook()) 
Set PE_Sheet = PE_File.Worksheets("Monitored") 
searchAlarmFilter PE_Sheet.Range("A1:A500"), "5184" 
Unload UserForm1 



PE_Sheet.Activate 
End Sub 

Для правильной версии функции см ответ NickSlash в.

+0

Если ваш код находится в модуле пользовательской формы, тогда вызов выгрузки может эффективно быть 'exit sub'ing. Попробуйте скрыть форму, активировав лист, а затем выгрузив форму – NickSlash

+0

Если бы быстрый тест и разгрузка формы в середине кодового блока не прекратили выполнение заявлений после него. Тем не менее, возможно, лучше всего не выгружать форму до того, как вы закончите. – NickSlash

+0

Но функция, которую я вызываю, также находится внутри формы «блок кода», поэтому, возможно, это проблема. Я не знаю, могу ли я переместить функцию в основной модуль, который он мог бы работать. – Danielo515