David的工作表仅包含两列:日期和每个日期的投资组合值。该工作表从1999年1月至今的每个交易日都有行。 David需要删除所有行,除了每个月最后一个交易日的行。他尝试过滤,但这没有帮助,因此他对删除不需要的行的最佳方法感到困惑。

在提供解决此问题的方法时,我要重点关注的问题的关键之一是David表示他的数据“每个交易日都有行”。对我来说,这意味着某些日期(非交易日)未包含在他的数据中。这很关键,因为这意味着我们不必提出一种解决方案,该解决方案可以在决定是否保留一行之前确定日期是否为交易日。

这实际上使工作容易得多。现在,我们可以从A列中的日期中简单地找到那些实际包含任何给定月份中的最后(或最高)日期的行。我将首先关注依赖于助手列的手动方法。由于David说他的数据仅由A列(日期)和B列(值)组成,因此我建议使用C列作为帮助者列。 (我还要假设第1行中有列标题,而实际数据从第2行开始。)

确保对数据进行排序,以便日期按升序排列,将以下公式放入单元格C2中:

=IF(DAY(A3)<DAY(A2),"EOM","X")

对于所有数据,将该公式复制下来,就可以完成了。现在,您可以根据需要使用基于列C的过滤。如果进行过滤,以便仅显示包含“ EOM”的行,那么您将获得每个月的最终值。如果进行筛选,以便仅显示包含“ X”的行,则可以删除这些行,删除筛选器,并且数据中仅包含月末值的行。

通常,在C列中可以使用很多公式,而不是我建议的公式。我之所以提出这一建议,是因为它进行了一个非常简单的比较,该比较将始终是可检验的,即当前值之后的行中一天的价值是否“下降”。在每种可能的情况下,这只会在一个月月底出现。因此,该行标记为“ EOM”,其余标记为“ X”。

我应该指出,如果您选择使用其他公式,请确保该公式不会测试A列中的日期是否是该月的最后一天。为什么?因为可能并非如此(请记住,在David的数据中,A列包含交易日的日期,所以一个月的最后一个交易日很可能不会落在该月的最后一天。 (换句话说,从定义上讲,周末和假期不包括在David的数据中。)

如果您使用的是Office 365(或最近使用的Microsoft,就是Microsoft 365),则还有一种方法可以只提取月末日期及其值。假设您的数据在A2:B5000中。 (请记住,A1:B1包含列标题。)将以下公式放入单元格E2中:

=FILTER(A2:B5000,DAY(A3:A5001)<DAY(A2:A5000),1)

而已;一个单元格中的单个公式。您可能必须格式化E列才能正确显示日期,但是FILTER函数的这种用法进行了已经讨论过的相同比较,并且仅提取月末日期和值。 (如果考虑一下,这会非常巧妙。)但是请记住,它仅在Office 365中有效;请记住,它仅适用于Office 365。它不适用于Excel 2019,Excel 2016或该程序的任何早期版本。

如果您更喜欢基于宏的方法,那么下面的简短宏将可以解决问题:

Sub DelRows()

Dim LastRow As Long     Dim J As Long

LastRow = Cells(Rows.Count, "A").End(xlUp).Row     LastRow = LastRow - 1     For J = LastRow To 2 Step -1         If Month(Cells(J, 1)) = Month(Cells(J + 1, 1)) Then             Rows(J).EntireRow.Delete         End If     Next J End Sub

该宏确定工作表中的最后一行(存储在LastRow变量中),然后使用For …​ Next循环向后逐步浏览这些行。如果当前行的月份等于下一行的月份,则删除该行。请注意,宏会在跳入For …​ Next循环之前递减LastRow。这样做是因为假设数据的最后一行将始终是数据的最后交易日,因此它始终与精简后的数据保持一致。

该宏运行起来可能会很慢,因为它正在一张一张地删除工作表中的大多数行。但是,完成后,您将只剩下月底数据。

最后一点-除FILTER函数外,本技巧中使用的方法对您的数据具有破坏性。使用它们时,工作表中的数据将永远丢失。这意味着在对原始数据副本以外的任何内容运行它们之前,您应该三思而后行(或三次)。

注意:

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

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

本提示(13768)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。