2014-01-14 65 views
1

如果列中的單元格不是數字,我試圖編寫/查找運行時刪除單元格中的值的宏。 IE刪除列B中的所有單元格如果找到一個字符串。我有這個腳本來刪除空行。 只是試圖重新編寫,以便它可以刪除基於這些condiitions如果字符串中包含字符串,則清除一列值中的單元格

Sub RemoveRows() 

Dim lastrow As Long 
Dim ISEmpty As Long 

lastrow = Application.CountA(Range("A:XFD")) 

Range("A1").Select 


Do While ActiveCell.Row < lastrow 

ISEmpty = Application.CountA(ActiveCell.EntireRow) 


If ISEmpty = 0 Then 
ActiveCell.EntireRow.Delete 
Else 
ActiveCell.Offset(1, 0).Select 
End If 

Loop 

End Sub 

回答

1

該代碼從列B中的最後一個單元格向後迭代,並使用IsNumeric()函數檢查單元格中的值是否爲數字。

如果該值不是數字,則會刪除整行。

注意:使用循環時需要向後循環(即從最後一行到第一個循環),因爲索引在每次刪除一行時都會發生移位。因此,爲避免跳過某些行,需要迭代。

Sub KeepOnlyNumbers() 
Application.ScreenUpdating = False 

    Dim ws As Worksheet 
    Set ws = Sheets("Sheet1") 

    Dim i As Long 
    ' iterating backwards (from last row to first to keep the logic flow) 
    For i = ws.Range("B" & ws.Rows.Count).End(xlUp).Row To 1 Step -1 
     ' check whether the value is numeric 
     If Not IsNumeric(Range("B" & i)) Then 
      ' if not numeric then clear the cells content 
      Range("B" & i).ClearContents 
     End If 
    Next i 

Application.ScreenUpdating = True 
End Sub 
+0

我不想刪除的行,只是明確了文本 –

+0

當遍歷向後@SleepParalysis好吧,我已經編輯了答案 – 2014-01-14 15:20:14

+0

是即使在我明確將日期格式化爲數字(因爲它們是01-Jan-2010)之前,我的所有日​​期都會被刪除。 –

0

您可以使用IsNumeric評估對象是否可以作爲一個數來評估的行。所以你可以添加:

If Not IsNumeric(ActiveCell) Then 
ActiveCell.EntireRow.Delete 
Else 
ActiveCell.Offset(1, 0).Select 
End If 

你的Do While循環,它應該做你想做的。我沒有測試過這個;讓我知道如果你得到一個錯誤。

+0

不會做運算想要的東西,因爲你必須刪除行 – 2014-01-14 14:32:28

0

即使刪除行,您也不必向後迭代,您可以在聯合範圍內執行聯合並調用delete/clear。

Sub UnionOnCondition() 

    Dim usedColumnB 
    Set usedColumnB = Intersect(ActiveSheet.UsedRange, _ 
           ActiveSheet.Columns("b")) 

    If usedColumnB Is Nothing Then _ 
     Exit Sub 

    Dim result: Set result = Nothing 
    Dim cellObject 

    For Each cellObject In usedColumnB 

     ' skip blanks, formulas, dates, numbers 
     If cellObject = "" Or _ 
      cellObject.HasFormula Or _ 
      IsDate(cellObject) Or _ 
      IsNumeric(cellObject) Then GoTo continue 

     If result Is Nothing Then 
      Set result = cellObject.EntireRow 
     Else 
      Set result = Union(result, cellObject.EntireRow) 
     End If 

continue: 
    Next 

    If Not result Is Nothing Then _ 
     result.Select ' result.Clear or result.Delete 

End Sub 
相關問題