2016-04-26 25 views
2

問題:如果0或「」刪除行:代碼工作,但很慢

隨着錄音機和在這個論壇上的幫助,我做了一個代碼(一個按鈕)。列'我'已經(從第25行)'個人電腦'或一個號碼。我的宏查找Pcs並將其更改爲「」,而宏將刪除「」和0。填充細胞的長度是可變的,所以我做了500個'結束',但它從來沒有達到過。如果我運行宏,它的工作原理,並做了工作,但需要很長,尤其是因爲它有做500線..

Sub Fix() 

Dim intEnd As Integer 
Range("M1").Select 
Cells.Replace What:="pcs", Replacement:="", LookAt:=xlPart, SearchOrder _ 
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False 
intEnd = 500 

Range("I25").Select 

Do Until ActiveCell.Row = intEnd 

If Int(ActiveCell.Value) = 0 Then 
Range(ActiveCell.Row & ":" & ActiveCell.Row).Delete 
intEnd = intEnd - 1 
Else 
ActiveCell.Offset(1, 0).Select 
End If 

Loop 
End sub 

我很高興,我能做出這樣的宏與論壇的幫助,錄音機,但現在我卡在加速,沒有真正的線索從哪裏開始。有人有小費嗎?

謝謝,如果需要更多信息或努力,請讓我知道。

+0

關閉計算和屏幕更新。 –

+0

也重新編寫代碼,以便它不會「選擇」每個單元格。 –

+0

@ScottCraner:謝謝,我嘗試過[這個SO主題](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros),但會再次審查! – bart1701

回答

1

試試這個:

Sub fix3() 


Dim intEnd As Long 
Dim ws As Worksheet 
Dim i As Long 

Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 
Application.EnableEvents = False 

On Error GoTo getout 
Set ws = Sheets("Sheet1") 'Change to your sheet 
ws.Cells.Replace What:="pcs", Replacement:="", LookAt:=xlPart, SearchOrder _ 
    :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False 

intEnd = ws.Range("I" & ws.Rows.Count).End(xlUp).row 

For i = intEnd To 25 
    If Int(ws.Cells(i, "I").Value) = 0 Then 
     ws.Rows(i).Delete 
    End If 
Next i 
Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 
Application.EnableEvents = True 
Exit Sub 

getout: 
Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 
Application.EnableEvents = True 
End Sub 
+0

關於切換自動計算的好奇心問題。所以你關掉了自動計算...我喜歡它。你用一些代碼來操作你的任意一百萬個數據單元,最後你將自動計算重新開啓。當它重新開啓時,它會自動進行計算?或者您需要在單元格中執行某些操作以觸發自動發生? –

+0

你知道嗎,我不知道這個問題的答案。我會認爲它會等待下一次計算是有保證的。 –

+0

可能需要在應用程序.calc上或任何VBA代碼末尾。 –

3

爲了做一個快速的使用能這樣,你可以這樣做:

Sub DelMe() 
    Dim i As Long, x As Variant, y As Range 
    With Sheets("Sheet1") 
    x = .Range("I1", .Cells(Rows.Count, 9).End(xlUp)).Value 
    If UBound(x) < 25 Then Exit Sub 
    For i = 25 To UBound(x) 
     If x(i, 1) = 0 Or x(i, 1) = "" Or InStr(1, x(i, 1), "pcs", vbTextCompare) > 0 Then 
     If y Is Nothing Then 
      Set y = .Rows(i) 
     Else 
      Set y = Union(y, .Rows(i)) 
     End If 
     End If 
    Next 
    y.EntireRow.Delete xlUp 
    End With 
End Sub 

它簡單地刪除所有範圍(要被刪除)一旦。

如果您有任何疑問,只需詢問:)

+0

難以upvote陣列。 – findwindow

+0

感謝您的努力,我得到了「運行時錯誤91」,「塊變量未設置的對象變量」.. y.EntireRow.Delete xlUp是他們說的問題嗎? 任何意見?不是很熟練的陣列 – bart1701

+0

對不起... ...'Set y = Intersect(y,.Rows(i))'應該是'Set y = Union(y,.Rows(i))'...大錯 –