Excel-VBA:减少匹配方法的限制(通过在句子中查找单词)
我在excel程序中使用匹配函数,但有一个问题,因为它只选择相同的匹配项。例如,如果您将一个带有“香蕉”的单元格与另一个带有“香蕉”的单元格进行比较,它将工作并返回正值。Excel-VBA:减少匹配方法的限制(通过在句子中查找单词),vba,excel,Vba,Excel,我在excel程序中使用匹配函数,但有一个问题,因为它只选择相同的匹配项。例如,如果您将一个带有“香蕉”的单元格与另一个带有“香蕉”的单元格进行比较,它将工作并返回正值。 但是如果你把“香蕉”和一个内容为“香蕉巧克力”的单元格进行比较,那么它就不会识别出“香蕉”这个词在单元格中 在我的例子中,每当在句子中发现一个单词时,我都希望返回一个真值 这是我的密码: Worksheets("sBldgMakati").Activate For i = 2 To 605 Range("B" &
但是如果你把“香蕉”和一个内容为“香蕉巧克力”的单元格进行比较,那么它就不会识别出“香蕉”这个词在单元格中 在我的例子中,每当在句子中发现一个单词时,我都希望返回一个真值 这是我的密码:
Worksheets("sBldgMakati").Activate
For i = 2 To 605
Range("B" & i).Activate
myResult = IsNumeric(Application.Match(ActiveCell.Value, elementsListRange, 0))
If myResult Then
Range("K" & i).Value = Range("K" & i).Value + 10
Else
Range("K" & i).Value = Range("K" & i).Value + 0
End If
Next i
我必须指定,在此代码中,elementsListange
对应于一系列单元格,其内容仅为一个单词(“例如香蕉”),而ActiveCell.value
通常是一个较长的表达式(“例如香蕉巧克力”)
提前感谢您的帮助 从Excel中的帮助文档中(如果按F1键并搜索
匹配项
):
如果match_type为0且lookup_值为文本字符串,则可以使用
通配符-中的问号(?)和星号(*)
查找值参数。问号匹配任何单个字符;
星号匹配任何字符序列
因此,=MATCH(“*Banana*”,C8,0)
返回1
如果C8
包含“香蕉巧克力”
在VBA中,如果要匹配的项位于单元格中,则可以使用字符串连接包含通配符星号,例如:
myResult = IsNumeric(Application.Match("*" & ActiveCell.Value & "*", elementsListRange, 0))
如果在B2:B605
范围内有许多句子必须根据elementListRange
中的所有单词进行测试,就像在这种情况下出现的那样,我认为您可能需要这样做(未测试):
使用以下函数,它将匹配字符串中的子字符串:
Function match(searchStr As Variant, matchStr As Variant) As Boolean
match = False
If (IsNull(searchStr) Or IsNull(matchStr)) Then Exit Function
If (matchStr = "") Or (searchStr = "") Then Exit Function
Dim f As Variant
f = InStr(1, CStr(searchStr), CStr(matchStr), vbTextCompare)
If IsNull(f) Then Exit Function
match = f > 0
End Function
要将其与范围一起使用,请执行以下操作:
Dim searchstr="A Banana found"
Dim isFound as boolean
IsFound=false
For each c in range
If match(searchstr, c.value)
IsFound=true
Exit for
End if
End for
请注意
searchStr
和matchStr
是变量,因此您可以将Excel单元格中的值传递给它。感谢@Simon提供的此信息,这很有帮助。然而,在我的情况下,我并没有成功地使它工作,因为我不是直接处理我的单元格内容,而是处理范围。我试图在代码中添加星号,但显然这不是正确的方法。你知道在“ElementsListange”(在我的案例中,“banana”将存储在哪里)周围放置星号的正确方法是什么吗?我编辑了我的答案,以展示如何将星号连接到单元格值的两端。哦,谢谢,真的很有趣。但是,很抱歉再次征求您的意见,因为带有单个单词的单元格存储在“elementslitrange”中,所以对ActiveCelle.Value执行此操作不起作用。而addind“*”&在“elementsListRange”之前和之后返回错误消息(类型不兼容)。我还直接尝试了ElementsListeng的内容,但它不起作用:Set elementsListeng=.Range(“D2:D”&lRowD)@Phalanx:我对Match()
的理解是它将在ElementsListeng
中搜索ActiveCell.Value
。因此,如果您试图在ActiveCell.Value
中查找elementsListRange
中的任何单词,那么我认为您必须逐个单元格循环elementsListRange
并在活动单元格中保留的字符串中搜索它们。我已经修改了我的答案,试图解决这个问题。对不起,西蒙,我没有选择正确的答案,因为我仍然有“语法”错误。马特的回答对我的情况很有效,给了我预期的结果。但无论如何,非常感谢,我学到了很多!您是否尝试过使用查找
或搜索
功能?element是否奇怪
VBA列表/单元格值集合的单元格范围?也许你可以选择所有问题的答案,这就是我们这样做的原因!
Dim searchstr="A Banana found"
Dim isFound as boolean
IsFound=false
For each c in range
If match(searchstr, c.value)
IsFound=true
Exit for
End if
End for