6

我是 VBA 新手,我想在两张纸之间进行部分字符串(或单元格)匹配。

Name1 的一个示例是“IT 主管 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 的建议将声明从“字符串”更改为“范围”后,它不再显示“编译错误”。

我通过将 Name1 和 Name2 更改为 Sally 进行了测试,然后使用以下条件进行三振,它可以工作。我认为是“*”使条件不可行。

If ShiftName Like CashName Then
    CashName.Font.Strikethrough = True

如何通过相应地更改条件来完成部分匹配?

第二次编辑:

我的错!我意识到我的 Name1 是大写字母。

4

2 回答 2

5

除了@MacroMan 关于 using 的回答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在 Range 变量上使用并不是绝对必要的(Like如果没有它,比较 using 将按预期工作)但许多人认为在使用 range 变量而不是依赖于默认属性时,它是一种很好的 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

最后一点:Else紧随其后的End If是有些毫无意义。大概您的实际代码在 else 子句中做了一些事情。如果不是 - 只需完全删除 else 并End IfExit Do

于 2016-05-13T11:07:56.857 回答
3

使用Like运算符:

If Name1 Like "*" & Name2 Then

您可以Like用于特定的模式匹配,但它也允许使用通配符*

于 2016-05-13T11:01:16.143 回答