Steve的工作表包含一万多行,A列中的每个单元格都包含一个文件名。这些名称需要遵循两个规则,Steve需要发现哪些名称违反了这两个规则。如果文件名包含破折号,则破折号前后也必须有一个空格。第二条规则是,如果名称包含逗号,则名称前不能有空格,但后面必须只能有一个空格。

史蒂夫(Steve)想知道他如何突出显示违反任一(或两者)的单元格

这些规则。

每当有人提到要“突出显示”工作表中的某些内容时,大多数人都会想到使用条件格式。这个实例也不例外。您可以轻松地使用条件格式来突出显示模式违规。开发条件格式设置规则的关键是提出一个公式,如果违反该模式,则该公式返回True。此公式检查两种违规:

=OR(ISNUMBER(FIND("-",SUBSTITUTE(A1," - ",""))), ISNUMBER(FIND(",",SUBSTITUTE(A1,", ",""))), ISNUMBER(FIND(" ,",A1)))

我在这里将公式分为三行,但是应该认为它是一个完整的公式。该公式从文件名中删除正确的模式(空格,破折号,空格和逗号,空格),然后检查是否在文件名中保留了破折号或逗号。如果仍然存在,则公式将返回True。

您可以设置条件格式设置规则以这种方式使用公式:

。选择包含所有要检查的文件名的单元格。

。在显示功能区的“主页”选项卡的情况下,单击“样式”组中的“条件格式”选项。 Excel将显示与条件格式相关的选项调色板。

。选择“突出显示单元规则”,然后从出现的子菜单中选择“更多规则”。 Excel将显示“新格式设置规则”对话框。

(请参见图1。)

。在对话框顶部的“选择规则类型”区域中,选择“使用公式来确定要格式化的单元格”。

。在“设置此公式为真的值的格式”框中,输入已经讨论的长公式。

。单击格式以显示“设置单元格格式”对话框。

。使用对话框中的控件,指定要用来突出显示违反模式的单元格的格式。

。单击“确定”关闭“设置单元格格式”对话框。您在步骤7中指定的格式现在应该出现在规则的预览区域中。

。单击确定。

如果您在步骤1中选择的单元格不是以单元格A1开头,则需要修改在步骤5中使用的公式以反映您的起始单元格。 (公式中A1的所有三个实例都需要更改以引用您的起始单元格。)

在条件格式设置规则中使用此公式有两个“陷阱”。首先,它不会检测到双倍空格。因此,例如,如果文件名包含“空格,空格,破折号,空格”,则将违反该模式。但是,公式中的SUBSTITUTE函数将删除“空格,破折号,空格”,并在结果字符串中保留多余的空格。即使该单个空间也不会被检测为违反该模式。

解决方案是使用更长的公式,或者完全绕开条件格式设置路线,而开始使用辅助列。它直接进入第二个“陷阱”,并且很大:

如果对一万行应用条件格式设置(或添加包含公式的帮助器列),您将注意到重新计算工作表所需的时间明显增加。当您开始向工作表中添加这么多的公式时,没有办法解决此问题。

因此,您可能会发现更适合开发一个突出显示单元格的宏。然后,当您要检查模式时可以手动运行宏,这意味着正常的工作表重新计算不会减慢速度。

下面的宏旨在在选定的单元格区域上运行。

它检查以确保破折号前没有两个空格,破折号后没有两个空格,逗号前没有一个空格或逗号后没有两个空格。然后,它从文件名中删除所有正确打乱的破折号和逗号,并检查是否剩余任何破折号或逗号。如果发现违反任何这些条件,则该单元格将用黄色格式化。

Sub CheckFilenames1()

Dim bBad As Boolean     Dim c As Range     Dim sTemp1 As String     Dim sTemp2 As String

For Each c In Selection         bBad = False         sTemp1 = c.Text

If Instr(sTemp1, "  -") > 0 Then bBad = True         If Instr(sTemp1, "-  ") > 0 Then bBad = True         If Instr(sTemp1, " ,") > 0 Then bBad = True         If Instr(sTemp1, ",  ") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, " - ", "")

If Instr(sTemp2, "-") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, ", ", "")

If Instr(sTemp2, ",") > 0 Then bBad = True

If bBad Then             c.Interior.Color = vbYellow         Else             c.Interior.Color = xlColorIndexNone         End If     Next c End Sub

宏可能需要一段时间才能运行,但是同样,仅当您要检查文件名时才需要运行该宏。如果您不希望宏“弄乱”单元格格式,那么您可能需要一个版本,在任何违反所需模式的文件名右侧的列中插入一些文本。

Sub CheckFilenames2()

Dim bBad As Boolean     Dim c As Range     Dim sTemp1 As String     Dim sTemp2 As String

For Each c In Selection         bBad = False         sTemp1 = c.Text

If InStr(sTemp1, "  -") > 0 Then bBad = True         If InStr(sTemp1, "-  ") > 0 Then bBad = True         If InStr(sTemp1, " ,") > 0 Then bBad = True         If InStr(sTemp1, ",  ") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, " - ", "")

If InStr(sTemp2, "-") > 0 Then bBad = True         sTemp2 = Replace(sTemp1, ", ", "")

If InStr(sTemp2, ",") > 0 Then bBad = True

If bBad Then c.Offset(0, 1) = "BAD"

Next c End Sub

运行该宏时,此变体会将文本“ BAD”插入到不正确的模式文件名右侧的单元格中。然后,您可以使用Excel的筛选功能仅显示那些包含文本的行。

当然,您可能只想更进一步,允许宏修改格式错误的文件名。下面的宏可对您选择的任何单元格起作用。它确保每个破折号被单个空格包围,并且每个逗号仅被单个空格跟随。

Sub FixFilenames()

Dim myArry() As String     Dim sTemp As String     Dim c As Range     Dim s As Variant

For Each c In Selection         myArry = Split(c, "-")

sTemp = ""

For Each s In myArry             If sTemp > "" Then                 sTemp = sTemp & " - " & Trim(s)

Else                 sTemp = Trim(s)

End If         Next s         myArry = Split(sTemp, ",")

sTemp = ""

For Each s In myArry             If sTemp > "" Then                 sTemp = sTemp & ", " & Trim(s)

Else                 sTemp = Trim(s)

End If         Next s         c = sTemp     Next c End Sub

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3015)适用于Microsoft Excel 2007、2010、2013和2016。