Excel VBA如果cell.Value = …那么

我有这个代码运行良好:

Sub colortest() Dim cell As Range For Each cell In Range("Range1") If cell.Value = "Word1" Then cell.Interior.Color = XlRgbColor.rgbLightGreen ElseIf cell.Value = "Word2" Then cell.Interior.Color = XlRgbColor.rgbOrange ElseIf cell.Value = "Word3" Then cell.Interior.Color = XlRgbColor.rgbRed End If Next cell End Sub 

我的问题是只有在单元格只包含该文本时,这些值才起作用。 但我的细胞通常是这样的:“某事, 10254,15 / 15, Word1另一个字”我只需要Word1 。 谢谢,

您可以确定是否通过使用单元格中find某个单词

 If InStr(cell.Value, "Word1") > 0 Then 

如果在string中findWord1,则InStr()函数将返回string中Word1的第一个字符的位置。

您可以使用带有通配符的Like运算符来确定给定的子string是否存在于string中,例如:

 If cell.Value Like "*Word1*" Then '... ElseIf cell.Value Like "*Word2*" Then '... End If 

在此示例中, "*Word1*"中的"*Word1*"字符是匹配零个或多个字符的通配符。

注: Like运算符区分大小写,因此"Word1" Like "word1"为false, 在此MSDN页面上可以find更多信息。

我认为在Excel中使用“Find”函数而不是For Each循环会更有意义。 它的工作速度要快得多,而且是为了这样的行为而devise的。 尝试这个:

  Sub FindSomeCells(strSearchQuery As String) Set SearchRange = Worksheets("Sheet1").Range("A1:A100") FindWhat = strSearchQuery Set FoundCells = FindAll(SearchRange:=SearchRange, _ FindWhat:=FindWhat, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByColumns, _ MatchCase:=False, _ BeginsWith:=vbNullString, _ EndsWith:=vbNullString, _ BeginEndCompare:=vbTextCompare) If FoundCells Is Nothing Then Debug.Print "Value Not Found" Else For Each FoundCell In FoundCells FoundCell.Interior.Color = XlRgbColor.rgbLightGreen Next FoundCell End If End Sub 

该子程序search一些string并返回满足search条件的一组单元。 那么你可以做任何你想要的与该集合中的单元格。 忘了添加FindAll函数定义:

 Function FindAll(SearchRange As Range, _ FindWhat As Variant, _ Optional LookIn As XlFindLookIn = xlValues, _ Optional LookAt As XlLookAt = xlWhole, _ Optional SearchOrder As XlSearchOrder = xlByRows, _ Optional MatchCase As Boolean = False, _ Optional BeginsWith As String = vbNullString, _ Optional EndsWith As String = vbNullString, _ Optional BeginEndCompare As VbCompareMethod = vbTextCompare) As Range ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' FindAll ' This searches the range specified by SearchRange and returns a Range object ' that contains all the cells in which FindWhat was found. The search parameters to ' this function have the same meaning and effect as they do with the ' Range.Find method. If the value was not found, the function return Nothing. If ' BeginsWith is not an empty string, only those cells that begin with BeginWith ' are included in the result. If EndsWith is not an empty string, only those cells ' that end with EndsWith are included in the result. Note that if a cell contains ' a single word that matches either BeginsWith or EndsWith, it is included in the ' result. If BeginsWith or EndsWith is not an empty string, the LookAt parameter ' is automatically changed to xlPart. The tests for BeginsWith and EndsWith may be ' case-sensitive by setting BeginEndCompare to vbBinaryCompare. For case-insensitive ' comparisons, set BeginEndCompare to vbTextCompare. If this parameter is omitted, ' it defaults to vbTextCompare. The comparisons for BeginsWith and EndsWith are ' in an OR relationship. That is, if both BeginsWith and EndsWith are provided, ' a match if found if the text begins with BeginsWith OR the text ends with EndsWith. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Dim FoundCell As Range Dim FirstFound As Range Dim LastCell As Range Dim ResultRange As Range Dim XLookAt As XlLookAt Dim Include As Boolean Dim CompMode As VbCompareMethod Dim Area As Range Dim MaxRow As Long Dim MaxCol As Long Dim BeginB As Boolean Dim EndB As Boolean CompMode = BeginEndCompare If BeginsWith <> vbNullString Or EndsWith <> vbNullString Then XLookAt = xlPart Else XLookAt = LookAt End If ' this loop in Areas is to find the last cell ' of all the areas. That is, the cell whose row ' and column are greater than or equal to any cell ' in any Area. For Each Area In SearchRange.Areas With Area If .Cells(.Cells.Count).Row > MaxRow Then MaxRow = .Cells(.Cells.Count).Row End If If .Cells(.Cells.Count).Column > MaxCol Then MaxCol = .Cells(.Cells.Count).Column End If End With Next Area Set LastCell = SearchRange.Worksheet.Cells(MaxRow, MaxCol) On Error GoTo 0 Set FoundCell = SearchRange.Find(what:=FindWhat, _ after:=LastCell, _ LookIn:=LookIn, _ LookAt:=XLookAt, _ SearchOrder:=SearchOrder, _ MatchCase:=MatchCase) If Not FoundCell Is Nothing Then Set FirstFound = FoundCell Do Until False ' Loop forever. We'll "Exit Do" when necessary. Include = False If BeginsWith = vbNullString And EndsWith = vbNullString Then Include = True Else If BeginsWith <> vbNullString Then If StrComp(Left(FoundCell.Text, Len(BeginsWith)), BeginsWith, BeginEndCompare) = 0 Then Include = True End If End If If EndsWith <> vbNullString Then If StrComp(Right(FoundCell.Text, Len(EndsWith)), EndsWith, BeginEndCompare) = 0 Then Include = True End If End If End If If Include = True Then If ResultRange Is Nothing Then Set ResultRange = FoundCell Else Set ResultRange = Application.Union(ResultRange, FoundCell) End If End If Set FoundCell = SearchRange.FindNext(after:=FoundCell) If (FoundCell Is Nothing) Then Exit Do End If If (FoundCell.Address = FirstFound.Address) Then Exit Do End If Loop End If Set FindAll = ResultRange End Function