2017-05-03 246 views
0

我仍在進入VBA,目前我正在嘗試執行以下操作: - 根據存儲在字典中的值刪除Excel工作表中的行。基於Excel中的字典值在Excel中刪除行VBA

我有這樣的代碼:

For Each Key In dict.Keys 
    i = Key 
    Cells.Rows(i).Delete 
Next 

那裏之前,我已經填充了字典。這個想法是,「密鑰」存儲了存儲特定值的所有行號,例如「1」。

隨着每個我想要刪除存儲在字典中的所有行,但是一旦您在Excel中刪除一行數字更改。例如,字典中的第一個存儲值是5,因此每個將刪除第5行。字典中的第二個值是10,現在當for每個嘗試刪除第10行時,它將刪除第10行原始文件曾經是第11行。基本上,每個都無法刪除正確的行。

正如我所說,我是VBA的新手,我甚至不確定這是否是正確的方式來做到這一點,或者在這種情況下有比字典更好的東西。我期待聽到您的意見和建議。

預先感謝您!

更新:由Ambie和sktneer解決。檢查答案。

+3

排序字典降序或從最後一行開始。這樣,行號在刪除過程中不會改變。 –

+0

如何排序? – VBABegginer

+1

在代碼表頂部寫入'Option Explicit'。然後聲明所有變量,找到正確的數據類型。選擇「密鑰」並點擊F1。你會被告知這是一個保留給VBA的單詞。所以,最好不要將它用於你自己的目的。最後,不要用'For Each'開始你的實驗。首先構建一個「For ... Next」循環。 – Variatus

回答

1

我不知道我會與Dictionary打擾。畢竟,Range是一個集合,所以也許只是考慮將所有目標行放入一個範圍,然後在該範圍內運行「批量」刪除。它比用循環行刪除要快得多:

Dim delRng As Range, srcRng As Range, cell As Range 

'Loop through the range containing your criterion test 
With Sheet1 
    Set srcRng = .Range(.Cells(1, "A"), .Cells(.Rows.Count, "A").End(xlUp)) 
End With 

For Each cell In srcRng.Cells 
    If cell.Value2 = 1 Then 'change to your criterion 
     'It's a hit so add the cell to our delete range 
     If delRng Is Nothing Then 
      Set delRng = cell 
     Else 
      Set delRng = Union(delRng, cell) 
     End If 
    End If 
Next 

'Delete the rows 
If Not delRng Is Nothing Then delRng.EntireRow.Delete 
+0

有沒有辦法讓它更具動感?目前我有38萬行,但這個數字可能會有所不同。 – VBABegginer

+0

當然。你只需要澄清你定義範圍的規則。例如,如果您希望範圍爲「A1」,以便在列「A」中結束數據的底部,則可以使用類似於我編輯的答案的內容。 – Ambie

+0

太棒了!謝謝:)我現在正在測試這兩個選項,我希望在問題解決後更新問題! – VBABegginer

2

你可以試試這樣的事情...

Dim rng As Range 
Dim it 

For Each it In dict.keys 
    If rng Is Nothing Then 
     Set rng = Range("A" & it) 
    Else 
     Set rng = Union(rng, Range("A" & it)) 
    End If 
Next it 
If Not rng Is Nothing Then 
    rng.EntireRow.Delete 
End If 
End Sub 
+0

謝謝,男人:)它工作完美,但我想我有太多行的方式。腳本運行了將近5分鐘 – VBABegginer

+0

不客氣。那麼,選擇的答案如何不同且更快? :) – sktneer

+0

仍在工作:D我會更新它,如果不是更快。在這個問題本身,我寫道你們都解決了它。 – VBABegginer