2012-04-25 4 views
0

У меня есть 2 листа (с номерами телефонов) в моем документе. если номер существует в листе1, я хочу удалить строку из листа 2.Visual Basic Excel - макрос для удаления строки

Я почти там (это первый раз, когда я использую VBA). Но может ли кто-нибудь помочь мне с последней частью.

Sub CleanList() 

    Dim stopList As Range, cell1 As Range 

    Set stopList = Sheet1.Range("A1:A10000") 

    For Each cell1 In stopList 
     Dim fullList As Range, cell2 As Range 
     Set fullList = Sheet2.Range("A2:A10000") 

     For Each cell2 In fullList 
      If NumberFix(cell1.Value) = NumberFix(cell2.Value) Then 
       cell2.EntireRow.Delete 
      End If 
     Next cell2 
    Next cell1 

End Sub 

Private Function NumberFix(ByVal nr As String) As String 

    If Not nr.StartsWith("46") Then 
     nr = "46" + nr 
    End If 

    NumberFix = nr 

End Function 
+2

Какую версию Excel вы используете? И не могли бы вы рассказать немного о «необходимости помощи с последней частью»? Вы можете посмотреть http://www.ozgrid.com/VBA/RemoveDuplicates.htm, который является одним из многих решений для удаления дубликатов из диапазонов. – ExternalUse

+0

+ 1 @ExternalUse: Yup Расширенный фильтр является одним из самых быстрых способов удаления дубликатов –

ответ

3

Первый путь вы используете nr.StartsWith более VB.NET-эск. Функция ваш ищет в VBA (вероятно, не VB-скрипт кстати) является

Dim firstTwoChar As String 
firstTwoChar = Mid(nr, 1, 2) 

If Not firstTwoChar = "46" Then 
    nr = "46" + nr 
End If 

NumberFix = nr 

Но даже с этим я бы сказал, что вы не должны использовать for...each итератор, если вы удаляете строки. Проблема в том, что когда вы удаляете строку 5, тогда строка 6 становится строкой 5, а следующая строка, к которой вы переходите, является строкой «6», но на самом деле является строкой 7 в исходном списке, эффективно пропуская исходный ряд 6.

Вам необходимо двигаться в обратном направлении. Что-то вроде

Sub CleanList() 

    Dim stopList As Range, cell1 As Range 

    Set stopList = Sheet1.Range("A1:A10000") 

    For Each cell1 In stopList 
     Dim fullList As Range, cell2 As Range 

     Dim firstRowSheet2 As Integer, lastRowSheet2 As Integer, r As Integer 
     Dim sheet1sNumber As String 
     sheet1sNumber = NumberFix(cell1.Value) 'you really only need to do this once 
               so you may as well bring it out of 
               the for loop and store the value and 
               not recalculate each time 
     Dim cell2 As Range 
     For r = firstRowSheet2 To lastRowSheet2 Step -1 
         '"Step -1" allows you to move backwards through the loop 
      With Sheet2 
       Set cell2 = .Cells(r, 1) 
       If sheet1sNumber = NumberFix(cell2.Value) Then 
         cell2.EntireRow.Delete 
        End If 
      End With 

     Next r 

    Next cell1 

End Sub 

Но, конечно, @ExternalUse прав. Существует множество встроенных опций для удаления дубликатов из списка. Если вы не пытаетесь изучить VBA, это будет хорошим упражнением.

+0

+ 1 :) Хорошая точка в обратном цикле. –

+0

Спасибо большое Брэд. Я добавил значения Start и End для цикла for. Единственное, чего не хватало. Сейчас работает как шарм. – mannge

+0

Замечательно, что это сработало! – Brad

Смежные вопросы