考虑以下(部分)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行。我需要删除日期在星期六或星期日的所有行。在该示例中,3月12日和13日(2011-03-12/13)
以及3月19日和20日是星期六和星期日。我不能只删除每一行,因为列表中可能有几天丢失(就像2011-03-17
的情况一样)。
这可能与公式或VBScript有关吗?我之前从未编写过VBScript宏(我从来没有使用它)所以我希望得到一些帮助。
答案 0 :(得分:1)
诀窍是你不需要删除那些行,你需要将它们的C和D值替换为0.这是在两个新列C'和D中使用IF()和WEEKDAY()最简单的方法。 '引用C和D.随意删除C和D.
答案 1 :(得分:1)
如果你只需要做一次,这就是我要做的。这应该保留顺序,但如果你真的担心它,请阅读帖子的结尾:
添加新列,将其命名为“Is Weekend”。在其中,放=if(WEEKDAY(B2, 2) > 5, 1, 0)
。将该公式拖拽整个表格。
过滤列。为此,选择整个表格(单击任何表格单元格然后按Ctrl-A),然后选择
按降序排列最后一列(Is Weekend)的所有内容。这应该将所有周末行放在一起而不改变其他行之间的顺序。
在“Is Weeked”列中删除1的所有行。删除该列。
如果您真的担心保留订单,在执行上述操作之前,您可以执行以下操作:
答案 2 :(得分:1)
您可以使用array formula一次性完成此操作。在单元格E2
中,输入以下公式(在一行上),并使用 Ctrl - Shift - 输入进行确认(相反)到常规输入)
=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细胞选择的右下角一直向下拖动。在底部,您将看到包含#NUM!
的行,每个已删除的行一行。您可以按常规方式删除它们。
您可以从新工作表的单元格E2
开始,而不是从单元格A2
开始。在这种情况下,您需要将原始工作表名称添加到公式中的每个参考,如OriginalSheet!$A$2
答案 3 :(得分: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