2016-09-26 3 views
0

Я пытаюсь превратить шрифт в красный цвет для появления списка слов в excel. Пока я могу найти одно слово, но мне нужно найти целый массив. Я новичок в VBA и борется. До сих пор я был в состоянии найти это в качестве решения, но она имеет дело с поиском одну строку, «F1»:Форматирование списка текстовых строк в Excel

Sub test4String2color() 
Dim strTest As String 
Dim strLen As Integer 
strTest = Range("F1") 
For Each cell In Range("A1:D100") 
If InStr(cell, strTest) > 0 Then 
cell.Characters(InStr(cell, strTest), strLen).Font.Color = vbRed 
End If 
Next 
End Sub 

Edit:

Клетки мне нужно быть выделены элементы, перечисленные в формате, разделенном запятыми. Например, «Apple 1, Apple 3, Banana 4, Orange». Список значений для поиска находится в разных ячейках «Apple», «Banana 4». Я просто хочу выделить «Banana 4», потому что это соответствие EXACT с значениями, разделенными запятыми. В текущей формулировке текст, который гласит «Apple 1» или «Apple 4», будет частично выделен.

Edit 2:

Examples

Это фактический формат из моей книги:

Example 3

+0

«... но мне нужно искать для всего массива», что вы имеете в виду? Если я поставил 'Gotham' в' F1', он правильно подсвечивает любое обнаружение 'Gotham' в диапазоне' A1: D100' (он выделяет «Gotham» и весь текст после в ячейке). Вы говорите, что «F1» может иметь, скажем «Gotham, City, Wayne Enterprises», и вы хотите искать каждое из этих слов (разделенное запятой или каким-либо другим разделителем)? – BruceWayne

+0

Вы на правильном пути. Вы можете сделать 'strTest' a Collection и прокрутить его для совпадений со вторым' For Loop'. Поскольку вы не используете какие-либо UDT, коллекцию можно будет легко настроить и пропустить. – Tyeler

+0

@BruceWayne Я говорю, что хочу поискать Gotham, City, Wayne Enterprises. Но все они были бы в отдельных ячейках, а не в одной ячейке, разделенной запятыми. У меня есть список из 200 слов, каждый в другой ячейке, которую я хочу использовать в качестве условий поиска. – user6883405

ответ

2

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

Код содержит совпадения между коллекцией (ваши выбранные совпадающие слова) и массивом (строка слов, разделенная в каждой ячейке). Если совпадение найдено, начинаются и заканчиваются символы в строке, а символы между этими значениями окрашены.

Sub ColorMatchingString() 
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1) 
    Dim strTest As Collection: Set strTest = New Collection 
    Dim udRange As Range: Set udRange = ws.Range("AC2:AC311") 'Define Search Ranges 
    Dim myCell, myMatch, myString, i 
    Dim temp() As String, tempLength As Integer, stringLength As Integer 
    Dim startLength as Integer 

    For Each myMatch In udRange 'Build the collection with Search Range Values 
     strTest.Add myMatch.Value 
    Next myMatch 

    For Each myCell In ws.Range("A2:AB1125") 'Loop through each cell in range 
     temp() = Split(myCell.Text, ", ") 'define our temp array as "," delimited 
     startLength = 0 
     stringLength = 0 

     For i = 0 To UBound(temp) 'Loop through each item in temp array 
      tempLength = Len(temp(i)) 
      stringLength = stringLength + tempLength + 2 

      For Each myString In strTest 
    'Below compares the temp array value to the collection value. If matched, color red. 
       If StrComp(temp(i), myString, vbTextCompare) = 0 Then 
        startLength = stringLength - tempLength - 1 
        myCell.Characters(startLength, tempLength).Font.Color = vbRed 
       End If 
      Next myString 
     Next i 
     Erase temp 'Always clear your array when it's defined in a loop 
    Next myCell 
End Sub 
+0

Да! Это отлично работает. Но еще один уровень сложности, который я изначально забыл.Ячейки, которые мне нужны, имеют элементы, перечисленные в формате, разделенном запятыми. Например, «Apple 1, Banana 3, Banana, Orange 4». Список значений для поиска находится в разных ячейках «Apple», «Orange», «Apple 1», «Banana 3». Я хочу выделить «Apple 1» и «Banana 3», потому что они являются точными совпадениями с значениями, разделенными запятыми. – user6883405

+0

Не очень ясно на мой комментарий. Это может иметь больший смысл: ячейки, которые мне нужны, имеют элементы, перечисленные в формате, разделенном запятыми. Например, «Apple 1, Apple 3, Banana 4, Orange». Список значений для поиска находится в разных ячейках «Apple», «Banana 4». Я просто хочу выделить «Banana 4», потому что это соответствие EXACT с значениями, разделенными запятыми. В текущей формулировке текст, который гласит «Apple 1» или «Apple 4», будет частично выделен. « – user6883405

+0

@ user6883405 Я обновил свой код, чтобы сделать то, что вы хотите. Проверьте, что результаты так же, как вы ожидаете ... wait nvm. Это пойдет на любую итерацию вашей строки, дайте немного больше времени. – Tyeler

1

В соответствии с исходным кодом, вы можете просто добавить еще один For each cell in Range (и несколько других вещей):

Sub test4String2color() 
Dim wb As Workbook 
Dim ws As Worksheet 

Dim strLen As Integer 
Dim i  As Long 
Dim tst As Range 

Set wb = ActiveWorkbook 
Set ws = wb.ActiveSheet 

Dim keyWordRng As Range 
Dim dataRng As Range 
Set keyWordRng = ws.Range("F1:F2") 
Set dataRng = ws.Range("A1:A5") 

For Each tst In keyWordRng 
    Debug.Print "Searching for: " & tst 
    For Each cell In dataRng 
     If tst.Value = cell.Value Then 
      cell.Characters(InStr(cell, tst), strLen).Font.Color = vbRed 
     ElseIf InStr(1, cell.Value, ",") > 0 Then 
      getWordsInCell cell, tst.Value 
     End If 
    Next cell 
Next tst 
End Sub 


Sub getWordsInCell(ByVal cel As Range, keyword As String) 
Dim words() As String 
Dim keywordS As Integer, keywordE As Integer 
words = Split(cel.Value, ",") 

Dim i As Long 
For i = LBound(words) To UBound(words) 
    Debug.Print "Found multiple words - one of them is: " & words(i) 
    If Trim(words(i)) = keyword Then 
     keywordS = ActiveWorkbook.WorksheetFunction.Search(keyword, cel, 1) 
     keywordE = ActiveWorkbook.WorksheetFunction.Search(",", cel, keywordS) 
     cel.Characters(keywordS, (keywordE - keywordS)).Font.Color = vbRed 
    End If 
Next i 

End Sub 

Пожалуйста, обратите внимание, я добавил к диапазонам (keyWordRng и dataRng), которые вам нужно будет для настройки вашего листа. Это должно (пальцы скрещены) работать!

enter image description here

+0

Удивительный! Есть ли способ выделить только точные соответствия? Ячейки, которые мне нужны, имеют элементы, перечисленные в формате, разделенном запятыми. Например, «Apple 1, Apple 3, Banana 4, Orange». Список значений для поиска находится в разных ячейках «Apple», «Banana 4». Я просто хочу выделить «Banana 4», потому что это соответствие EXACT с значениями, разделенными запятыми. В текущей формулировке текст, который гласит «Apple 1» или «Apple 4», будет частично выделен. – user6883405

+0

@ user6883405 - См. Обновленный код (это только строка 'If' была обновлена). Из того, что я собираю, ваш диапазон «F1: H1» (например) имеет одно «ключевое слово» в каждой ячейке, например «Банана», «Банана 4», «Яблоко». В вашем диапазоне 'A1: D100' есть куча слов в одной ячейке, например' Banana 4, Apple, Cars'. Вы ** только ** хотите, чтобы ячейки подсвечивались, где * целая ячейка * соответствует вашему ключевому слову? Поэтому он выделил бы ячейку 'C4', если бы эта ячейка была * только *' Banana 4'? – BruceWayne

+0

Почти! Я бы хотел, чтобы часть ячеек подсвечивалась с точным соответствием. Поэтому в вашем примере будут выделены бананы 4 и Apple. Однако, если бы это сказало Банана 5, я бы не хотел, чтобы только часть банана была выделена. Я бы хотел, чтобы он был подсвечен, если он точно соответствует значению, разделенному запятой. @BruceWayne – user6883405

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