如何自动删除Excel中的行

考虑以下(部分)Excel工作表:

A | B | C | D ---+-------------+-------+------- id | date | var_a | var_b 1 | 2011-03-12 | 200 | 34.22 1 | 2011-03-13 | 203 | 35.13 1 | 2011-03-14 | 205 | 34.14 1 | 2011-03-15 | 207 | 54.88 1 | 2011-03-16 | 208 | 12.01 1 | 2011-03-18 | 203 | 76.10 1 | 2011-03-19 | 210 | 14.86 1 | 2011-03-20 | 200 | 25.45 . | . | . | . . | . | . | . 2 | 2011-03-12 | 200 | 34.22 2 | 2011-03-13 | 203 | 35.13 2 | 2011-03-14 | 205 | 34.14 2 | 2011-03-15 | 207 | 54.88 2 | 2011-03-16 | 208 | 12.01 2 | 2011-03-18 | 203 | 76.10 2 | 2011-03-19 | 210 | 14.86 2 | 2011-03-20 | 200 | 25.45 . | . | . | . . | . | . | . 

实际上,有超过5000行。 我需要删除所有date在星期六或星期日落下的行。 在这个例子中,3月12日和13日(2011-03-12/13)以及3月19日和20日是周六和周日。 我不能只删除第n行,因为在列表中可能会有几天缺失(如2011-03-17这种情况)。

这可能与公式或VBScript? 我以前从来没有写过一个VBScriptmacros(我从来没有用过它),所以我将不胜感激一些帮助。

如果你只需要做一次,这是我会做的。 这应该保持顺序,但如果你真的担心,阅读post的结尾:

  1. 添加一个新的专栏,称之为“是周末”。 在这里,put =if(WEEKDAY(B2, 2) > 5, 1, 0) 。 将该公式向下拖动到整个表格。

  2. 过滤列。 要做到这一点,select整个表(点击任何表格单元格,然后按Ctrl-A),然后

    • 在Excel 2007+上,转到数据 – >点击“filter”
    • 在Excel 2003上,转到数据 – >筛选 – >自动筛选。
  3. 按最后一列(Is Weekend)按降序对所有内容进行sorting。 这应该把所有的周末行放在一起,而不会改变其他行的顺序。

  4. 在“星期”列中删除1中的所有行。 删除该列。

如果您真的担心维护秩序,那么在执行上述操作之前,您可以执行以下操作:

  1. 添加一个名为“位置”的新列。 在第一行中放置1,在第二行中放置2,select它们并将其向下拖动到底部,使得每一行都有自己的位置编号。
  2. 如上执行过滤。
  3. 完成后,按“位置”列升序排列所有内容。

诀窍是,你不需要删除这些行,你需要用0replaceC和D的值。这是最简单的做法,在两个新列中的IF()和WEEKDAY()完成,C'和D'引用C D.随意删除C和D.

您可以使用数组公式一次性完成此操作。 在单元格E2 ,input以下公式(在一行中),并按CtrlShiftEnter确认 (而不是常规Enter

 =INDEX($A$2:$D$5000, SMALL(IF(WEEKDAY($B$2:$B$5000,2)>5, "", ROW($B$2:$B$5000)-MIN(ROW($B$2:$B$5000))+1), ROW(A1)),COLUMN(A1)) 

5000表示电子表格中的行数。 在此之后,公式应该在它周围用花括号来表示它是一个数组公式。 E2应该有1的值。 然后select单元格E2并将单元格的右下angular拖到右侧,直到覆盖4个单元格。 然后拖动4细胞select的右下angular。 在底部,您将看到包含#NUM!#NUM! ,每个删除的行一个。 您可以按常规方式删除这些文件。

而不是在单元格E2开始,您可以在新单元格的单元格A2中开始。 在这种情况下,您需要将原始图纸名称预先添加到公式中的每个参考中,如OriginalSheet!$A$2

此公式是从Excel中给出的一个适应:删除空白单元格

如果您决定删除行,请确保从最后一行运行VBA代码到第一行。 下面是一段刚刚从内存中写出来的代码,向您展示从底层到顶层运行的想法。

 For i = Selection.Rows.Count To 1 Step -1 If WEEKDAY(Cells(r, 2),2) > 5 Then Selection.Rows(i).EntireRow.Delete End If Next i