2013-05-15 26 views
0

我正在使用以下代碼來刪除excel表中的行。我使用了兩個不同的循環(第一個是For循環,第二個是Do-While循環)。如何在單個marcro子函數中使用多個循環

當我運行宏時,它只執行第一個循環(for循環),並且只刪除行4,6並且不執行第二個循環(Do-While循環)。但如果我運行它第二次然後執行第二循環(Do-While)並刪除行9,10,11,12,13。

我試圖獲得解決方案,在單次運行的宏中運行這兩個循環,但無法得到它。請讓我以單次運行宏的方式運行這兩個循環。

Row No A 
1 
2  Block1 
3  
4  del1 
5  del2 
6  del3 
7 
8  Block2 
9  del1 
10  del2 
11  del3 
12  del5 
13  del5 

代碼中使用:

Sub RowDelete() 
    Dim a 
    Dim b 
    Dim strt 
    Dim endr 

    strt = getrow("Blobk1") 
    endr = getrow("Block2") 


    For a = endr - 2 To strt + 3 Step -1 
     Worksheets("s1").Cells(a, 1).EntireRow.Delete Shift:=xlUp 
    Next 

    b = endr + 2 
    Do While Worksheets("s1").Cells(b, 1).Value <> "" 
     Worksheets("s1").Cells(b, 1).EntireRow.Delete Shift:=xlUp 
    Loop 
End Sub 

Function Getrow(str) 
    Dim a 
    Dim b 
    For a = 1 To 50 
     If Worksheets("s1").Cells(a, 1).Value = str Then 
      b = a 
      Exit For 
     End If 
    Next 
    getrow = b 
End Function 
+0

在兩個循環之間添加'endr = getrow(「Block2」)'。 –

+0

您是否嘗試刪除列「A Block1」和「Block2」以外的列A中的每一行? –

+0

@ David:謝謝大衛,即使在今天,當我再次檢查代碼時,我發現同一個我錯過了「endr = getrow(」Block2「)」。因爲執行for循環後,「endr」的值會發生變化。 –

回答

0

我覺得有一個循環的簡單方法如下:

Sub DeleteRows() 
Dim rw As Long 
    For rw = Range("A1048576").End(xlUp).Row To 2 Step -1 
     If Cells(rw, 1) <> vbNullString And Cells(rw, 1) <> "Block1" And Cells(rw, 1) <> "Block2" Then 
      Cells(rw, 1).EntireRow.Delete Shift:=xlUp 
     End If 
    Next rw 
End Sub 

就更簡單了,如果你想刪除所有列A和剛剛離開Block1Block2那麼你可以使用:

Sub CleanUpColumn() 
    Columns("A:A").ClearContents 
    Range("A2") = "Block1" 
    Range("A4") = "Block2" 
End Sub 
1

問題是,你已經在endr變量獲得該行的時候它獲取到Do ... While循環不再存在。

這是因爲前面的循環中的刪除操作已更改工作表的結構,因此「塊2」不再位於由endr變量保存的行號中。

您可以根據需要在循環之間重置此值。

此外,使用Application.Match函數,而不是該自定義函數來獲取行號。

Sub RowDelete() 
'## Dimension your variables properly ##' 
Dim a As Long 
Dim b As Long 
Dim strt As Long 
Dim endr As Long 

'## Add some new variables ##' 
Dim ws As Worksheet 
Dim rangeLook As Range 


Set ws = Worksheets("s1") 

'## this is the range you will look for your blocks ##' 
Set rangeLook = ws.Range("A1:A50") 

'## USE THE MATCH FUNCTION INSTEAD OF CUSTOM FUNCTION TO GET ROW NUMBER ## 
strt = Application.Match("Block1", rangeLook, False) 
endr = Application.Match("Block2", rangeLook, False) 


For a = endr - 2 To strt + 2 Step -1 
    ws.Cells(a, 1).EntireRow.Delete 
Next 

'## RESET THIS VARIABLE SINCE THE ROW HAS CHANGED ##' 
endr = Application.Match("Block2", rangeLook, False) 

b = endr + 1 

Do While Worksheets("s1").Cells(b, 1).Value <> "" 
    ws.Cells(b, 1).EntireRow.Delete 
Loop 

End Sub 
相關問題