2012-08-04 34 views
1

如何自動刪除行考慮以下(部分)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 
. | .   | . | . 
. | .   | . | . 

在現實中,有超過5.000的行。我需要刪除所有日期在星期六或星期日落下的行。在這個例子中,3月12日和13日(2011-03-12/13)和3月19日和20日是星期六和星期天。我不能只刪除第n行,因爲列表中可能會有幾天缺失(如2011-03-17)。

這可能與公式或VBScript有關嗎?我從來沒有寫過一個VBScript宏(我從來沒有用過它),所以我會很感激一些幫助。

+4

你沒有提到你想要的自動化程度如何。您可以添加公式= WEEKDAY($ B1,2)的列,然後在該列上添加一個過濾器(6 =星期六,7 =星期日),以便交互式過濾並刪除。當然,如果你最終得到一個宏,WEEKDAY仍然是關鍵。 – 2012-08-04 17:49:30

+0

@ JimO'Neil我不知道如何做到這一點,除此之外,我認爲最好不用排序來刪除行。我已經更新了這個例子。請注意,實際上該工作表包含paneldata。我有100家公司(由'id'標識),每個公司都有(相同的)500個日期。我不知道如果在刪除星期六和星期日的行後我將能夠將它重新排序...您的洞察力請:-) – Pr0no 2012-08-04 18:09:57

+2

您沒有排序,您正在過濾,訂單將被保留。如果您使用WEEKDAY公式添加該列,然後打開過濾器以僅顯示值6和7,則可以刪除這些行,其餘部分將保留(在刪除過濾器後)。 – 2012-08-04 18:26:35

回答

1

如果你只需要這樣做一次,這就是我會做的。這應該維持秩序,但如果你真的擔心它,閱讀後的盡頭:

  1. 添加新欄,稱之爲「是週末」。其中,放入=if(WEEKDAY(B2, 2) > 5, 1, 0)。將該公式向下拖動至整個表格。

  2. 篩選列。要做到這一點,選擇整個表格(點擊任一單元格,然後按Ctrl-A),然後

    • 利用Excel 2007及更高版本,轉到數據 - >點擊「過濾器」
    • 在Excel 2003中,去到數據 - >過濾器 - >自動過濾器。
  3. 按照最後一列(Is Weekend)按降序對所有內容進行排序。這應該會將所有周末行組合在一起,而不會改變其他行中的順序。

  4. 在「是星期」欄中刪除1中的所有行。刪除該列。

如果你真的擔心維持秩序,做到上述前,你可以做到以下幾點:

  1. 添加一個名爲「位置」的新列。在第一行中放置1,在第二行中放置2,選擇它們並將其向下拖動到底部,以便每行按升序排列自己的位置編號。
  2. 執行上述過濾。
  3. 完成後,按「位置」列以升序排列所有內容。
+1

比它需要更復雜。 IF並不是必須的,你不必排序任何東西,只需過濾器設置顯示星期六/星期日行,然後刪除。 – 2012-08-05 00:05:11

1

訣竅是你不需要刪除那些行,你需要用0替換它們的C和D的值。這最簡單的做法是在兩個新列C'中使用IF()和WEEKDAY() D'參照C和D.隨意,然後刪除C和D.

1

您可以一次使用array formula來做到這一點。在細胞E2,輸入以下公式(在一行中),並用Ctrl鍵確認 - - 輸入(相對於常規輸入

=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

這個公式是從在Excel: Remove blank cells

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