2015-08-04 3 views
0

Я хочу создать функцию, которая проверяет, чтобы ячейка A2 на листе 1 содержала любые значения в отдельном столбце.Созданная пользователем функция не работает должным образом

Колонка 1 (Лист1)

  • бедных
  • ребенок
  • сын

Колонка 1 (Лист4)

  • бедных
  • богатых
  • ребенок
  • взрослых
  • дочь
  • мать

У меня есть следующий код:

Function KeepActive(catchAll As String) As String 

Dim i As Integer 

For i = 1 To 500 
    If InStr(catchAll, Sheet4.Cells(i, 1).Value) Then 
     catchAll = "match" 
    Else 
     catchAll = "no match" 
    End If 
Next i 

KeepActive = catchAll 

End Function 

Catchall является ссылкой на соответствующую ячейку в колонке 1.

Поэтому теоретически теоретически следует понимать, что «плохой» «ребенок» и «son» присутствует в колонке 2.

Это должно возвращать два «совпадения» и один «нет совпадения», но он возвращает три «совпадения».

Любые идеи?

Спасибо!

+0

Это _looks_, как вы могли бы использовать Excel? Вы можете добавить теги [excel] и/или [excel-vba], чтобы получить больше/релевантных глаз на ваш вопрос, если это так. –

+0

спасибо, что указал это. исправлено! – Hectah

+0

Вы не выходите из цикла, когда находите совпадение, поэтому вы устанавливаете catchAll для «соответствия», затем повторяете цикл, и его можно вернуть обратно в «no match», это фактически даст вам результат последнего проверенного значения В диапазоне. как другие предложили просто поставить 'Exit For' после того, как вы установили' catchAll = "match" ' –

ответ

0

Попробуйте это:

Function KeepActive(catchAll As String) As String 

Dim i As Long, rv as string 

rv = "no match" 
For i = 1 To 500 
    If InStr(catchAll, Sheet4.Cells(i, 1).Value) Then 
     rv = "match" 
     Exit For 
    End If 
Next i 

KeepActive = rv 

End Function 
0

Поэтому я считаю, что это не работает, это у вас есть ни в какое сравнение не попробовать это. Иными словами, он вернет 0, что верно.

KeepActive = "no match" 
For i = 1 To 500 
    If InStr(catchAll, Sheet4.Cells(i, 1).Value) > 0 Then 
     KeepActive= "match" 
     exit for 
    End If 
Next i 
0

В коде, вы измените CatchAll после первого цикла. Таким образом, вы сравниваете строку «Match» или «No Match», а не исходный аргумент.

Кроме того, вам необходимо выйти из кода после того, как найдете совпадение.

Или вы могли бы просто использовать метод Range.Find:


Option Explicit 
Function KeepActive(catchAll As String) As String 
    Dim C As Range 

Set C = Sheet4.Columns(1).Find(what:=catchAll, LookIn:=xlValues, lookat:=xlWhole, _ 
       MatchCase:=False) 

If Not C Is Nothing Then 
    KeepActive = "Match" 
Else 
    KeepActive = "No Match" 
End If 

End Function 

0

Вы просто могли бы сделать это с помощью формулы массива:

=SUM(IF(COUNTIF(Sheet2!A1:A6,A1:A3)>0,1,0)) 

Ctrl-Shift ENTER после ввода формулы, а не только ENTER. Он возвращает 2 для 2 совпадений.

В качестве альтернативы, если вы хотите построчно формулы просто:

=IF(COUNTIF(Sheet2!A$1:A$6,A1)>0,"Match","No Match") 

затем перетащить вниз

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