如何突出显示电子表格中上一行条目的条件格式更改?

时间:2019-02-23 21:54:34

标签: excel

我正在尝试建立一个条件格式设置规则,其中当前行突出显示电子表格中前一行条目的更改(一段时间内可能会有多个修订)。

经过研究,我发现以下公式返回了具有相同DASID#(因此进行了编辑)的前一行。 DASID是对电子表格A列中的事件ID的结构化引用。

这有效并返回具有相同DAS ID的前一个ROW#:

  

{=大(IF(DASID = A1389,ROW(DASID)-MIN(ROW(DASID))+ 1),2)}

但是,由于我将其作为条件格式规则,因此需要动态计算单元格位置。

因此替换:

  

DASID = A1389

使用:

  

DASID =(ADDRESS(ROW(),1))计算得出$ A $ 1389
  {= LARGE(IF(DASID =(ADDRESS(ROW(),1)),ROW(DASID)-MIN(ROW(DASID))+ 1),2)}

但是,替换公式会生成#NUM! Excel中的错误。我也尝试过用Indirect()封装,但是运气不好。

  

INDIRECT(ADDRESS(ROW(),1))

一旦成功,我将评估不同的列以识别更改并应用条件格式。寻找公式的修正,或使用更好的方法来突出显示具有相同ID值的上一个上一个条目的更改。

编辑: Excel Snap where Event Date has changed between rows

CSV数据集(行号由Excel创建,但在数据集中显示条目彼此之间不是“近””)

行号,DailyActivitySheetID,已创建,已修改,EventDate,状态
5,2982,11 / 24 / 2018,11 / 25 / 2018,4 / 6/2019,正在等待
1286,2982,11 / 24 / 2018,2 / 21 / 2019,5 / 2/2019,正在等待

1 个答案:

答案 0 :(得分:0)

似乎有一些步骤。

首先,您可能希望创建一个动态范围-命名范围将使最终公式的语法更容易-定义以前的DAS ID的目标区域。有很多网站解释了如何执行此操作(使用OFFSET()INDEX(),其中一个就是https://www.excel-easy.com/examples/dynamic-named-range.html

因此,假设您的数据从A2开始并且没有空白行,则可以在其“引用到”窗口中使用此公式添加一个名为DASIDs的命名范围:

  

= OFFSET(Sheet1!$ A $ 1,0,0,COUNTA(Sheet1!$ A:$ A)-1,1)

请注意,-1将排除您要在其中输入数据的最底部单元格。

接下来,添加第二个命名范围,该范围引用具有以下公式的DASID的最后一行(在本示例中,我将其命名为LastDASID

  

= OFFSET(Sheet1!$ A $ 1,COUNTA(Sheet1!$ A:$ A)-1,0,1,1)

同样,-1防止公式偏离您的数据。

要阅读列表中的最后一项,有一个使用SUMPRODUCT()的著名公式(这是http://www.exceluser.com/formulas/last-item-in-list.htm的解释)。

因此,您可以使用以下公式添加第三个名为MatchedDASIDRow的命名范围:

  

= SUMPRODUCT(MAX(ROW(DASIDs)*(LastDASID = DASIDs)))

因此,最后一步是在规则类型为Use a formula to determine which cells to format的单元格A2中添加条件格式设置规则,然后选择所需的任何格式。规则描述基本上只是前三个步骤的组合:

  

= MatchedDASIDRow = ROW(A2)

只需在数据区域的所有行和列中拖动该条件格式,就可以了。

根据评论更新

我认为您最好使用VBA解决方案,因为您的评论暗示了相当复杂的分析要求。但是,可以使用公式来执行此操作。诀窍将是找到先前数据在何处结束以及新数据在何处开始。假设您以修改日期的顺序输入数据,则可以通过修改日期列来区分范围。

首先获取已修改列的动态范围。我使用了一个名为AllModifiedRange的命名范围,并使用了公式:

  

= OFFSET(Sheet1!$ C $ 1,0,0,COUNTA(Sheet1!$ C:$ C),1)

接下来定义一个公式,该公式标识修改日期在今天之前的最后一行数据。我用公式将这个命名范围PriorModifiedsLastRow称为:

  

= SUMPRODUCT(MAX(ROW(AllModifiedRange)*(TODAY()<> AllModifiedRange)))

这使您可以定义今天之前的DASID范围。命名为PriorDASIDs的范围,其公式为:

  

= OFFSET(Sheet1!$ A $ 1,0,0,PriorModifiedsLastRow,1)

现在,您只需要像以前一样使用公式,即可检查该行是否与最后一行匹配。另一个名为IsPriorLastRow的命名范围,其公式为:

  

= ROW(Sheet1!$ A2)= SUMPRODUCT(MAX(ROW(PriorDASIDs)*(Sheet1!$ A2 = PriorDASIDs)))

但是,这将突出显示最后一个DASID。您将需要进行第二项测试以确定DASID是否存在于今天的修改范围内。

因此,首先定义该范围。我使用了另一个命名范围TodaysModifiedRange和公式:

  

= OFFSET(Sheet1!$ A $ 1,PriorModifiedsLastRow,0,COUNTA(Sheet1!$ A:$ A)-PriorModifiedsLastRow,1)

然后运行测试。命名为IsInTodaysModifieds的范围,其公式为:

  

= NOT(ISNA(MATCH(Sheet1!$ A2,TodaysModifiedRange,0)))

因此,您的条件格式公式仅查看两个测试是否都解析为true:

  

= AND(IsPriorLastRow,IsInTodaysModifieds)

正如我所说,这确实取决于按日期对修改范围进行排序,并且如果您在同一天两次输入相同的DASID,该算法将失败。就我个人而言,我会去VBA,但是如果您希望保留Excel公式并且想要更高程度的复杂性,则需要仔细考虑所有步骤并以结构化的方式开发公式。