1

考虑以下(部分)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
.  |  .          |  .    |  .
.  |  .          |  .    |  .

实际上,有超过 5.000 行。我需要删除日期在星期六或星期日的所有行。在示例中,3 月 12 日和 13 日(2011-03-12/13)以及 3 月 19 日和 20 日是星期六和星期日。我不能只删除每第 n 行,因为列表中可能缺少几天(就像这里的情况一样2011-03-17)。

这可能与公式或VBScript有关吗?我以前从未编写过 VBScript 宏(我从未使用过它),因此我将不胜感激。

4

4 回答 4

1

诀窍是您不需要删除这些行,您需要将 C 和 D 的值替换为 0。这最容易在两个新列 C' 和 D' 引用 C 中使用 IF() 和 WEEKDAY() 完成和 D. 随意删除 C 和 D。

于 2012-08-04T21:47:12.130 回答
1

如果你只需要这样做一次,这就是我会做的。这应该保留顺序,但如果您真的担心它,请阅读帖子的最后:

  1. 添加一个新列,将其命名为“Is Weekend”。在里面,放=if(WEEKDAY(B2, 2) > 5, 1, 0)。向下拖动整个表格的公式。

  2. 过滤列。为此,请选择整个表格(单击任何表格单元格,然后按 Ctrl-A),然后

    • 在 Excel 2007+ 上,转到数据-> 单击“过滤器”
    • 在 Excel 2003 上,转到数据->过滤器->自动过滤器。
  3. 按最后一列(是周末)以降序对所有内容进行排序。这应该将所有周末行放在一起,而不会改变其他行之间的顺序。

  4. 删除“Is Weeked”列中所有带 1 的行。删除该列。

如果你真的很担心维护秩序,在你做上述之前,你可以做以下事情:

  1. 添加一个名为“位置”的新列。将 1 放在第一行,将 2 放在第二行,选择它们并将其向下拖动到底部,这样每一行都有自己的位置编号,按递增顺序排列。
  2. 执行如上过滤。
  3. 完成后,按“位置”列按升序对所有内容进行排序。
于 2012-08-04T21:58:42.963 回答
1

您可以使用数组公式一次性完成此操作。在单元格E2中,输入以下公式(一行),并用Ctrl- Shift-确认Enter(与常规相反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。然后选择单元格并将单元格E2的右下角向右拖动,直到覆盖4个单元格。然后将 4-cell-selection 的右下角一直向下拖动。在底部,您将看到包含 的行#NUM!,每个删除的行对应一个。您可以以常规方式删除它们。

E2您可以从新工作表的单元格开始,而不是从单元格开始A2。在这种情况下,您需要将原始工作表名称添加到公式中的每个引用,如OriginalSheet!$A$2

此公式是对 Excel 中给出的公式的改编:删除空白单元格

于 2012-08-05T02:00:56.613 回答
1

如果您决定删除行,请确保从最后一行到第一行运行 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
于 2012-08-05T17:50:06.347 回答