excel 宏中的部分单元格(或字符串)匹配
Partial cell(or string) match in excel macro
我是 VBA 的新手,我想在两张纸之间进行部分字符串(或单元格)匹配。
Name1 的一个例子是 "IT executive Sally Lim"
Name2 的一个例子是 "Sally Lim"
Name1 = Sheets("Work").Cells(RowName1, ColName1)
Name2 = Sheets("Roster").Cells(RowName2, ColName2)
'This condition doesn't work
If Name1 = "*" & Name2 & "*" Then
'The "Name2" comes out with a compile error: Invalid Qualifier
Name2.Font.Strikethrough
Exit Do
Else
End If
但是,它不起作用。当我 运行 编码时,要么没有任何反应,要么弹出错误。请帮助
已编辑编码:
If ShiftName Like "*" & CashName & "*" Then
CashName.Font.Strikethrough = True
删除部分已经解决,在我按照 John Coleman 的建议将我的声明从 "string" 更改为 "range" 后,它不再显示 "Compile Error"。
我通过将 Name1 和 Name2 都更改为 Sally 进行测试,然后使用以下条件进行删除线,它有效。我认为是“*”导致条件不可行。
If ShiftName Like CashName Then
CashName.Font.Strikethrough = True
如何通过相应地更改条件来完成部分匹配?
第二次编辑:
我的错!我意识到我的 Name1 是大写的。
使用Like
运算符:
If Name1 Like "*" & Name2 Then
您可以使用Like
进行特定的模式匹配,但它也允许通配符*
除了@MacroMan 关于使用 Like
的回答之外,您还需要正确使用 Strikethrough
。它是一个布尔值 属性 需要设置为 True:
If Name1 Like "*" & Name2 Then
Name2.Font.Strikethrough = True
Exit Do
Else
End If
编辑时:
根据您的扩展问题,您可以这样做:
Dim Name1 As Range, Name2 As Range 'If you don't have this already declared
'then ... in the loop:
Set Name1 = Sheets("Work").Cells(RowName1, ColName1)
Set Name2 = Sheets("Roster").Cells(RowName2, ColName2)
If Name1.Value Like "*" & Name2.Value & "*" Then
Name2.Font.Strikethrough = True
Exit Do
Else
End If
在范围变量上使用 .Value
并不是绝对必要的(如果没有它,使用 Like
的比较将按预期工作)但许多人认为它是好的 VBA 在使用范围变量而不是依赖范围对象的默认 属性 时,编码风格要明确。
您也可以完全省去变量 Name1
和 Name2
:
If Sheets("Work").Cells(RowName1, ColName1).Value Like "*" & Sheets("Roster").Cells(RowName2, ColName2).Value & "*" Then
Sheets("Roster").Cells(RowName2, ColName2).Font.Strikethrough = True
Exit Do
Else
End If
最后一句话:紧接着 End If
的 Else
有点毫无意义。大概您的实际代码在 else 子句中做了一些事情。如果不是——完全删除 else 并在 Exit Do
之后立即添加 End If
我是 VBA 的新手,我想在两张纸之间进行部分字符串(或单元格)匹配。
Name1 的一个例子是 "IT executive Sally Lim"
Name2 的一个例子是 "Sally Lim"
Name1 = Sheets("Work").Cells(RowName1, ColName1)
Name2 = Sheets("Roster").Cells(RowName2, ColName2)
'This condition doesn't work
If Name1 = "*" & Name2 & "*" Then
'The "Name2" comes out with a compile error: Invalid Qualifier
Name2.Font.Strikethrough
Exit Do
Else
End If
但是,它不起作用。当我 运行 编码时,要么没有任何反应,要么弹出错误。请帮助
已编辑编码:
If ShiftName Like "*" & CashName & "*" Then
CashName.Font.Strikethrough = True
删除部分已经解决,在我按照 John Coleman 的建议将我的声明从 "string" 更改为 "range" 后,它不再显示 "Compile Error"。
我通过将 Name1 和 Name2 都更改为 Sally 进行测试,然后使用以下条件进行删除线,它有效。我认为是“*”导致条件不可行。
If ShiftName Like CashName Then
CashName.Font.Strikethrough = True
如何通过相应地更改条件来完成部分匹配?
第二次编辑:
我的错!我意识到我的 Name1 是大写的。
使用Like
运算符:
If Name1 Like "*" & Name2 Then
您可以使用Like
进行特定的模式匹配,但它也允许通配符*
除了@MacroMan 关于使用 Like
的回答之外,您还需要正确使用 Strikethrough
。它是一个布尔值 属性 需要设置为 True:
If Name1 Like "*" & Name2 Then
Name2.Font.Strikethrough = True
Exit Do
Else
End If
编辑时:
根据您的扩展问题,您可以这样做:
Dim Name1 As Range, Name2 As Range 'If you don't have this already declared
'then ... in the loop:
Set Name1 = Sheets("Work").Cells(RowName1, ColName1)
Set Name2 = Sheets("Roster").Cells(RowName2, ColName2)
If Name1.Value Like "*" & Name2.Value & "*" Then
Name2.Font.Strikethrough = True
Exit Do
Else
End If
在范围变量上使用 .Value
并不是绝对必要的(如果没有它,使用 Like
的比较将按预期工作)但许多人认为它是好的 VBA 在使用范围变量而不是依赖范围对象的默认 属性 时,编码风格要明确。
您也可以完全省去变量 Name1
和 Name2
:
If Sheets("Work").Cells(RowName1, ColName1).Value Like "*" & Sheets("Roster").Cells(RowName2, ColName2).Value & "*" Then
Sheets("Roster").Cells(RowName2, ColName2).Font.Strikethrough = True
Exit Do
Else
End If
最后一句话:紧接着 End If
的 Else
有点毫无意义。大概您的实际代码在 else 子句中做了一些事情。如果不是——完全删除 else 并在 Exit Do
End If