2017-09-01 115 views
0

我已經寫了一個簡單的代碼來刪除我的Excel工作表的行,其中的值不是數值,並且沒有值。但是,奇怪的是,當我運行程序時,循環只執行一次。VBA:For循環,不想迭代多次

我該如何解決這個問題,以便我的程序一次刪除符合我兩個條件的行?

Sub foo() 

Dim lRow As Integer 
Dim sht As Worksheet 
Set sht = ActiveWorkbook.ActiveSheet 

lRow = sht.Range("A" & Rows.Count).End(xlUp).Row 

For Each c In Range(sht.Cells(2, 1), sht.Cells(lRow, 1)) 

If (Not IsNumeric(c.Value) Or c.Value = "") Then c.EntireRow.Delete 

Next 

End Sub 
+1

你缺少一個End If語句。 – Luuklag

回答

1

這使用自動篩選在2個步驟中刪除目標行:

Criteria1:="=*"示出了非空字符串,Criteria2:="="顯示空值


Option Explicit 

Public Sub foo() 
    Application.ScreenUpdating = False 
    With ActiveWorkbook.ActiveSheet.UsedRange 

     'Step 1 - Remove all strings and empty values: 
     .AutoFilter field:=1, Criteria1:="=*", Operator:=xlOr, Criteria2:="=" 
     .Offset(1).Resize(.Rows.Count - 1).EntireRow.Delete  'Excludes the header row 

     'Step 2 - Remove all numbers that are not 6 digits in length: 
     .AutoFilter field:=1, Criteria1:="<100000", Operator:=xlOr, Criteria2:=">999999" 
     .Offset(1).Resize(.Rows.Count - 1).EntireRow.Delete  'Excludes the header row 

     .AutoFilter 'Removes filter 
    End With 
    Application.ScreenUpdating = True 
End Sub 

編輯:

上述版本將排除標題行,該標題行將成爲自動篩選行(帶箭頭)

如果沒有標題行,則會執行更多檢查。 例如與此數據:

100,000 
100,001 
100,003 

第一可見的細胞(不包括在所述過濾器)將是100,000其不應該被刪除

如果數據是:

Abc 
100,000 
100,001 
100,003 

第一個可見單元格(未包含在過濾器中)將爲Abc應刪除的內容

因此,第2版(bel低)解決了這個問題:


Option Explicit 

Public Sub foo() 
    Dim rowsToDelete As Range 

    Application.ScreenUpdating = False 
    With ActiveWorkbook.ActiveSheet.UsedRange 

     'Step 1 - Remove all strings and empty values: 
     .AutoFilter Field:=1, Criteria1:="=*", Operator:=xlOr, Criteria2:="=" 
     Set rowsToDelete = CheckFirstCell(.Columns(1)) 
     If Not rowsToDelete Is Nothing Then rowsToDelete.EntireRow.Delete 

     'Step 2 - Remove all numbers that are not 6 digits in length: 
     .AutoFilter Field:=1, Criteria1:="<100000", Operator:=xlOr, Criteria2:=">999999" 
     Set rowsToDelete = CheckFirstCell(.Columns(1)) 
     If Not rowsToDelete Is Nothing Then rowsToDelete.EntireRow.Delete 

     .AutoFilter 'Removes filter 
    End With 
    Application.ScreenUpdating = True 
End Sub 

Private Function CheckFirstCell(ByRef rng As Range) As Range 'It can return Nothing 
    If Not rng Is Nothing Then 
     Dim tmp As Variant 
     With rng 
      .SpecialCells(xlVisible).Select 
      tmp = Selection(1).Value2 
      If Not IsNumeric(tmp) Or (tmp < 100000 Or tmp > 999999) Or Len(tmp) = 0 Then 
       Set CheckFirstCell = .EntireRow 
      End If 
      If Selection.Count > 1 Then 
       If CheckFirstCell Is Nothing Then 
        Set CheckFirstCell = .Offset(1).Resize(.Rows.Count - 1).EntireRow 
       Else 
        Set CheckFirstCell = .EntireRow 
       End If 
      End If 
      .Cells(1).Select 
     End With 
    End If 
End Function 

+0

它的工作原理!謝謝!不過,我仍然有一個小問題:我應該在第一列中有6位數字,但我剛剛發現幾位數字的位數更多或更少。我怎樣才能刪除這些行? – Guillaume

+0

我現在有一個看似完美的數據集。非常感謝你,保羅! – Guillaume

+0

只是最後一個細節(對不起):在您的代碼中,如何避免刪除第一行? – Guillaume