Excel精确单词匹配
假设我在A1牢房里有“维加斯很棒”。我想写一个公式,在细胞中寻找确切的单词“气体”。维加斯≠ 气体,但我找到的唯一搜索公式是:Excel精确单词匹配,excel,excel-formula,excel-2010,Excel,Excel Formula,Excel 2010,假设我在A1牢房里有“维加斯很棒”。我想写一个公式,在细胞中寻找确切的单词“气体”。维加斯≠ 气体,但我找到的唯一搜索公式是: =ISNUMBER(SEARCH("gas",lower(A1)) 返回true。还有什么方法可以精确匹配吗?理想情况下,我希望它不区分大小写,我相信用lower()包装A1可以满足这一要求。我认为这将处理您计划处理的所有情况: =OR(ISNUMBER(SEARCH(" gas",LOWER(A1), 1 )), LEFT(A1,3)= "gas") 我在搜索中
=ISNUMBER(SEARCH("gas",lower(A1))
返回true。还有什么方法可以精确匹配吗?理想情况下,我希望它不区分大小写,我相信用lower()包装A1可以满足这一要求。我认为这将处理您计划处理的所有情况:
=OR(ISNUMBER(SEARCH(" gas",LOWER(A1), 1 )), LEFT(A1,3)= "gas")
我在搜索中的“gas”前面加了一个空格。如果gas是单元格中的唯一单词或单元格中的第一个单词,则此函数的右侧部分将处理该情况 该选项区分大小写。事实并非如此。如果您使用的是搜索,则不需要使用
搜索(,[可选])
将“查找”文本和“内部”文本用空格换行,然后执行搜索
B1中的公式为
=ISNUMBER(搜索(“气体”、“A1&”)
根据需要填写。我认为要正确地覆盖案例,您必须在术语“气体”和搜索术语前后填充空格。这将确保气体在细胞的开始或结束时被发现,并且防止它在任何词的中间被发现。您的帖子没有指出文件中是否可以存在标点符号,但是为了在搜索周围容纳标点符号填充空间,您必须包含“gas”、“gas!”等的情况,以便特别考虑任何标点符号。如果您担心捕获诸如“gas.cost”或类似的值,可以在标点搜索周围使用相同的填充
=或(ISNUMBER(搜索(“气体”)、“&A1&”)、ISNUMBER(搜索(“气体”)、“&A1&”))
是一个基本的搜索,它应该返回单词gas本身,或“gas”。在“gas”之后填充空格。在搜索中,它将作为句子中的最后一个单词,或在单元格的末尾找到它
编辑:删除括号。我认为覆盖搜索词周围所有可能标点符号的唯一方法是创建自定义宏函数。使用增强的split函数将句子标记为一个单词数组,然后在数组中搜索匹配项 增强的分割功能 如何创建自定义宏 创建FindEngWord函数的代码
Public Function FindEngWord(ByVal TextToSearch As String, ByVal WordToFind As String) As Boolean
Dim WrdArray() As String
Dim text_string As String
Dim isFound As Boolean
isFound = False
text_string = TextToSearch
WrdArray() = Split(text_string)
isFound = False
For i = 0 To UBound(WrdArray)
If LCase(WrdArray(i)) = LCase(WordToFind) Then
isFound = True
End If
Next i
FindEngWord = isFound
End Function
Public Function Split(ByVal InputText As String, _
Optional ByVal Delimiter As String) As Variant
' This function splits the sentence in InputText into
' words and returns a string array of the words. Each
' element of the array contains one word.
' This constant contains punctuation and characters
' that should be filtered from the input string.
Const CHARS = ".!?,;:""'()[]{}"
Dim strReplacedText As String
Dim intIndex As Integer
' Replace tab characters with space characters.
strReplacedText = Trim(Replace(InputText, _
vbTab, " "))
' Filter all specified characters from the string.
For intIndex = 1 To Len(CHARS)
strReplacedText = Trim(Replace(strReplacedText, _
Mid(CHARS, intIndex, 1), " "))
Next intIndex
' Loop until all consecutive space characters are
' replaced by a single space character.
Do While InStr(strReplacedText, " ")
strReplacedText = Replace(strReplacedText, _
" ", " ")
Loop
' Split the sentence into an array of words and return
' the array. If a delimiter is specified, use it.
'MsgBox "String:" & strReplacedText
If Len(Delimiter) = 0 Then
Split = VBA.Split(strReplacedText)
Else
Split = VBA.Split(strReplacedText, Delimiter)
End If
End Function
可以使用此选项从excel工作表中调用
=FindEngWord(A1,"gas")
也可以在VBA中使用正则表达式来实现这一点。在正则表达式中,“\b”表示单词边界。单词边界定义为单词和非单词字符之间的位置或行的开头或结尾。单词字符为[A-Za-z0-9](字母、数字和下划线)。因此,可以使用此UDF。您确实需要注意,包含非单词字符(例如连字符)的单词可能会受到与您预期不同的处理。如果您处理的是非英语字母,则需要修改模式 但代码相当紧凑
Option Explicit
Function reFindWord(FindWord As String, SearchText As String, Optional MatchCase As Boolean = False) As Boolean
Dim RE As Object
Dim sPattern As String
Set RE = CreateObject("vbscript.regexp")
sPattern = "\b" & FindWord & "\b"
With RE
.Pattern = sPattern
.ignorecase = Not MatchCase
reFindWord = .test(SearchText)
End With
End Function
当我测试时,当Gas是字符串中的第一个单词时,它返回FALSE。e、 g:
gas is good
-->FALSE
我试图重现您的错误,但字符串“gas is good”和其他开头带有“gas”的字符串对我来说效果很好。返回TRUE。我仔细查看了一下,不知道您是否使用了与您发布的代码相同的代码。特别是,这一行:对于i=1到UBound(WrdArray)
因为WrdArray是VBA.Split的结果,而且它总是以零为基础,所以您发布的代码永远不会检查第一个单词。是的,您是对的。不知道我上次检查时做了什么让我错过了。该数组基于0。谢谢你的帮助。我已经编辑了我的代码,现在应该可以工作了。我还建议,一般来说,不要在自己的函数中使用与VBA函数相同的单词。特别是由于Split
(自身)在函数不存在时也会调用VBA.Split
。也许可以将其重命名为mySplit
或xSplit
。对于其他项目,更少的混乱和更容易调试。