powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как ускорить работу ActiveDocument.Words
16 сообщений из 16, страница 1 из 1
Как ускорить работу ActiveDocument.Words
    #36015316
К сожалению, код вида

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Dim s As String
Dim i As Long
Dim Count As Long

Count = ActiveDocument.Words.Count

Do While i < Count
  s = ActiveDocument.Words(i)
  ' Что-то делаем со словом
  i = i +  1 
Loop


Хотя и работает, но очень медленно. Тормоза, как я понял, на доступе к отдельным словам, потому что, если загнать текст в одну переменную и парсить её на выделение слов работает с приемлемой скоростью.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim s As String
Dim i As Long
Dim len1 As Long

ActiveDocument.Select
s = Selection
len1 = Len(s)

Do While i < len1
  ' Выделяем слово из s
  ' Что-то делаем со словом
  i = i +  1 
Loop

Но хотелось бы работать именно с Words, хотя бы потому что отказ от них приводит к другим неудобствам для меня, связанным с тем, что длина переменной, полученной из Selection и .Characters.Count изредка на некоторых документах не совпадают.

Так вот, есть ли способ как-то ускорить работу .Words?
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015383
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: СтаниславК
> К сожалению, код вида

а если попробовать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim rPar As Range, rSent As Range, rWord As Range
Dim s As String
For Each rPar In ActiveDocument.Paragraphs
    For Each rSent In rPar.Sentences
        For Each rWord In rSent.Words
            s = rWord.Text
            ' Что-то делаем со словом
        Next rWord
    Next rSent
Next rPar



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015504
Игорь Горбонос

а если попробовать так:


Type mismatch на For Each rPar In ActiveDocument.Paragraphs

Если заменить в определении Range на Variant тогда сообщение о невозможной операции над объектом в For Each rSent In rPar.Sentences.

Но сейчас попробую через индексы, хотя сомневаюсь уже, что будет быстрее, но попробую.
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015570
Короче, всё равно Type mismatch на rPar = ActiveDocument.Paragraphs(p1) и на
rPar = ActiveDocument.Paragraphs(p1).Range тоже своя ошибка. Там как-то надо диапазон задавать.

Короче, полно возни на ровном месте, вдобавок мне всё-равно надо отслёживать номер слова, хотя бы для позиционирования курсора и индикации процента выполненной работы.

Ладно, спасибо за попытку помочь, но наверное, продолжу возню с Sel$=Selection. Там уже многое отлажено, хотя и через одно место.

Я думал с ActiveDocument.Words(i) есть какое-нибудь шаманство, ну там может отключить какой параметр неочевидный или ещё чего.
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015630
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim rPar As Paragraph

For Each rSent In rPar.Range.Sentences
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015638
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ActiveDocument.Words(i) тормозит потому что доступ к элементу коллекции происходит по индексу. Нужно ее перебирать через For Each.
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015663
AntonariyActiveDocument.Words(i) тормозит потому что доступ к элементу коллекции происходит по индексу. Нужно ее перебирать через For Each.

Спасибо, хотя проверю потом, сейчас с Selectuon пытаюсь доделать. Мне ведь как-то надо ещё навести курсор на слово, которое выбрано через For Each. Есть способ?
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015799
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: СтаниславК
> Type mismatch на For Each rPar In ActiveDocument.Paragraphs

Да, виноват, поторопился набросать идею и не проверил на типы.
К сожалению(или к счастью) с вордом практически не приходится работать


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015803
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: СтаниславК
> Мне ведь как-то надо ещё навести курсор на слово, которое выбрано через For Each. Есть способ?
Код: plaintext
rWord.Select



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015861
Тогда уж ещё ошибка: Sentences есть у ActiveDocument, но нет у Paragraphs

Ладно, попробую все же и так тоже.
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015879
А нифига. Несмотря на иерархию Documents --> Paragraphs --> Sentences --> Words --> Characters нет вложенности. На уровне документа доступен любой подуровень, но любой подуровень не имеет доступа к своим подуровням. То есть, у Paragraphs нет ни Sentences, ни Words, ни Characters, как и у остальных.
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015950
Игорь Горбонос
Код: plaintext
rWord.Select



Спасибо!

В общем заработало. Цикл один

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim rWord As Range 'Именно Range, все-таки

For Each rWord In ActiveDocument.Words
   
    s=rWord.Text
   'Что-то делаем
   
   rWord.Select
   'Что-то делаем
Next rWord


Тогда всё быстро. Правда, может быть понадобится изменить способ выделения слов, скажем не выделять или наоборот выделять как целое слово символ с подстрочным индексом. И тогда другой вариант (с Selection) все же гибче.

Или есть способ указать Word терминальные символы для Words?
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36015969
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: СтаниславК
> Тогда всё быстро. Правда, может быть понадобится изменить способ выделения слов, скажем не выделять или наоборот
> выделять как целое слово символ с подстрочным индексом. И тогда другой вариант (с Selection) все же гибче.

Посмотри на метод SetRange класса Range. Я думаю он с успехом заменит Selection

> Или есть способ указать Word терминальные символы для Words?

Вот этого не знаю. Я так думаю, что терминальные символы для слова это пробел, знаки препинания и все служебные символы
и я так думаю, что это жёстко зашито


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36016004
Игорь Горбонос
Посмотри на метод SetRange класса Range. Я думаю он с успехом заменит Selection
Я так думаю, что терминальные символы для слова это пробел, знаки препинания и все служебные символы
и я так думаю, что это жёстко зашито


Да нет, SetRange ведь только внутри текущего слова подействует. Но это уже мелочь, без неё можно и обойтись. Хотя навёл на мысль, интересно, а если захотеть фон отдельных букв в выделенном слове подкрасить в разные цвета, получится ли?

Хотя то, что терминальные символы жестко забиты очень вероятно, жаль. Возможно не понадобится их менять, потому что сейчас всё получается и быстро и хочется надеяться, что надёжно, в смысле устойчиво к глюкам.

Ещё раз, спасибо!
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36016009
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтаниславКТо есть, у Paragraphs нет ни Sentences, ни Words, ни Characters, как и у остальных.Paragraphs. Range .Sentences, читайте внимательней. Элементом коллекции Paragraphs является объект Paragraph, а элементом остальных коллекций — Range. В свою очередь Range имеет и Paragraphs и Words и Characters. Range — базовая единица текста ворда.
...
Рейтинг: 0 / 0
Как ускорить работу ActiveDocument.Words
    #36016169
Спасибо, но оказывается и просто сразу Words работают в For Each достаточно быстро.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как ускорить работу ActiveDocument.Words
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]