2012-04-26 127 views
0

我正在尋找一種算法,我沒有VBA知識來編寫腳本。所以我卡住了。這不是通過努力嘗試,因爲我已經放棄了(加上,這一點的代碼是我的更大的VBA代碼的最後剩餘部分)我只是缺乏知識/經驗/技能...VBA - 搜索並刪除重複項

基本上,我有一個Excel文件。在這個文件中是一張表單「sheet1」。 Sheet1包含許多行數據。 sheet1中包含的行數可以從1到n不等。有時,我可能有50個,而其他時間我可能有30個,等等。這本書的佈局是一致的,即我在A列中有代碼來標識我的數據庫中的產品。

我想這樣做是:

掃描片空行(由於生成的工作簿的路上,我有時有空白行),並刪除它們。這些空白行有時在數據行之間有數據,而在其他時間可能會在數據表末尾。

2.刪除空白行後,找到最後使用的行。將它存儲到一個變量中。我已經發現這段代碼可用於這樣做:

mylastrow = myBook.Sheets("Results").Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

3.從(2)中,我想在A中的產品代碼(x,其中x = mylastrow確定的行開始)並找到它的任何其他事件(在A列中)。如果找到任何內容,請刪除與其相對應的整行。重要的是,這個循環必須相反。例如,假設mylastrow = 40,循環將需要從A40開始,並且在下一次迭代時執行A39(如果某行已被刪除,則爲38)。這是因爲對於任何產品編號,行中的相應數據都包含更多數據(由於生成工作表的方式)。基本上最接近最後一行的條目是最近的條目。

希望我能夠正確解釋原位。但如果不是,你願意接受我的挑戰(我的負擔?),我將非常感激。

QF

回答

1

開發知識和技能的唯一辦法是在那裏得到的和代碼!我確信有人可能會進來給你寫整個程序,但是同時這些資源應該給你自己做的工具。

首先,檢查方法here刪除空白行。它依賴於「選擇」的範圍內,因此,您可以手動選擇紙張的所有單元格,然後運行宏,或者替換爲以下:

Dim r as range 
set r = Sheet1.Cells 'now use r instead of Selection 

OR(甚至更好)使用你的代碼找到最後使用的行並將第1行的範圍設置爲「mylastrow」。

接下來,從「mylastrow」開始,將列A中的值添加到Dictionary對象(示例here)。你可以使用一個行計數器從「mylastrow」遞減到1.下面是一個如何工作的例子。關鍵假設在第一列(「A」)。

Dim dict As Object 
Dim rowCount As Long 
Dim strVal As String 

Set dict = CreateObject("Scripting.Dictionary") 

rowCount = Sheet1.Range("A1").CurrentRegion.Rows.Count 

Do While rowCount > 1 
    strVal = Sheet1.Cells(rowCount, 1).Value2 

    If dict.exists(strVal) Then 
    Sheet1.Rows(rowCount).EntireRow.Delete 
    Else 
    dict.Add strVal, 0 
    End If 

    rowCount = rowCount - 1 
Loop 

Set dict = Nothing 

前: Before 後: After

注意,因爲我們停止了第一排還未觸碰時rowCount爲1(假設有一個頭)。

+0

謝謝 - 我會給這個*另一個*去。 – 2012-04-30 14:09:43

+0

我沒有它......我會在這裏粘貼我的代碼,但我沒有空間。有效地,我有一個For next循環進行。在其中,我將當前產品代碼分配給一個變量,然後開始另一個與Next之前的循環相同的循環,只有這一次我循環訪問列中其他代碼的值並刪除所有匹配。這兩個循環迭代了我現在唯一的麻煩是循環刪除了幾乎所有的代碼,但是三個(儘管存在更多的唯一值)。卡住... – 2012-04-30 15:57:37

+0

這可能是因爲您用來迭代的計數器沒有從行刪除中正確更新。這就是爲什麼我建議字典的方法。在刪除/插入行時,「Do While」通常比「For」更好,因爲您可能需要增加/減少兩次才能獲得正確的偏移量。我的猜測是,當你返回到外部的'For'時,你的增量變量將會到達下一個行,在這一點上將是空的(由於刪除),並正確地更新該變量,你需要使用'While'因爲'For'總是將增量var重置爲下一步。 – Zairja 2012-04-30 17:46:03