Elseif возвращает #ЗНАЧЕНИЕ

#vba #excel

#vba #excel

Вопрос:

Итак, все, что я хочу сделать, это создать функцию для оптимизации того, как я могу сегментировать данные сводной таблицы. Эти данные поступают в разных формах, таких как «245896321 — Name», «name» или «name23123», и я хочу, чтобы они возвращали полное имя человека, если ячейки содержат определенные тексты (фамилия человека), но он возвращает только #VALUE!

Заранее спасибо! Ты прекрасна!

Также я прошу прощения, если мое кодирование режет вам глаза, только что начал свое приключение в мире программирования два дня назад, если вы хотите предложить изменения, не стесняйтесь! 🙂

 Function Financeiro (Line) as String

   '=IF(ISNUMBER(SEARCH("*Person*", Line)), "Person Name")

If Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Ormelli*", Line)) Then

 Financeiro = "Fernando Ormelli"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Fortuna*", Line)) Then

 Financeiro = "Ricardo Fortuna"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Manocchio*", Line)) Then

Financeiro = "Ricardo Manocchio"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Stanquini*", Line)) Then

 Financeiro = "Helder Stanquini"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Ivanete*", Line)) Then

 Financeiro = "Ivanete Leite"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Freitas*", Line)) Then

 Financeiro = "João Freitas"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Khan*", Line)) Then

 Financeiro = "Marcelo Khan"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Filho*", Line)) Then

 Financeiro = "Marco Filho"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Rocha*", Line)) Then

 Financeiro = "Natalia Rocha"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Carvalho*", Line)) Then

 Financeiro = "Vinicius Carvalho"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*SAE*", Line)) Then

 Financeiro = "SAE"

ElseIf Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("*Raphael*", Line)) Then

 Financeiro = "Raphael Vieira"

Else

Financeiro = "Manual"

End If

End Function
  

Комментарии:

1. Financeiro = Manual : Manual переменная определена где-то еще, или вы забыли добавить кавычки вокруг нее?

2. Я просто забыл добавить кавычки, но ошибка все еще сохраняется. Но спасибо и за это, Тим!

3. Вместо того, чтобы вызывать вашу функцию из ячейки рабочего листа, создайте небольшой подраздел и вызовите его оттуда: вы увидите, где ошибка. Sub Tester():Debug.Print Financeiro("blah"): End Sub

4. Я прошу прощения, если мое кодирование режет вам глаза, я только начал свое приключение в мире программирования два дня назад — как только вы заставите свой код работать так, как задумано, зайдите в Code Review , вы многому научитесь! =)

5. Будет сделано! Спасибо за совет!

Ответ №1:

Application.WorksheetFunction.Search выдаст ошибку времени выполнения, если совпадения нет: попробуйте вместо этого что-то вроде:

 If Application.WorksheetFunction.IsNumber(Application.Search("*Ormelli*", Line)) Then
'...
  

Исключение WorksheetFunction переключает поведение с запуска ошибки во время выполнения на возврат значения ошибки.

Или просто используйте:

 If Line Like "*Ormelli*" Then
'...
  

что, я думаю, легче следовать.