Проблема с правильным синтаксисом пользовательской функции: Contains () - PullRequest
1 голос
/ 13 июня 2019

Я отчаянно пытаюсь реализовать это решение для моего собственного кода: https://stackoverflow.com/a/43196497/11632049

Целью является поиск различных строк («ABC», «123», ...), и, если строка данных содержит строку, скопируйте строку в другую рабочую книгу. Я получаю саб или функция не определена ошибка

Public Function ContainsAny(ByVal needle As String, ByVal caseSensitive As _ 
    Boolean, ParamArray haystack() As Variant) As Boolean

    Dim k As Integer
    Dim found As Boolean

    For k = LBound(haystack) To UBound(haystack)
        found = Contains(needle, CStr(haystack(k)), caseSensitive)
        If found Then Exit For
    Next
    ContainsAny = found

End Function


Private Sub Workbook_AfterSave(ByVal Success As Boolean)

    Dim CoderBook As Workbook
    Dim Review As Workbook
    Dim Alpha As Worksheet
    Dim Coder As Worksheet
    Dim LastRow As Long
    Dim NextRow As Long
    Dim i As Long

    Set CoderBook = Workbooks.Open(FilePath)
    Set Coder = CoderBook.Sheets("Sheet1")

    Set Review = ThisWorkbook
    Set Alpha = Review.Sheets("Sheet5")

    'Search code
    LastRow = Alpha.Cells.Find(What:="*", After:=[A1], _
    SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

    Application.ScreenUpdating = False

    'Loop search code
    For i = 2 To LastRow

        If Alpha.Range("G" & i) <> Alpha.Range("H" & i) Or _
        Alpha.Range("J" & i) <> Alpha.Range("K" & i) Then

        Select Case True
        Case ContainsAny(Ophth.Range("H" & i), False, "ABC", "123")

            DuplicateCheck = Application.Match(Alpha.Range("A" & i).Value, _ 
            Coder.Columns(1), 0)
            If IsError(DuplicateCheck) Then
                Coder.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0). _
                EntireRow.Value = Alpha.Rows(i).Value
            End If
        End Select
       End If

    Next i

CoderBook.Close SaveChanges:=True
Application.ScreenUpdating = True
End Sub

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вы получаете ошибку компиляции «функция не определена», потому что ContainsAny вызывает функцию Contains, которую вы удалили. Добавьте его обратно.

found = Contains(needle, CStr(haystack(k)), caseSensitive)

Но для того, чтобы он работал так, как вы хотите его использовать, необходимо перевернуть логику метода Contains:

Public Function Contains(ByVal needle As String, ByVal haystack As String, Optional ByVal caseSensitive As Boolean = False) As Boolean

    Dim compareMethod As VbCompareMethod

    If caseSensitive Then
        compareMethod = vbBinaryCompare
    Else
        compareMethod = vbTextCompare
    End If

    Contains = (InStr(1, haystack, needle, compareMethod) <> 0)
    If Not Contains Then Contains = (InStr(1, needle, haystak, compareMethod) <> 0)

End Function

Таким образом, Contains вернет True, когда одна строка содержит другую - и с этим вы можете сделать:

 If ContainsAny(Ophth.Range("H" & i).Value, False, "ABC", "123", "XYZ") Then

И условный блок будет выполняться, когда значение ячейки содержит одну из указанных строк.

0 голосов
/ 13 июня 2019

Кажется, это работает - я настроил пользовательскую функцию @MathieuGuindon, чтобы попытаться прояснить для себя желаемую связь между моими поисковыми терминами: у меня есть набор поисковых терминов, и мне нужно знать, когда какой-либо из них появится в моих данных .

Public Function ContainsAny(ByVal data As String, ByVal caseSensitive _ 
    As Boolean, ParamArray searchterms() As Variant) As Boolean

    Dim k As Integer
    Dim found As Boolean

    For k = LBound(searchterms) To UBound(searchterms)
        found = Contains(data, CStr(searchterms(k)), caseSensitive)
        If found Then Exit For
    Next

    ContainsAny = found

End Function



Public Function Contains(ByVal data As String, ByVal searchterms _
    As String, Optional ByVal caseSensitive As Boolean = False) As Boolean

    Dim compareMethod As VbCompareMethod

    If caseSensitive Then
        compareMethod = vbBinaryCompare
    Else
        compareMethod = vbTextCompare
    End If

    Contains = (InStr(1, data, searchterms, compareMethod) <> 0)

End Function


'implemented as
Case ContainsAny(Alpha.Range("H" & i), False, "ABC", "123", "XYZ)
...