2013-03-22 40 views
0

我在Excell 2010的數據庫中工作,發現很多重複的名字。我試圖製作一個VBA腳本來解決這個問題,但它只是以無限循環結束。當它打到一個空白單元格時,我希望它停下來。繼承人的代碼,我想出了如何在找到空白單元格時停止它?

Sub excluirDuplicatas() 

    Dim lngCont As Long 
    Dim lngLinhas As Long 
    Dim rngNom1 As Range 
    Dim rngNom2 As Range 

lngCont = 0 
lngLinhas = Cells.SpecialCells(xlCellTypeLastCell).Row 

While lngCont <= lngLinhas 

Set rngNom1 = ActiveCell 
Set rngNom2 = rngNom1.Offset(1, 0) 

While rngNom1.Value = rngNom2.Value And rngNom2 <> lastRow 


rngNom2.Select 
rngNom2.EntireRow.Delete 
Set rngNom2 = ActiveCell 
Wend 


Set rngNom1 = rngNom2 
Set rngNom1 = ActiveCell 



Set rngNom1 = rngNom2 
rngNom1.Select 

lngCont = lngCont + 1 

Wend 

End Sub 

我不知道什麼是錯,我的猜測是,我說出

rngNom2 <> Cells.SpecialCells(xlCellTypeLastCell).Row

請注意,我starded VBA編程今天的部分(三月22日)。如果你可以請發佈不僅答案,而且快速解釋我會感激。

PS:數據表有2000行長期

+0

黑色細胞或空白單元? – 2013-03-22 20:14:40

+0

空白,我拼錯了。對不起,大聲笑 – Pedro 2013-03-22 20:16:04

+0

你能更具體地描述你想要完成的是什麼......也許我們可以向你展示更好的代碼來完成這個任務...例如,在Excel中,如果你選擇你的範圍並按'F5' ,點擊'Special'並選擇'Blanks',可以找到你範圍內的所有空白單元......如果你點擊'Shift'+'Space Bar',那麼將選擇整行......然後你可以刪除那行(如果這就是你想要做的)...所以,如果你記錄一個宏,那麼你可以得到你想要的10行代碼或更少... – 2013-03-22 20:26:15

回答

2

我會建議使用For循環,這樣就可以儘量避免使用.Select您可能希望看到THIS LINK

因此,例如,你的代碼會看起來像這樣

For i = 1 To lastRow 
    If Len(Trim(Sheets("Sheet1").Range("A" & i).Value)) = 0 Then Exit For 

    ' 
    '~~> Rest of your code 
    ' 
Next i 
+0

謝謝,但我acctualy使用lastRow參數,它工作得很好。但我會記住我的下一個代碼使用「For」例程! – Pedro 2013-03-22 20:38:54

+0

@Pedro:如果你確定在最後一行之前沒有空白單元格,那麼你可能會看到這個鏈接以及找到最後一行... http://stackoverflow.com/questions/11169445/error-finding-上次使用的細胞功能於VBA – 2013-03-22 20:42:47

0

我覺得這個命令會幫助你。將Range("a1")替換爲您想要測試的任何範圍。

IsEmpty(Range("a1"))

do while isempty(range("a1")) ...或do while not isempty(range("a1"))

0

那麼我不是100%確定你在做什麼,但這將是一個開始。

首先聲明一個範圍變量rng taht包含所有要檢查的單元格。我已設置此rng變量的方式將自動停止在列列中的第一個空白單元格處。

我們將使用計數器r來遍歷這些單元格,從最後到第一個(這在刪除時是必需的)。

在此迭代過程中,我們將使用變量cl作爲單個單元格範圍。

Sub excluirDuplicatas() 

Dim rng as Range 
Dim r as Integer 'row counter. 
Dim cl As Range 


lngCont = 0 
lngLinhas = Cells.SpecialCells(xlCellTypeLastCell).Row 

set rng = Range(ActiveCell.Address, Range(ActiveCell.Address).End(xlDown)) 

For r = rng.Rows.Count to 1 Step - 1 'Step backwards when deleting, otherwise you have infinite loop 

    'This tests to see if the cell value is the same as the value below it. 
    ' and deletes it if it is the same value. 
    If cl.Value = cl.Offset(1,0).Value Then 
     cl.EntireRow.Delete 

    End If 
Next 

結束子

相關問題