Board logo

標題: Delete問題 [打印本頁]

作者: color790    時間: 2013-11-19 10:23     標題: Delete問題

Hi~程式如下, 請問不知道為什麼執行過一次, 仍然會有清不乾淨的狀況, 資料大約1~3萬筆, 是哪裡出了問題? 或是先進有比較好的方法可以指導一下:'(
Sub jj()
m = Sheets("Temp1").Range("A1").CurrentRegion.Rows.Count
For i = 2 To m
If Sheets("Temp1").Cells(i, 14).Value = "abc" Then Rows(i).Delete Shift:=xlUp
Next
End Sub
作者: Hsieh    時間: 2013-11-19 11:05

回復 1# color790


   For i = m To 2 step -1
作者: color790    時間: 2013-11-19 13:21

回復 2# Hsieh

謝謝回復, 請問為什麼會有這樣的差別呢?
作者: owen06    時間: 2013-11-19 13:37

回復 3# color790


i=2 to m,從上往下刪,會有儲存格上移的情形,
假如(3,14)跟(4,14)都是abc,而i執行到3時,會先把(3,14)刪掉,然後原本的(4,14)取代成(3,14),
可是此時i已經變成4了,他就不會再去刪(3,14)的那個abc了,就會發生疏漏的情形。
所以要用倒回來的方式。
作者: GBKEE    時間: 2013-11-19 13:42

回復 3# color790
這問題論壇有討論到
  1. Option Explicit
  2. Sub Ex()
  3.     Dim i
  4.     For i = 1 To 10
  5.         Cells(i, "a").Select   '視窗調整成圖示,看看位置變化
  6.         Cells(i, "a").Delete
  7.     Next
  8. End Sub
複製代碼
[attach]16772[/attach]
作者: color790    時間: 2013-11-19 15:11

回復 4# owen06

獲益良多, 感謝2位的回覆, 謝謝~~~
作者: luhpro    時間: 2013-11-19 22:25

本帖最後由 luhpro 於 2013-11-19 22:27 編輯

回復 6# color790

這邊提出一點 : 其實要從上到下依序刪列也是沒問題的,
只需要配合 Do...While 並於刪列時不做遞增列號的動作即可,
甚至這樣的方式連資料末列都不用預先計算是第幾列,
且刪完當下即可透過 (列號減一) 得知剩餘資料筆數.

Sub jj()
i = 2
With Sheets("Temp1")
  Do While .Cells(i, 1) <> ""
    If .Cells(i, 14) = "abc" Then
      Rows(i).Delete Shift:=xlUp
    Else
      i = i + 1
    End If
  Loop
End With
Msgbox "經過篩選, 剩餘資料共 " & i-1 & " 筆"
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)