vba проверяет ячейки в столбцах только для перечисленных слов в любом порядке с запятыми

#vba

#vba

Вопрос:

я пытаюсь запустить тест по столбцам для списка слов в любом порядке с включенными запятыми. т.е. mars, earth, moon, sun проверяют только эти слова в столбцах e, если не сообщение об ошибке. могут ли запятые, например, Марс, солнце или луна, солнце, мой код ниже, у меня проблема со словами, в которых есть запятые и в другом порядке, пожалуйста, помогите

 Sub substring()

Dim Target As String, c As Range, lr As Long, ws As Worksheet

Dim Target2 As String

Dim Target3 As String

Dim Target4 As String

 

Set ws = ThisWorkbook.Sheets("Sheet6")

lr = ws.Range("A" amp; ws.Rows.Count).End(xlUp).Row

Target = "sun"

Target2 = "moon"

Target3 = "earth"

Target4 = "mars"

For Each c In Range("A2:B" amp; lr)

    If StrComp(c.Text, Target, vbTextCompare) And StrComp(c.Text, Target2, vbTextCompare) And StrComp(c.Text, Target3, vbTextCompare) And StrComp(c.Text, Target4, vbTextCompare) Then

        MsgBox c.Address

   End If
Next c

End Sub

 
 

Ответ №1:

Здесь мы используем отдельную функцию, чтобы определить, есть ли какие-либо «плохие парни» в любом списке, разделенном запятыми:

 Public Function IsIn(s As Variant) As Boolean
    Dim arr, a
    arr = Array("sun", "moon", "earth", "mars")
    For Each a In arr
        If s = a Then
            IsIn = True
            Exit Function
        End If
    Next a
    IsIn = False
End Function

Sub kidus()
    Dim ws As Worksheet, lr As Long
    Dim cell As Range
    Set ws = ThisWorkbook.Sheets("Sheet6")
    lr = ws.Range("A" amp; Rows.Count).End(xlUp).Row
    
    For Each cell In ws.Range("A2:B" amp; lr)
        arr2 = Split(cell.Value, ",")
        For Each a In arr2
            If Not IsIn(a) Then
                MsgBox cell.Address
            End If
        Next a
    Next cell
End Sub
 

введите описание изображения здесь

РЕДАКТИРОВАНИЕ # 1:

Используйте эту версию IsIt() :

 Public Function IsIn(s As Variant) As Boolean
        Dim arr, a
        arr = Array("sun", "moon", "earth", "mars")
        For Each a In arr
            If LCase(s) = a Then
                IsIn = True
                Exit Function
            End If
        Next a
        IsIn = False
    End Function
 

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

1. @Gray’s Student извините, есть ли способ, которым я могу сделать его также не чувствительным к регистру? т.е. Mars = mars

2. нужно ли мне что-то вроде этого LCase (arr) = LCase (arr)

3. @Gray’s Student похоже, у меня это не работает, я ввел Lcase(arr)=Lcase(arr) в функцию, в которой слова перечислены в массиве, я помещаю не в то место?

4. @KidusYohans смотрите мою ПРАВКУ # 1

5. @Gray’s Student работает идеально! большое вам спасибо