Как написать VB-скрипт, чтобы найти несколько строк во всех ячейках и выделить каждую строку?

#excel #vba

#excel #vba

Вопрос:

Как я могу изменить следующие строки кода, чтобы найти строку на листе и выделить строки, если строка содержится в ячейке? Например, строка поиска — «SV-32346r1», а содержимое ячейки — «Документ содержит список автомобилей с идентификатором SV-32346r1 в Кали». эта строка должна быть выделена. Приведенный ниже код выполняет поиск только точных совпадений.

 If InStr(strConcatList, cell.Value) > 0 Then       'InStr returns 0 if the string isn't found
    cell.EntireRow.Interior.Color = RGB(255, 0, 0) 'Highlights the row in red if value found
End If
 

Полный код здесь (спасибо Айкену):

 Public Sub HighlightListedValues()
Dim strConcatList As String
Dim cell As Range

'Creates a string concatenating your list of strings, separated by |s
'e.g. "item1|item2|item3|item4|"
For Each cell In Sheets("List").Range("A1:A40")
strConcatList = strConcatList amp; cell.Value amp; "|"
Next cell

'For each used cell in Column A of sheet1, check whether the value in that cell
'is contained within the concatenated string
For Each cell In Intersect(Sheets("Gap Analysis").Range("E:E"), Sheets("Gap Analysis").UsedRange)
If InStr(strConcatList, cell.Value) > 0 Then       'InStr returns 0 if the string isn't found
    cell.EntireRow.Interior.Color = RGB(255, 0, 0) 'Highlights the row in red if value found
End If
Next cell
End Sub
 

Ответ №1:

Если вас интересует решение, отличное от VBA, вот как это сделать с помощью условного форматирования. Предполагая, что ваши данные находятся в столбце A, а список кодов находится в C2: C7, вы можете использовать эту формулу условного форматирования:

 =SUM(COUNTIF($A4,"*" amp; $C$2:$C$7 amp; "*"))
 

Настройте его следующим образом:

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

Обратите внимание, что это позволяет вам использовать несколько кодов, которые, как я предполагаю, могут быть причиной использования VBA.

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

1. Это сработало отлично. И это лучший вариант, поскольку некоторые среды не разрешают использование макросов. Спасибо.

Ответ №2:

Вместо того чтобы проверять каждую ячейку на соответствие списку, вам нужно проверить каждый элемент в списке на соответствие ячейке. Один из способов — это использование регулярных выражений. Оказывается, что список с разделителями канала в регулярном выражении выполняет такое сопоставление. В приведенном ниже коде измените «Лист1» на «Список»; и «Лист2» на «Анализ пробелов». Обратите внимание, что я изменил способ компоновки StrConcat таким образом, чтобы в начале или конце списка не было канала, а также чтобы не было «пустых» элементов.

 Option Explicit
Public Sub HighlightListedValues()
Dim strConcatList As String
Dim cell As Range
Dim RE As Object

'Creates a string concatenating your list of strings, separated by |s
'e.g. "item1|item2|item3|item4|"
For Each cell In Sheets("Sheet1").Range("A1:A40")
    If cell.Value <> "" Then strConcatList = strConcatList amp; "|" amp; cell.Value
Next cell
strConcatList = Mid(strConcatList, 2)

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .ignorecase = True
    .Pattern = strConcatList
End With

'For each used cell in Column A of sheet1, check whether the value in that cell
'is contained within the concatenated string
For Each cell In Intersect(Sheets("sheet2").Range("E:E"), Sheets("sheet2").UsedRange)
If RE.test(cell.Value) = True Then
    cell.EntireRow.Interior.Color = RGB(255, 0, 0) 'Highlights the row in red if value found
Else
    cell.EntireRow.Interior.Color = xlNone
End If
Next cell
End Sub
 

И если вы не хотите возиться с регулярными выражениями, вот способ сделать это с помощью «родного» VBA:

 Option Explicit
Public Sub HighlightListedValues()
Dim strConcatList() As String
Dim cell As Range
Dim I As Long

'Creates an arrary of your list of strings
With Worksheets("Sheet1").Range("A1:A40")
    ReDim strConcatList(1 To WorksheetFunction.CountA(.Value))
    For Each cell In .Cells
        If cell.Value <> "" Then
            I = I   1
            strConcatList(I) = cell.Value
        End If
    Next cell
End With

'For each used cell in Column A of sheet1, check whether the value in that cell
'is contained within the concatenated string
For Each cell In Intersect(Sheets("sheet2").Range("E:E"), Sheets("sheet2").UsedRange)
    For I = 1 To UBound(strConcatList)
        With cell.EntireRow.Interior
        If InStr(1, cell.Value, strConcatList(I), vbTextCompare) > 0 Then
            .Color = vbRed
            Exit For
        Else
            .Color = xlNone
        End If
        End With
    Next I
Next cell
End Sub