突出显示模式冲突(Microsoft Excel)
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。