1

Тема: VBS. Ускорение поиска совпадений в ячейках Excel

Здравствуйте.
Есть такая проблема - необходимо проверить, есть ли искомое значение на активном листе Excel. Реализовал следующим способом, ниже код метода

Sub DocsInJ_c (exJourObj, JWS)                       ''============================== exJourObj - объект Excel, JWS - страница
    set A1 = exJourObj.range("A1").EntireColumn
    ArRows = A1.rows.count
    for o1 = 1 to ArRows-1
    if jws.Cells.Item(o1 ,4).Value = "" then Exit For          ' количество заполненых строк на листе
    next
    i1 = 0  
    for o=0 to SelectedDocsInVed.count-1            ' перебор по документам из ведомости
    SearchName = SelectedDocsInVed.item(o)    ' 
    for i=1 to o1                                                '  перебор по документам из журнала
    if SearchName = JWS.Cells.Item(i ,4).Value then
    SDocsInJournal.add i1, SearchName         ' добавить в список дублируемых
    i1 = i1 + 1
    end if
    Next
    Next
End Sub

Работает, но есть одна загвоздка. Если просто открыть лист и с помощью ctrl+f искать требуемое значение, то при переборе журнала с 5-10 тысячами записей продуктивней оказывается ручной труд. Есть ли возможность искать нужное значение не перебором всех ячеек, а методом, аналогичным поиску Excel ?

2 (изменено: Евген, 2012-03-14 16:08:47)

Re: VBS. Ускорение поиска совпадений в ячейках Excel

Cells.Find(What:=" & txtValue &", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False , SearchFormat:=False).Activate

Не ?

Времени не хватает... :-(

3

Re: VBS. Ускорение поиска совпадений в ячейках Excel

Возможно я не совсем правильно понял Вашу задачу. Метод Find по каким то причинам не подходит ? Он возвращает Range ячеек, содержащик искомое значение, на сколько я помню.


Set Range = Cells.Find("search string")

или


Set Range = ActiveSheet.Cells.Find("search string")

И хотелось бы уточнить, Вы пишете в среде WSH или VBA ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4 (изменено: Dmitrii, 2012-03-15 07:07:58)

Re: VBS. Ускорение поиска совпадений в ячейках Excel

Кроме того, с помощью метода SpecialCells объекта Range можно существенно уменьшить область для поиска.

5 (изменено: KlimTV, 2012-03-19 15:36:33)

Re: VBS. Ускорение поиска совпадений в ячейках Excel

Товарищу Евген'y

Cells.Find(What:=" & txtValue &", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False , SearchFormat:=False).Activate

Разве скрипт не воспринимает двоеточие как начало новой строки ? Или есть какие-то хитрости о которых я не в курсе?

Товарищу Xameleon'y

Возможно я не совсем правильно понял Вашу задачу. Метод Find по каким то причинам не подходит ? Он возвращает Range ячеек, содержащик искомое значение, на сколько я помню.

К сожалению в моем справочном пособии (для справки использую пособие от Штайнера Г.) про метод Find ничего не написано, поэтому пытался найти нужную ячейку перебором. Задача такова - необходимо проверить, есть ли в 4-ой колонке искомое значение и в зависимости от да/нет действовать дальше. Если знаете хорошее справочное пособие по скрипту и Excel, не могли бы поделиться названием в ПМ.

И хотелось бы уточнить, Вы пишете в среде WSH или VBA ?

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

Товарищу Dmitrii'y

Кроме того, с помощью метода SpecialCells объекта Range можно существенно уменьшить область для поиска.

Попробую сначала Find освоить. Как с ним разберусь попробую и SpecialCells.


Всем спасибо.

6

Re: VBS. Ускорение поиска совпадений в ячейках Excel

KlimTV пишет:

Разве скрипт не воспринимает двоеточие как начало новой строки ?

Потому и был задан вопрос:

Xameleon пишет:

И хотелось бы уточнить, Вы пишете в среде WSH или VBA ?

KlimTV пишет:

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

Должно быть, какой-нибудь MSScript Control используется в ней?!

7

Re: VBS. Ускорение поиска совпадений в ячейках Excel

Должно быть, какой-нибудь MSScript Control используется в ней?!

Вполне возможно. Это надо узнавать у разработчиков.

Скрипт поправил, работает значительно быстрее.

Sub DocsInJ_c (exJourObj, JWS)                       ''============================== exJourObj - объект Excel, JWS - страница
    set A1 = exJourObj.range("A1").EntireColumn
    ArRows = A1.rows.count
    for o1 = 1 to ArRows-1
    if jws.Cells.Item(o1 ,4).Value = "" then Exit For          ' количество заполненых строк на листе
    next
    i1 = 0  
    for o=0 to SelectedDocsInVed.count-1            ' перебор по документам из ведомости
    SearchName = SelectedDocsInVed.item(o)    
    set RangeS = JWS.range("D1:D"& o1)
    set SearchObj = RangeS.find(SearchName)
    If Not SearchObj Is Nothing Then
       strFirstAddres = SearchObj.AddresLocal (false, false)
    End If
    Do Until (SearchObj Is Nothing)
       set SearchObj = RangeS.findNext(SearchObj)
       strHolder = SearchObj.AddresLocal(false, false)
       i = SearchObj.row
       SDocsInJournal.add i1, SearchName
       i1 = i1 + 1
       Perebor1 SearchName, JWS, i
       If strHolder = strFirstAddres Then
          Exit Do
       End If
    Loop
    Next
End Sub

Спасибо за подсказки.

8

Re: VBS. Ускорение поиска совпадений в ячейках Excel

Обнаружил у себя ошибку - поиск .find(SearchName) ищет подстроку, а не конкретное значение из переменной, т.е. если я ищу значение "Тест", то для него и "Тест", и "Тест1" это совпадение. Добавил проверку на полное соответствие.

Sub DocsInJ_c (exJourObj, JWS)                       ''============================== exJourObj - объект Excel, JWS - страница
    set A1 = exJourObj.range("A1").EntireColumn
    ArRows = A1.rows.count
    for o1 = 1 to ArRows-1
    if jws.Cells.Item(o1 ,4).Value = "" then Exit For          ' количество заполненых строк на листе
    next
    i1 = 0  
    for o=0 to SelectedDocsInVed.count-1            ' перебор по документам из ведомости
    SearchName = SelectedDocsInVed.item(o)    
    set RangeS = JWS.range("D1:D"& o1)
    set SearchObj = RangeS.find(SearchName)
    If Not SearchObj Is Nothing Then
       strFirstAddres = SearchObj.AddresLocal (false, false)
    End If
    Do Until (SearchObj Is Nothing)
       set SearchObj = RangeS.findNext(SearchObj)
       strHolder = SearchObj.AddresLocal(false, false)
       If SearchObj = SearchName then            ' добавил проверку
       i = SearchObj.row
       SDocsInJournal.add i1, SearchName
       i1 = i1 + 1
       Perebor1 SearchName, JWS, i
       End If
       If strHolder = strFirstAddres Then
          Exit Do
       End If
    Loop
    Next
End Sub