我正在尝试建立一个条件格式设置规则,其中当前行突出显示电子表格中前一行条目的更改(一段时间内可能会有多个修订)。
经过研究,我发现以下公式返回了具有相同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,正在等待
答案 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公式并且想要更高程度的复杂性,则需要仔细考虑所有步骤并以结构化的方式开发公式。