如何在Excel中突出显示选定的文本

我想写一个VBA函数来突出显示excel单元格中的特定文本。 这可能吗? 我一直在使用谷歌search,但目前还不清楚。

为了澄清,我想search一个文本值(实际上是一个值列表)的特定列,并突出显示黄色匹配的文本。

注意:这是我最终做的:

Sub Colors() Dim searchString As String Dim targetString As String Dim startPos As Integer searchString = "abc" targetString = Cells(2, 1).Value startPos = InStr(targetString, searchString) If startPos > 0 Then Cells(2, 1).Characters(startPos, Len(searchString)).Font.Color = vbRed End If End Sub 

这是基本的原则,我认为定制这个代码不是你要求的(因为没有提供这方面的细节):

  Sub Colors() With Range("A1") .Value = "Test" .Characters(2, 2).Font.Color = vbGreen End With End Sub 

小的描述,尽pipe它自己说话:第一个“2”是指需要着色的第一个字符,第二个“2”是指长度。

这只是为了将来的读者试图突出显示单元格内的特定string模式,

(这是我如何解释这个问题)在这个例子中,你可以设置在F1中search的string

 Sub test4String2color() Dim strTest As String Dim strLen As Integer strTest = Range("F1") strLen = Len(strTest) 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 

突出显示单元格中的文本的一个问题是可能有多个string出现,因此代码应该检查是否还有其他字符。 这是我解决这个问题的方法:

 Sub Colors() Dim searchTerms As Variant searchTerms = Array("searchterm1", "searchterm2", "lastsearchterm") Dim searchString As String Dim targetString As String Dim offSet As Integer Dim colToSearch As Integer Dim arrayPos, rowNum As Integer colToSearch = 3 For arrayPos = LBound(searchTerms) To UBound(searchTerms) For rowNum = 2 To 31124 searchString = Trim(searchTerms(arrayPos)) offSet = 1 Dim x As Integer targetString = Cells(rowNum, colToSearch).Value x = HilightString(offSet, searchString, rowNum, colToSearc) Next rowNum Next arrayPos End Sub Function HilightString(offSet As Integer, searchString As String, rowNum As Integer, ingredCol As Integer) As Integer Dim x As Integer Dim newOffset As Integer Dim targetString As String ' offet starts at 1 targetString = Mid(Cells(rowNum, ingredCol), offSet) foundPos = InStr(LCase(targetString), searchString) If foundPos > 0 Then ' the found position will cause a highlight where it was found in the cell starting at the offset - 1 Cells(rowNum, ingredCol).Characters(offSet + foundPos - 1, Len(searchString)).Font.Color = vbRed ' increment the offset to found position + 1 + the length of the search string newOffset = offSet + foundPos + Len(searchString) x = HilightString(newOffset, searchString, rowNum, ingredCol) Else ' if it's not found, come back out of the recursive call stack Exit Function End If End Function 

@Jack BeNimble感谢代码,在10分钟内成功使用它来突出显示单元格中的所有数字。 我重新组织了一下,首先search行和单元格中的所有search项,并允许多列。 我发现一个错误,你的突出显示的文本不喜欢重复55,444,只突出显示序列中的奇数重复。 在高亮function中修改了一行

 newOffset = offSet + foundPos + Len(searchString) - 1 //added the - 1. 

这里是我修改的代码。

Sub NumberColors()

 Dim searchTerms As Variant searchTerms = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".") Dim searchString As String Dim targetString As String Dim offSet As Integer Dim colsToSearch As Variant Dim arrayPos, colIndex, colNum As Integer Dim rowNum As Integer colsToSearch = Array(4, 44, 45) For colIndex = LBound(colsToSearch) To UBound(colsToSearch) colNum = colsToSearch(colIndex) For rowNum = 5 To 3000 For arrayPos = LBound(searchTerms) To UBound(searchTerms) searchString = Trim(searchTerms(arrayPos)) offSet = 1 Dim x As Integer targetString = Cells(rowNum, colNum).Value x = HilightString(offSet, searchString, rowNum, colNum) Next arrayPos Next rowNum Next colIndex 

结束小组

函数HilightString(offSet As Integer,searchString As String,rowNum As Integer,ingredCol As Integer)As Integer

  Dim x As Integer Dim newOffset As Integer Dim targetString As String ' offet starts at 1 targetString = Mid(Cells(rowNum, ingredCol), offSet) foundPos = InStr(LCase(targetString), searchString) If foundPos > 0 Then ' the found position will cause a highlight where it was found in the cell starting at the offset - 1 Cells(rowNum, ingredCol).Characters(offSet + foundPos - 1, Len(searchString)).Font.Color = vbBlue ' increment the offset to found position + 1 + the length of the search string newOffset = offSet + foundPos + Len(searchString) - 1 x = HilightString(newOffset, searchString, rowNum, ingredCol) Else ' if it's not found, come back out of the recursive call stack Exit Function End If 

结束function

谢谢杰克BeNimbleand数据库

这个答案是专门为@ t.ztrk谁在Col1中有城市和文本在第2列search这些城市。他在这里发布他的问题: 是否有可能find和更改Excel中的文本的颜色

我从另一个解决scheme借用了这个代码(对不起,如果不是原来的): https : //stackoverflow.com/a/11676031/8716187

 Sub test4String2color() Dim strTest As String Dim strLen As Integer strTest = Range("F1") strLen = Len(strTest) 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 

我知道这可能不够高雅,但是我在几分钟内就把它冲出来,以满足用户的需求。 对不起,如果上面提供的解决scheme是(1)更灵活或(2)更高效。 也抱歉我的C ++嵌套循环习惯通过。

@ t.ztrk你可以录制一个macros,并停止它(删除任何有)或插入一个button控件,并粘贴在那里的代码。 不知道你的VB的熟悉程度。 只要确保在运行macros之前在工作表上select一个单元格(它应该运行在任何工作表上,并且可以在任何工作簿上工作)。

 Sub Macro1() 'Searches all text in Column 2 on a Sheet for the string located in Column 1 'If found it highlights that text Dim ThisWB As Workbook Dim ThisWS As Worksheet Dim i As Integer Dim y As Integer Dim Col1 As Double Dim Col2 As Double Dim Col1_rowSTART As Double Dim Col1_rowEND As Double Dim Col2_rowSTART As Double Dim Col2_rowEND As Double Dim strTest As String Dim strLen As Integer 'Set up parameter that we know Set ThisWB = ActiveWorkbook Set ThisWS = ActiveSheet Col1 = 1 'city column Col2 = 2 'text search column 'Define Starting Row for each column Col1_rowSTART = 1 Col2_rowSTART = 1 'Define ending row for each column Col1_rowEND = ThisWS.Cells(ThisWS.Rows.Count, Col1).End(xlUp).Row Col2_rowEND = ThisWS.Cells(ThisWS.Rows.Count, Col2).End(xlUp).Row 'Could be fancy and see which column is shorter .... 'Won't do that here For i = Col1_rowSTART To Col1_rowEND 'make a string out of each cell value in Col1 strTest = CStr(ThisWS.Cells(i, Col1)) strLen = Len(strTest) 'Roll thorugh all of Column 2 in search of the target string For y = Col2_rowSTART To Col2_rowEND 'Check if Col1 string is in Col2 String If InStr(CStr(ThisWS.Cells(y, Col2)), strTest) > 0 Then ThisWS.Cells(y, Col2).Characters(InStr(ThisWS.Cells(y, Col2), strTest), strLen).Font.Color = vbRed End If Next y Next i MsgBox ("City Search Complete!") End Sub 

这是你的testing截图。 在这里输入图像描述

欢呼声 – 继续学习和应用。 -WWC

你不需要VBA来做到这一点。 您可以使用条件格式。

假设您在E列中有一组值。您想要在单元格B1中input一个值,并突出显示列E中与该值匹配的单元格。

突出显示E列中的单元格,并应用以下条件格式:

高亮匹配单元格

改变颜色以适应。 这将对列E中的单元格应用相对条件格式。例如:selectE3并查看条件格式,它应该如下所示:

相对参考

你可以看到公式如何调整自己。

编辑:如果要将B1中的值与E列中某个值的子string相匹配,请使用以下条件格式公式: =FIND($B$1,E1)>0

现在在单元格B1中键入不同的值。 如果键入的值与E列中的某个值相匹配,那么这些单元格(E列中)将更改颜色。 将单元格B1更改为E列中不存在的值,格式将消失。