Что нового

Функция _Excel_RangeFind зацикливается

Malderin

Новичок
Сообщения
68
Репутация
1
Сделал скрипт для поиска по ячейкам в файле эксель, но при запросе поиска "дата" в данном конкретном файле 054_Б.xls функция зависает в бесконечном цикле.
Вот сам скрипт:
Код:
#include <Excel.au3>

Global $sPath, $aResult, $res_tmp, $res_tmp0, $MB_err = 0, $Text_find, $res_tmp1, $ioExcel
Global $iExcel, $ioExcel, $adress_SMK
$Text_find = InputBox("Поиск", "Введите текст для поиска", "", "", 300, 140)

Find()

Func Find()
    $sPath = @ScriptDir & "\" & "054_Б.xls"
    $iExcel = _Excel_Open()
    $ioExcel = _Excel_BookNew($iExcel)
    $oWorkbook = _Excel_BookOpen($iExcel, $sPath, True, True)
    $aResult = _Excel_RangeFind($oWorkbook, $Text_find)
;~     _ArrayDisplay($aResult)
    _Excel_BookClose($oWorkbook)

    If UBound($aResult) <> 0 Then
        Excel_new()
    Else
        MsgBox(4096, "Внимание", "Ничего не найдено")
    EndIf

EndFunc   ;==>Find

Func Excel_new() ;Region создание Нового экселевского файла, куда будем заполнять результаты поиска
    _Excel_SheetAdd($ioExcel, 1, True, 1, $res_tmp1)
    Global $oRange = $ioExcel.Application.Activesheet.Range('A1:D1')
    With $oRange
        .ColumnWidth = 20 ;ширина столбца
        .Font.Bold = True ;жирный шрифт
    EndWith
    $ioExcel.Application.Activesheet.Range('B1').ColumnWidth = 80
    _Excel_RangeWrite($ioExcel, $ioExcel.Activesheet, "Наименование листа", "A1")
    _Excel_RangeWrite($ioExcel, $ioExcel.Activesheet, "Результат поиска", "B1")
    _Excel_RangeWrite($ioExcel, $ioExcel.Activesheet, "Ссылка на ячейку", "C1")

    For $k = 0 To UBound($aResult) - 1
        _Excel_RangeWrite($ioExcel, $ioExcel.Activesheet, $aResult[$k][0], "A" & 2 + $k) ; Наименование листа где найден текс
        _Excel_RangeWrite($ioExcel, $ioExcel.Activesheet, $aResult[$k][3], "B" & 2 + $k) ;Результат поиска
        _Excel_RangeLinkAddRemove($ioExcel, $ioExcel.Activesheet, "C" & 2 + $k, $sPath, "'" & $aResult[$k][0] & "'" & '!' & $aResult[$k][2], $aResult[$k][2], "Результат") ;Ссылка на ячейку
    Next

EndFunc   ;==>Excel_new



Как воспроизвести проблему. Запускаем скрипт, в инпутбоксе вводим "дата" без кавычек. Создается пустой файл, куда будут записаны результаты поиска, открывается файл 054_Б.xls, по которому начинается поиск. Ждем секунд 15 (например), нажимаем на любую ячейку в пустом созданном файле.
Видим как начинается заполнение повторяющихся результатов в пустой экселевский файл.
Для удобства можно рас комментировать _ArrayDisplay($aResult) в функции Find(), тогда будет видно что результаты поиска идут в массив повторяющиеся.
Для примера нормального поиска и работы скрипта можно ввести что то другое, например "отметка" так же без кавычек.

p.s. Скрипт является частью моего большого скрипта и выдернут из него, по этому в нем может присутствовать немного лишнего кода, не относящегося к проблеме, прошу прощения за это. Но проблему он иллюстрирует.
Сообщение автоматически объединено:

В общем криво но проблему для себя решил.
Что я сделал. По скольку известно, что функция _Excel_RangeFind из UDF Excel.au3 построена на стандартном поиске эксель (то же что ctrl+f) я осуществил поиск в самом файле эксель средствами эксель. При поиске выбирал "найти все" и получал точно такое же зацикливание поиска как и через скрипт автоит. Вывод - автоит не виноват.
Далее, поэксперементировав с настройками поиска, выяснил, что при поиске "по столцам" (по умолчанию идет поиск по строкам) все ищется нормально.
Библиотека Excel.au3 не предоставляет возможности выбирать порядок поиска (строки/столбцы), по этому для своего проекта я принудительно изменил направление поиска в самой библиотеке на столбцы.
Кому интересно, ищем в UDF Excel.au3 строку:
Код:
$oMatch = $vRange.Find($sSearch, Default, $iLookIn, $iLookAt, Default, Default, $bMatchcase)

и делаем так:
Код:
$oMatch = $vRange.Find($sSearch, Default, $iLookIn, $iLookAt, 2, Default, $bMatchcase)


Жаль что авторы библиотеки не дали такого выбора сразу и приходится прибегать к таким костылям.
 

Вложения

  • Рабочий стол.zip
    16.5 КБ · Просмотры: 0
Последнее редактирование:
Верх