Тема: Скрипт подвисает при вызове метода ActiveSheet.Cells.Find(txt)

Имеется таблица на 12 колонок, 46000 строк, заполнена текстами. Также имеется чертёж, в котором присутствуют некоторые тексты из первой колонки в виде примитивов AcDbText. Задача - ткнуть такой текстовый примитив и узнать сопоставленный ему текст из шестой колонки таблицы. Вот мой макрос:

Public Sub FindAnswer()
  Dim txt As String
  Dim rnge, excapp, excsht
  ActiveDocument.ActiveSelectionSet.Clear
  ActiveDocument.ActiveSelectionSet.SelectOnScreen
  If ActiveDocument.ActiveSelectionSet.Item(0).ObjectName <> "AcDbText" Then
    MsgBox "Выбран не текст! Выбран " & ActiveDocument.ActiveSelectionSet.Item(0).ObjectName
  Else
    txt = ActiveDocument.ActiveSelectionSet.Item(0).TextString
    Set excapp = GetObject(, "Excel.Application")
    Set excsht = excapp.ActiveSheet
    Set rnge = excsht.Columns(1).Find(txt)
    If rnge Is Nothing Then
      MsgBox "Текст не найден в таблице"
    Else
      MsgBox excsht.Cells(rnge.Row, 6).Value
      Set rnge = Nothing
    End If
    Set excapp = Nothing
    Set excsht = Nothing
  End If
  ActiveDocument.ActiveSelectionSet.Clear
End Sub

Так вот когда я выбираю тексты, лежащие в "верхних" рядах таблицы, макрос реагирует быстро. А вот если выбрать текст в ряду номер эдак 41834, то макрос подвисает на неопределённое время. Но! Стоит только на таскбаре ткнуть Эксель, как макрос тут же "отвисает" и выдаёт найденную информацию из шестой колонки этого 41834 ряда.
Почему так происходит ? Может, я что-то не так напрограммил, хотя задача очень простая...

Re: Скрипт подвисает при вызове метода ActiveSheet.Cells.Find(txt)

Только что здесь http://forum.ixbt.com/topic.cgi?id=26:33542 нашёл ответ: юзайте excapp.ScreenUpdating = False перед "тяжёлым участком", и будет вам щастье! У меня всё получилось.

Re: Скрипт подвисает при вызове метода ActiveSheet.Cells.Find(txt)

Для ускорения я б попробовал
1 часть кода

Set excapp = GetObject(, "Excel.Application")
Set excsht = excapp.ActiveSheet

вынес бы за пределы этой процедуры, что б на момент выполнения действия пользователем объект ActiveSheet был уже определен.
2

Columns(1)

Заменил бы на

Range("A:A")

3 В Find(txt) указал бы дополнительные параметры поиска. Искать весь текст или часть и т.д.
4 попробовал бы поискать стандартными средствами Excel. Если будет подвисать, то дело не в макросе.
5 Из опыта

excsht.Cells(rnge.Row, 6).Value

Лучше записать в данном случае так

excsht.Cells(rnge.Row, 6).Text

То есть при считывании из ячейки надо брать Text, а при записи в ячейку - Value. Это так, к слову.
6 Поставьте через строчку таймер. Определите где зависает. Может не в Excel...
Пока готовил ответ вышло предыдыущее сообщение :)
Не забудьте только

excapp.ScreenUpdating = True

:)

Re: Скрипт подвисает при вызове метода ActiveSheet.Cells.Find(txt)

1. Спасибо, но это разовая операция и она не влияет на быстроту поиска.
2. Заменил.
3. По умолчанию ищется "часть", что мне и надо.
4. Стандартными средствами быстрее, но тоже есть задержка.
5. Спасибо, ценный совет.
Вообще-то только совет №3 имеет отношение к ускорению поиска. Так вот там (у метода Find) есть какие-то параметры, смысла которых я не могу понять - LookIn, LookAt... А хелпа на этой машине нет. Но это я уже сам посмотрю.