Страницы: 1
RSS
Поиск нескольких значений
 
Добрый вечер. Задача состоит в том, что у меня есть несколько значений на одном листе (Лист1 в примере) и очень большой список на другом листе (Лист2 в примере). Мне надо удалить такие значение на Листе 2, которые встречаются на Листе 1. Я это уже реализовал, но скорость такого поиска маленькая. У меня два вопроса:
1. Можно ли скопировать все искомые значения на Листе1 в массив, и, переключившись на Лист2, искать не одно значение в массиве, а сразу все?
2. Как вообще можно оптимизировать данный поиск

Большое спасибо за внимание.
 
Ужасный код...
Зачем активейты, зачем селекты (причём между листами), зачем удалять строку? Конечно будет медленно...
Ну а чтоб было быстро - массивы/словари, таких кодов на форуме полно, ищите по scripting.dictionary
Вообще чтоб сделать толково - нужно знать всю задачу.
И быстрее будет отобрать нужное, а не удалять ненужное - если конечно это возможно по задаче.
Т.к. задача в целом не понятна, а кодов полно - сейчас код не пишу.
Изменено: Hugo - 15.03.2013 21:57:10
 
Код
Sub t()
  Dim a1(), a2(), i&, lr&, j&, e, r As Range, d As Object
  lr = Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row
  a1 = Sheets("Лист1").[a1].Resize(lr).Value
  Set d = CreateObject("scripting.dictionary")
  For Each e In a1: d.Item(e) = 0&: Next
    
  With Sheets("Лист2")
    lr = .Cells(Rows.Count, 1).End(xlUp).Row
    a2 = .[a1].Resize(lr).Value
    For j = lr To 1 Step -1
      If d.exists(a2(j, 1)) Then
        If r Is Nothing Then Set r = .Cells(j, 1) Else Set r = Union(r, .Cells(j, 1))
      End If
    Next
    If Not r Is Nothing Then r.EntireRow.Delete
  End With
End Sub
Изменено: ikki - 15.03.2013 21:58:17
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Hugo, спасибо за ответ. Теперь по-порядку. Я и не претендую на создание качественного кода. Я не программист, просто хочу оптимизировать свою работу. Каждый работает в силу своих знаний. Массивы - пробовал, не смог разобраться. scripting.dictionary - не слышал. Попробую разобраться, спасибо. Это как раз то, что я себе представлял. Задача именно такая, как я ее описал. Проверка и удаление на разных листах.

ikki,
Спасибо за код. Я так понял, что scripting.dictionary - именно то, что мне нужно. Буду пробовать. Спасибо.

Если у кого-то есть еще варианты или советы - буду благодарен.
Изменено: Jum - 15.03.2013 22:09:30
 
кстати...
по поводу "не знаю/не умею"  :D
у меня проблемка

хотел попробовать использовать SQL...
примерно так:
Код
Sub t2()
    Dim sCon$, cn As Object, sSQL$
    Set cn = CreateObject("ADODB.Connection")
    Select Case CLng(Split(Application.Version, ".")(0))
        Case Is < 12
            sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName _
              & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
        Case Is >= 12
            sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName _
            & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
    End Select ' thnx R Dmitry
    
    sSQL = "DELETE a.* FROM [Лист2$A:A] AS a WHERE a.F1 IN (SELECT b.F1 FROM [Лист1$A:A] AS b)"
    cn.Open sCon
    cn.Execute sSQL
End Sub


не вышло  :(
пишет "Невозможно удаление записей из указанных таблиц"
ЧЯДНТ?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Посмотрите названия тем на первой странице. Буквально сегодня мы обсуждали  Удаление строк по условию
100% Ваш случай.
 
Цитата
ikki пишет:  ЧЯДНТ?
возникло подозрение, что в WHERE у DELETE нельзя использовать подзапросы.  :oops:
это действительно так?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Зачем удалять строки (самое времязатратное действо) - из описания не понятно.
Варианты побыстрее:
1 отобрать нужное на другой или этот же лист
2. удалить ненужные значения, отсортировать оставшееся.

Не понятны объёмы - если строк десятки тысяч, из которых действительно нужно удалить половину - то есть способ побыстрее.
Если строк немного - то в общем оптимальный код уже выше есть, спасибо неленивому Александру :)
 
держите вариант простой, можно удаление по условию посмотреть http://www.planetaexcel.ru/forum.php?thread_id=23055
 
Цитата
Hugo пишет:
спасибо неленивому Александру
не, а чо? ну считайте это моим капризом.  :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Igor67, Огромное спасибо. Это действительно проще для понимания. Буду разбираться.
 
Мне кажется наоборот... :)
Но работать точно будет дольше.
 
Цитата
Jum пишет: ...но скорость поиска маленькая...
Цитата
Jum пишет: Это действительно проще для понимания.
вы весь такой загадочный и непоследовательный...  :D
Изменено: ikki - 15.03.2013 22:50:19
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Hugo,  :D Я кстати хотел использовать Union()  для удаления блоками, но где то ошибся, или забыл.... Код не работал  :(
 
Господа! Я не думаю, что кто-то из вас вообразил меня программистом. Вы увидели уровень моего познания в первом посте. Я уверен, что существуют способы решения моей задачи еще более эффективные, чем предложенные вами и еще более сложные, но это не означает того, что я смогу с их помощью решить свою задачу. Да я хочу решить свою задачу более качественно, но я должен понять новый способ) В противном случае я не смогу им воспользоваться.
Я благодарен всем за ответы
 
Igor67, Разобрался с вашим примером, применил его к своей программе - работает намного быстрее! Огромное Вам спасибо!
 
Jum, удачи в освоении ВБА, и обращайтесь на форум - здесь обязательно помогут ;)
Страницы: 1
Читают тему
Наверх