2016-01-08 53 views
0

我所有的數據都在「D」列中。循環在單元格中開始並刪除列中的下一個600

我想開始一個特定的單元格(即D249),然後選擇下一個600並刪除它們(即D250-D850)。然後,我想跳過下一個(即D851)並刪除下面的那個。我想這樣做直到它結束,這就像D19000。我想我需要使用while循環來檢查數據是否出現在我正在查看的單元格中。

這是我到目前爲止的代碼:

Sub delete600rows() 
'delete600rows Macro 
'Keyboard Shortcut: Ctrl+a 

ActiveSheet.Range("D249").Select 
While LEN()>0 

Range("D249:D848").Select 
Selection.Delete Shift:=xlUp 

End Sub 

我怎樣寫while循環的條件以及如何使其應用範圍選擇工作,我希望它的方式?

回答

0

下一個應該工作長大。我沒有廣泛測試它。我提出了一個選項,您可以選擇要從哪個單元格開始,以及要刪除多少行。如果這些都是標準就很難在代碼編寫他們:)

Sub deleteNumOfrows() 
Dim myBook As Workbook 
Dim mySheet As Worksheet 
Dim startCell As Range 
Dim numOfRowsToDelete As Long 
Dim lastRow As Long 
Dim i As Long 

'Set your workbook - in this version I select the active workbook 
Set myBook = ActiveWorkbook 

'Set up your worksheet - In this version I select the active worksheet 
Set mySheet = myBook.ActiveSheet 

'Select the cell you want to start 
Set startCell = Application.InputBox(prompt:="Select a cell", Type:=8) 

'Input how many rows you want to delete - If it is always 600 just set it to that 
numOfRowsToDelete = Application.InputBox(prompt:="Number of rows to delete each time") 

'Find the last row data exists in the column of the startCell 
lastRow = mySheet.Cells(mySheet.Rows.Count, startCell.Column).End(xlUp).Row 

'Delete the rows you do not want 
i = startCell.Row 'Start from the row of the startCell 

While i <= lastRow 'Repeat while you haven't reached the last row 
    'mySheet.Rows((i + 1) & ":" & (i + numOfRowsToDelete)).EntireRow.Delete 'Delete the rows 
    mySheet.Range(Cells((i + 1), startCell.Column), Cells((i + numOfRowsToDelete), startCell.Column)).Delete Shift:=xlUp 'Delete the range you dont want 
    i = i + 1 'Next row 
    lastRow = lastRow - numOfRowsToDelete 'Adjust lastRow 
Wend 

End Sub 
+0

嘿!這實際上運作良好!唯一的問題是我認爲我們需要做一種不同的刪除方式,因爲D行在A行,B行,C行和E行之前結束。 – user2971806

+0

我意識到我誤解了你的請求。我只是修改了代碼,所以它只刪除了你想要的列中的單元格:) – Genie

+0

我仍然遇到問題,它過早地結束D列,而其他的只是繼續。儘管新的代碼,其他列繼續到19,000+。在您發佈的原始代碼中,其他列以1000左右結尾。 – user2971806

0

(對不起,評論對我來說還是不可能的。)

我有點困惑,我不得不說:爲什麼你只想要刪除600行,如果你可以刪除一切從細胞D249向下?你在這個專欄有什麼要找的嗎?這有什麼用處?

否則將有可能檢查的最後一行:

Dim LastRow as Long 
LastRow = ActiveWorkbook.ActiveSheet.Cells(ActiveWorkbook.ActiveSheet.Rows.Count, "D").End(xlUp).Row 

然後你可以只刪除工作簿中的一切,從D249到最後充滿一行。

如果我錯了,真的會有更多的澄清neccessairy。

+0

本質上,我們在「D」列中有很多無關的數據。例如,在21.1和21.2之間,我們有600個數據點。我們希望以.10計數,所以我們希望保留21.1和21.2和21.3,但我們希望擺脫那些值之間的這600個數據點。 – user2971806

+0

我意識到使用「Do Until」循環會更容易。這裏是新代碼,但我仍然不確定如何選擇剛剛刪除下一個600單元格的範圍。 範圍(「D249」)。選擇 直到IsEmpty(ActiveCell) ActiveCell.Offset(1,0)。選擇 範圍。( 「D249:D848」)選擇 Selection.Delete轉變:= xlUp ActiveCell.Offset(1,0)。選擇 循環 結束小組 – user2971806

+0

所以要刪除250-850然後離開851工作簿然後刪除852-1452在工作簿中保留1453等? – Kathara

0

你算使用for循環,並添加501例如,cyntax是關閉的,但我在PHP

start = 249 
len = 500 

for (i=0;i=100;i++) { 
    from = (i*(len+1)+start 
    to = from+len 
    range.select("D" & from & ":D" & to 
    if (range.select("D" & from).value = ""){ 
     break 
    } 
} 
0

試試這個代碼:

Sub test() 

Dim LR As Long 
Dim Rng As Range 

LR = Range("D" & Rows.Count).End(xlUp).Row 
Debug.Print LR 
If LR < 851 Then 
    Set Rng = Range("D250:D850") 
Else 
    For i = 249 To LR Step 601 
    j = j + 1 
    If Rng Is Nothing Then 
    Set Rng = Range(Cells(i + j, "D"), Cells(i + j + 600, "D")) 
    Else 
    Set Rng = Union(Rng, Range(Cells(i + j, "D"), Cells(i + j + 600, "D"))) 
    End If 
    Next 
End If 

Rng.Delete xlUp 
End Sub 

如果你想刪除整個行與Rng.EntireRow.Delete取代Rng.Delete xlUp

0

這更多的是一種理念,爲您比正確的代碼適應:

Dim StartRow As Integer 
StartRow = 249 
Dim DelRow As Integer 
DelRow = 600 
Dim LastRow AS Integer 
LastRow = ActiveDocument.ActiveSheet.Cells(ActiveDocument.ActiveSheet.Rows.count, "a").End(xlUp).Row 

If Not (LastRow + 1) Then 

'I don't know if this will work, if you can test for the end of the table 
'differently, I believe this would be better (maybe even "Do Until (LastRow + 1)") 

    ActiveDocument.ActiveSheet.Range("D" & (StartRow + 1):"D" & (StartRow + 1 + DelRow).Delete 
    StartRow = StartRow + 1 
End If 

像這樣的東西可以工作,你總是在同一時間刪除600行,那麼你要保留下。因此,刪除範圍250-850後,行250現在包含行851中的內容,然後刪除它。

相關問題