Страницы: 1
RSS
Найти все дубликаты в третьем столбце и удалить строки с первыми значениями, ошибка type mismatch при поиске
 
Всем доброго времени суток! Обычно находил решение проблем на данном форуме, но сейчас не могу понять в чем проблема. Есть таблица примерно на 60тыс строк. Необходимо найти все дубликаты в третьем столбце и удалить строки с первыми значениями, и затем так же пробежаться по первому столбцу. В третьем столбце числовые значения, в первом - текстовые (пробежался по столбцу Cstr).
Код
Sub delete_duplicate()
    Dim endrow As Long
    Dim srange As Range
    Dim rrange As Range
    Dim id() As Long
    Dim n() As Long
    
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    
    endrow = Worksheets("spgz").Cells(Rows.Count, 1).End(xlUp).Row
    ReDim id(endrow) As Long
    t = Now
    r = 0
    For i = 1 To endrow
        Set srange = Worksheets("spgz").Range(Worksheets("spgz").Cells(i + 1, 3), Worksheets("spgz").Cells(endrow, 3))
        If Not srange.Find(Worksheets("spgz").Cells(i, 3), LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then
            r = r + 1
            id(r) = i
        End If
    Next i
    If r > 1 Then
        For i = r - 1 To 1 Step -1
            Rows(id(i)).Delete
        Next i
    End If
    
    endrow = Worksheets("spgz").Cells(Rows.Count, 1).End(xlUp).Row
    ReDim n(endrow) As Long
    s = 0
    For i = 1 To endrow
        Set rrange = Worksheets("spgz").Range(Worksheets("spgz").Cells(i + 1, 1), Worksheets("spgz").Cells(endrow, 1))
        If Not rrange.Find(Worksheets("spgz").Cells(i, 1), LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then
            s = s + 1
            n(s) = i
        End If
    Next i
    If s > 1 Then
        For i = s - 1 To 1 Step -1
            Rows(n(i)).Delete
        Next i
    End If
    
    t = DateDiff("s", t, Now)
    MsgBox (r - 1 & " èäåíòèôèêàòîðîâ è " & s - 1 & " íàèìåíîâàíèé çà " & t & " ñåêóíä")
    
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic

End Sub
Ошибка указывает на эту строку (поиск по первому столбцу):
Код
        If Not rrange.Find(Worksheets("spgz").Cells(i, 1), LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then
 
Проверьте, нет в ли в столбец ячеек, содержащих ошибки. Потому как если есть, то попытка найти ячейку(Worksheets("spgz").Cells(i, 3)) со значением ошибки как раз вызовет подобную ошибку кода.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо за помощь, но не совсем понял, что значит в ячейке содержится ошибка и как ее можно найти? На листе нет формул, условного форматирования, данные были скопированы с другого листа и вставлены как значения.
Изменено: bober2004 - 23.07.2017 13:54:39
 
Цитата
bober2004 написал:
как ее можно найти
Не знаю. Это у Вас есть файл с данными, у нас нет. Код работает. Без файла не думаю, что реально помочь.
Ячейка с ошибкой - это не обязательно формула. Раньше в ячейке могла быть формула, но потом заменена значением. А формула возвращала ошибку #Н/Д или #ЗНАЧ!. Вот и получили ошибку.
Найти просто: выделяете нужный столбец -F5 -Выделить -Константы -Ошибки. На всякий случай советовал бы и среди формул поискать.
Еще проще - как только код выдал ошибку нажать Debug и посмотреть в режиме отладки на какой строке(переменная i). И проанализировать что там в ячейках этой строки так не понравилось VBA.
Изменено: The_Prist - 23.07.2017 14:00:02
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо, попробую отловить на какой строке появляется ошибка
 
Посмотрел, в ячейке, на которую ругался отладчик, слишком длинный текст (373 символа). Find больше 255 не может же, так? Попробую ввести проверку на количество символов и обрезать, если больше.
 
Доброго дня, спасибо за обсуждение. тоже столкнулся с этой ошибкой. Получается . Find целиком(!) искать не будет в ячейках с более чем 255 символов?
Пришлось задавать переменную с ограничением в 255 символов и искать "не целую ячейку"(xlPart). Тогда заработала функция.
Код
dim поиск as string
If Len(Cells(1, 1).Value) > 255 Then
поиск = Left(Cells(1, 1), 255)
Else
поиск = Cells(1, 1)
End If
Range("2:1000").Find(поиск, , xlFormulas, xlPart, , , 0, 0) 
Не перестаю удивляться возможностям excel и VBA.
 
Владимир Шаматонов, здравствуйте
Создайте тему с описанием задачи, потому что искать можно другими (и, для вашего случая, более быстрыми и контролируемыми) способами
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх