excel宏中的部分单元格(或字符串)匹配

Posted

技术标签:

【中文标题】excel宏中的部分单元格(或字符串)匹配【英文标题】:Partial cell(or string) match in excel macro 【发布时间】:2016-09-09 13:08:59 【问题描述】:

我是 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 是大写字母。

【问题讨论】:

该代码是如何工作的?变量名不能以数字开头。 所以.. 我怎样才能改变它以使其工作?请赐教。谢谢 【参考方案1】:

除了@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 编码风格而不是依赖范围对象的默认属性。

您也可以完全省去变量Name1Name2

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 并在 Exit Do 之后立即添加 End If

【讨论】:

感谢您的帮助。但是,当我运行编码时,我收到 Name2 的“编译错误:无效的限定符”。 @stupidgal 我只有你的代码 sn-p 继续。我假设 Name2 是一个 Range 变量,用于在一个范围内循环,但显然情况并非如此。 Name2 是如何声明的?也许你可以编辑你的代码以包含周围的Do Loop(或者更多的代码,如果不是太长的话,可能是整个子)。 @JohnColeman 以前我Dim Name1 as string(与Name2 相同)我已将我的编码更改为您编辑的内容,但是当我运行它时,没有任何响应。我测试了If Name1.Value Like "*" & Name2.Value & "*" Then MsgBox CashName,也没有反应,所以我认为条件出了问题 @stupidgal try Trim(Name1.Value) Like "*" & Trim(Name2.Value) & "*" -- 杂散的空白会混淆比较。 @stupidgal "IT-executive Sally Lim" Like "*" & "Sally Lim" & "*" 肯定会计算为 True。也许在代码中输入Debug.Print Name1.Value & " " & Name2Value 并告诉我们你看到了什么。【参考方案2】:

使用Like 运算符:

If Name1 Like "*" & Name2 Then

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

【讨论】:

上面的编码不起作用。当我运行它时,对条件没有响应 那么Name1 显然不会以Name2 结尾。这些答案基于您问题中的代码 - 我们看不到您看到的值。 也许我会让它再次检查

以上是关于excel宏中的部分单元格(或字符串)匹配的主要内容,如果未能解决你的问题,请参考以下文章

将单元格数据复制到宏中以避免更新宏

部分单元格包含在表格 Excel 中

如何从选定的 Excel 工作表单元格中在宏中添加时间戳

excel表格怎么提取单元格中的部分内容

如何将EXCEL单元格中字符型日期截取并转为日期型?

如何在EXCEL中提取中间部分的数字或字母