Zar需要将条件格式应用于工作表A列中的值,但他无法弄清楚规则可能是什么。除了A列之外,他还具有从B列开始的数据,并且他定期添加新的数据列。如果从B开始的所有奇数列中都有数据,则Zar希望在A列中应用一种格式。(B是其工作表的数据列1,因此他认为这是奇数。)如果在所有以奇数开头的偶数列中都有数据C,Zar希望在A列中应用另一种格式。如果在所有以B开头的数据列中都有数据(可能有很多),那么他希望应用第三种格式。

正如Zar毫无疑问的那样,您可以轻松创建一个公式来确定B和C列中是否存在信息,并相应地应用格式。实际上,像这样的简单公式可以解决问题:

=COUNTA(B1:C1)=2 =COUNTA(B1)=1 =COUNTA(C1)=1

如果B和C中都包含信息,则第一个公式返回True;如果B中包含信息,则第一个公式返回;如果C中包含信息,则第三个公式返回。只要为每个规则/公式选择“ Stop If True”,那么您的格式将可以正常工作。

为B和C以外的多列创建公式仅稍微困难一点。依次相同的三种类型的公式如下:

=COUNTA(B1:G1)=6)

=COUNTA(B1,D1,F1)=3 =COUNTA(C1,E1,G1)=3

您可以根据需要轻松地将其他单元格引用添加到公式中。这种方法仅在以下三种情况下返回True:如果B1:G1范围内的所有单元格中都有东西,如果所有奇数单元格(B1,D1,F1)中都带有东西,以及所有偶数单元格(C1,E1, G1)里面有东西。如果范围中的某些单元格中包含值,则不会返回True。例如,在单元格B1,C1和E1中有值,那么它将不会返回True,并且不会满足任何格式化条件。

尽管所有这些在指定的限制下都可以正常工作,但它们并不是Zar所寻找的—他想要一个公式来检测一周又一周使用了多少列,因为他继续向列中添加数据并调整因此,无需手动编辑公式即可考虑添加的数据。换句话说,如果他将数据添加到H列,则他希望自动调整公式以考虑添加的列:

=COUNTA(B1:H1)=7)

=COUNTA(B1,D1,F1,H1)=4 =COUNTA(C1,E1,G1)=3

显然,这是一个更复杂的需求。解决该问题的最佳方法可能是创建一个用户定义的函数(宏),该函数可以查看一定范围的单元格并确定是否满足三个条件之一。

请考虑以下宏:

Function CellChk(crng As Range) As String     Dim iNumOdds As Integer     Dim iNumEvens As Integer     Dim iOdds As Integer     Dim iEvens As Integer     Dim iTots As Integer     Dim iTotCells As Integer     Dim rWork As Range     Dim rCell As Range     Dim iLastCol As Integer     Dim sTemp As String

iOdds = 0     iEvens = 0     iTots = 0

' Figure out the real last column in the worksheet and set range     iLastCol = ActiveSheet.Cells.Find(What:="*", _         SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _         LookIn:=xlFormulas).Column     Set rWork = Range(Cells(crng.Row, 2), Cells(crng.Row, iLastCol))



iTotCells = rWork.Count     iNumOdds = (iTotCells + 1) \ 2    ' Number of odd columns     iNumEvens = iTotCells - iNumOdds  ' Number of even columns

For Each rCell In rWork         If rCell <> "" Then             If ((rCell.Column - 1) Mod 2) = 1 Then                 iOdds = iOdds + 1             Else                 iEvens = iEvens + 1             End If             iTots = iTots + 1         End If     Next rCell

sTemp = ""

If iTots = iTotCells Then         sTemp = "t"

ElseIf iOdds = iNumOdds Then         sTemp = "o"

ElseIf iEvens = iNumEvens Then         sTemp = "e"

End If     CellChk = sTemp End Function

您可以通过在要检查的行中向其传递地址来使用该宏。

因此,例如,如果您将条件格式设置规则应用于单元格A3,则可以将宏的地址B3或C3传递给宏(A3以外的任何地址),因为这将导致循环引用。宏会查找该行中使用的最后一个单元格,然后确定其中有多少个奇数和偶数单元格。宏返回以下四个值中的任何一个:如果满足第一个条件(从B列开始的行中的所有单元格中都有东西),则返回“ t”。如果所有奇数列(B为第一奇数列)中都包含某些内容,则返回“ o”。如果所有偶数列(C为第一偶数列)

里面有东西,然后返回“ e”。如果三个条件都不满足,则该函数不返回任何内容。

您仍然需要设置三个条件格式规则,这些条件格式规则依赖于公式的求值。您可以在此宏中使用以下三个:

=CellChk(B1)="t")

=CellChk(B1)="o")

=CellChk(B1)="e")

这些示例用于将条件格式应用于单元格A1;将单元格引用调整为您要宏分析的正确行。请记住,即使您指定了一个单元格(在这些示例中为B1),该宏也会计算实际要查看的行中有多少个单元格。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

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

本技巧(5945)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。