Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51

Как выбирать нужные значения из заголовков?

14.03.2013, 11:37. Показов 2792. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть документ Microsoft Word со следующей информацией: Заголовок->Рисунок->Текст->Таблица. И все это повторяется около 1000 раз. Нужна информация из заголовка. В заголовке есть повторяющееся слово "модель" после которого следует число как раз которое и нужно. Есть алгоритм, осуществленный с помощью Delphi, который достает полностью весь текст между таблицами, выглядит следующим образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
slast:=tab.cell(rn,2).range.text;
   slast0:=tab.cell(rn,1).range.text;
   sfirst:=AD.Tables.Item(i+1).cell(1,1).range.text;
   sfirst1:=AD.Tables.Item(i+1).cell(1,2).range.text;
 
   for k := kn to fn do
    begin
     if (AD.Paragraphs.Item(k-1).range.text=slast0) and (AD.Paragraphs.Item(k).range.text=slast) then
      begin
       klast:=k;
       break;
      end;
    end;
   for k := klast to fn do
    begin
     if (AD.Paragraphs.Item(k).range.text=sfirst) and (AD.Paragraphs.Item(k+1).range.text=sfirst1) then
      begin
       kfirst:=k;
       break;
      end;
    end;
   s:='';
   for k := klast+1 to kfirst-1 do
    begin
     s:=s+AD.Paragraphs.Item(k).range.text;
    end;
   s:=Trim7(s);
   k:=Pos('/',s);
   if k>0 then
    s:=Copy(s,1,k-1);
   vname:=s;
   kn:=kfirst+1;
Но выполняется чертовски долго! Подскажите пожалуйста как можно либо ускорить это дело, либо быть может можно как-то доставать нужную информацию из заголовка? Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2013, 11:37
Ответы с готовыми решениями:

Как отобразить нужные мне заголовки в Datagrid вместо заголовков из базы данных
Ребят, подскажите пожалуйста. У меня есть <DataGrid x:Name="dg" >. На нем я отображаю данные из заполненного dataset. ...

Как получить нужные значения?
Есть такая задача. В базе данных таблица из трех колонок: id, linkpicture(ссылки на картинки), namepicture(названия картинок). Нужно по...

Как получить нужные значения из xml файла?
Есть такое содержимое файла xml <?xml version="1.0"?> <Profile xmlns="http://www.microsoft.com/networking/profile/v1"> ...

23
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
14.03.2013, 13:16
Как вариант - сохранить в текст и парсить текст.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
14.03.2013, 13:30
Вариант 1

Если заголовок оформлен каким-нибудь стилем (наиболее часто к заголовку применяют стиль "Заголовок"), то можно перемещаться в документе по заголовкам и смотреть, что находится после нужного слова.


Вариант 2

Можно перемещаться по документу в поисках искомого слова и после него брать данные.
0
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
14.03.2013, 13:32  [ТС]
Спасибо, я правда так и хотел бы))) Но я не знаю как код написать, подскажите пожалуйста
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
14.03.2013, 13:33
Greyzer, в сообщении #3 два варианта. Вам какой подходит?
0
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
14.03.2013, 13:41  [ТС]
Наверное 1-ый вариант, т.к. заголовки явно выделены в документе
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
14.03.2013, 13:43
Greyzer, какая версия у вас программы "Word" - 2003, 2010 или другая?
0
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
14.03.2013, 13:45  [ТС]
Скрипт, 2010
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
14.03.2013, 13:55
Greyzer, ставите курсор на текст, у которого нужно узнать стиль, и смотрите как на скриншоте. Если стиля нет, то тогда нужно ещё несколько действий сделать, чтобы узнать, какой стиль у текста.
Миниатюры
Как выбирать нужные значения из заголовков?  
0
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
14.03.2013, 14:00  [ТС]
Скрипт, тааак это есть, стиль известен, правда я его сам создавал и сохранил там куда указывает стрелка на вашем скриншоте, но я думаю это не принципиально. В общем стиль мы узнали, что нужно дальше?)
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
14.03.2013, 14:15
Поиск текста со стилем "Заголовок 1".

Если макрос должен вносить какие-нибудь изменения в документ, то для ускорения работы кода можно перейти в режим "Черновик" и отключить проверку правописания.

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub Procedure_1()
 
    Dim rngSearch As Word.Range
    Dim myFind As Word.Find
    
    'Создаём виртуальную закладку (аналог обычной закладки, только
        'виртуальная закладка работает только в коде).
    'С помощью виртуальной закладки будем перемещаться по документу.
    'Виртуальная закладка будет в виде точки вставки (аналогично
        'мерцающему курсору в программе "Word").
    Set rngSearch = ActiveDocument.Range(Start:=0, End:=0)
    
    'Создаём объект, который будет искать (в программе "Word" - это
        'окно "Найти и заменить").
    'Объект поиска создаём на основе виртуальной закладки.
    Set myFind = rngSearch.Find
    
    'Задаём параметры для поиска.
    'Задаём, какой стиль искать.
    myFind.Style = "Заголовок 1"
    
    'Осуществляем поиск, пока будет находиться искомый текст.
    'При достижении конца документа, поиск сам остановится.
    Do While myFind.Execute = True
    
        'Если будет результат поиска, то виртуальная закладка
            'окружит найденный фрагмент текста.
        'Вывод в View - Immediate Window того, чтобы было найдено.
        Debug.Print rngSearch.Text
        
        'Чтобы продолжить поиск, перемещаем виртуальную закладку
            'в конец найденного фрагмента.
        rngSearch.Collapse Direction:=wdCollapseEnd
    
    Loop
    
End Sub
0
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
15.03.2013, 10:46  [ТС]
Скрипт, спасибо! А как можно найти нужное слово после искомого? Ну вот скажем есть слово "модель" в каждом заголовке и после него идет номер, который как раз и нужен, но номер каждый раз разный. Вот как найти этот номер?)
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
15.03.2013, 10:56
Greyzer, вот сразу поиск нужного слова, оформленного стилем "Заголовок 1":
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub Procedure_1()
 
    Dim rngSearch As Word.Range
    Dim myFind As Word.Find
    
    '1. Создаём виртуальную закладку (аналог обычной закладки, только
        'виртуальная закладка работает только в коде).
    'С помощью виртуальной закладки будем перемещаться по документу.
    'Виртуальная закладка будет в виде точки вставки (аналогично
        'мерцающему курсору в программе "Word").
    Set rngSearch = ActiveDocument.Range(Start:=0, End:=0)
    
    '2. Создаём объект, который будет искать (в программе "Word" - это
        'окно "Найти и заменить").
    'Объект поиска создаём на основе виртуальной закладки.
    Set myFind = rngSearch.Find
    
    '3. Задаём параметры для поиска.
    '3.1. Указываем искомый текст.
    myFind.Text = "модель"
    '3.2. Искомый текст должен иметь стиль "Заголовок 1".
    myFind.Style = "Заголовок 1"
    
    'Осуществляем поиск, пока будет находиться искомый текст.
    'При достижении конца документа, поиск сам остановится.
    Do While myFind.Execute = True
    
        'Если будет результат поиска, то виртуальная закладка
            'окружит найденный фрагмент текста.
        'Вывод в View - Immediate Window того, чтобы было найдено.
        Debug.Print rngSearch.Text
        
        'Чтобы продолжить поиск, перемещаем виртуальную закладку
            'в конец найденного фрагмента.
        rngSearch.Collapse Direction:=wdCollapseEnd
    
    Loop
    
End Sub
1
 Аватар для KoGG
5640 / 1622 / 418
Регистрация: 23.12.2010
Сообщений: 2,431
Записей в блоге: 1
15.03.2013, 11:52
Ищет первое слово, после слова "модель":
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Procedure_2()
    Dim rngSearch As Word.Range
    Dim myFind As Word.Find
    Set rngSearch = ActiveDocument.Range(Start:=0, End:=0)
    Set myFind = rngSearch.Find
    With myFind
        .Text = "модель"
        .Style = "Заголовок 1"
        .MatchWildcards = True
        Do While .Execute = True
            rngSearch.Collapse Direction:=wdCollapseEnd
            .Text = "<*>"
            .Execute
            Debug.Print rngSearch.Text
            rngSearch.Collapse Direction:=wdCollapseEnd
            .Text = "модель"
        Loop
    End With
End Sub
1
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
15.03.2013, 12:24
Здравствуйте,
Думаю, поиск номера лучше всего осуществить с помощью регулярного выражения.
Вот мой вариант:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
'Процедура ищет в тексте документа диапазоны, выделенные стилем "Заголовок 1".
'Для каждого найденного диапазона, если текст диапазона соответствует шаблону
'регулярного выражения, процедура выводит номер модели.
Sub FindModelNumbers()
   Dim rgX As Object, sbM As Object
   Dim s As String, n As Long
   Set rgX = CreateObject("VBScript.RegExp")
   rgX.IgnoreCase = True
   rgX.Pattern = "(?:^|^.*[^А-ЯЁ])МОДЕЛЬ(?:(\d+)|[^А-ЯЁ]\D*(\d+)).*$"
   With ActiveDocument.Range
      .Find.Style = "Заголовок 1"
      Do While .Find.Execute = True
         s = Replace(.Text, vbCr, "")
         If Len(s) > 0 Then
            .Collapse Direction:=wdCollapseEnd
            If rgX.Test(s) Then
               Set sbM = rgX.Execute(s)(0).SubMatches
               Debug.Print s & ": номер - " & sbM(0) & sbM(1)
            Else
               Debug.Print s & ": не соответствует шаблону."
            End If
         Else
            Exit Do
         End If
      Loop
   End With
End Sub
С уважением,
Aksima
1
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
15.03.2013, 15:38  [ТС]
Aksima, что-то у меня не очень получается. Я вообще хотел сделать по-простому: записать макрос копирования и вставки в таблицу самого слова "модель" и номера модели из заголовка и обернуть это дело в цикл. Можно так сделать? Вот сам код записи макроса:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub Model¹()
'
' Model¹ Ìàêðîñ
'
'
    Selection.Copy
    Selection.MoveDown Unit:=wdLine, Count:=5
    Selection.InsertRowsBelow 1
    Selection.MoveDown Unit:=wdLine, Count:=1
    Selection.MoveUp Unit:=wdLine, Count:=1
    Selection.PasteAndFormat (wdFormatPlainText)
    Selection.MoveUp Unit:=wdLine, Count:=7
    Selection.MoveDown Unit:=wdLine, Count:=1
    Selection.MoveRight Unit:=wdCharacter, Count:=6
    Selection.MoveRight Unit:=wdCharacter, Count:=7, Extend:=wdExtend
    Selection.Copy
    Selection.MoveDown Unit:=wdLine, Count:=6
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.PasteAndFormat (wdFormatPlainText)
    Selection.MoveDown Unit:=wdLine, Count:=43
    Selection.MoveUp Unit:=wdLine, Count:=1
    Selection.MoveLeft Unit:=wdCharacter, Count:=14
    Selection.MoveRight Unit:=wdCharacter, Count:=6, Extend:=wdExtend
    Selection.Copy
End Sub
0
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
15.03.2013, 16:31  [ТС]
Вот сам документ.
Вложения
Тип файла: rar Wagon_overview_modified_cutted.rar (1.10 Мб, 4 просмотров)
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
15.03.2013, 23:17
Здравствуйте, Greyzer,
С примером совсем другое дело . И шаблон регулярки легче подобрать, и структура таблицы, в которую надо пихать данные, понятна.
Если бы еще занимался вордовским VBA регулярно, а не по большим праздникам, в один момент сделал бы ...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub InsertModelNumbers()
    Dim rgX As Object
    Dim modN As Collection
    Dim d As Document
    Dim tbl As Table
    Dim i As Long
    Set rgX = CreateObject("VBScript.RegExp")
    Set modN = New Collection
    rgX.Pattern = "^.*модель.((?:-|\d)+).*$"
    Set d = ActiveDocument
    With d.Range
        .Find.Style = "Заголовок для моделей вагонов"
        Do While .Find.Execute = True
            If rgX.Test(.Text) Then modN.Add rgX.Replace(.Text, "$1")
            .Collapse Direction:=wdCollapseEnd
        Loop
    End With
    For Each tbl In d.Tables
        i = i + 1
        tbl.Rows.Add tbl.Rows(2)
        tbl.Rows(2).Cells(1).Range.Text = "Модель"
        tbl.Rows(2).Cells(2).Range.Text = modN(i)
    Next tbl
End Sub
С уважением,
Aksima
1
0 / 0 / 0
Регистрация: 20.12.2012
Сообщений: 51
18.03.2013, 16:09  [ТС]
Aksima, здорово! Спасибо вам большое! Дааа чувствую знание VBA достаточно сильно упростит жизнь в работе с документами. Правда мне тут говорили еще, что вроде как через Delphi можно работать с объектной моделью Word'а...

Добавлено через 6 часов 38 минут
Aksima, а можете пожалуйста объяснить смысл вот этой строчки:
Visual Basic
1
rgX.Pattern = "^.*модель.((?:-|\d)+).*$"
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
18.03.2013, 17:02
Здравствуйте, Greyzer,
Регулярное выражение трактуется следущим образом:
Code
1
2
3
4
5
модель - ищется слово "модель"
^.* - от начала строки и до слова "модель" могут быть любые символы.
(?:-|\d) - номер может включать в себя либо знак "-", либо цифру.
((?:-|\d)+) - номер должен состоять не менее чем из одного знака, описанного строкой выше.
.*$ - после номера и до конца строки могут быть любые символы.
Забыл отметить еще точку между "модель" и шаблоном номера. Она также обозначает любой символ (тот, что отделяет у вас модель от номера).

С уважением,
Aksima
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2013, 17:02
Помогаю со студенческими работами здесь

Как импортировать нужные значения из текстового файла?
Здравствуйте, форумчане! Поздравляю всех с идущими и грядущими праздниками; и, с угрызением совести от мысли, что отвлекаю вас от...

Как получить нужные значения из многомерного массива?
Всем привет! Есть массив такого типа: данные1 ( =&gt; ученик ( =&gt; 4 =&gt; Коля =&gt; 10а ...

Как foreach забрать нужные значения из списка и сформировать в строку
Добрый день, надеюсь на Вашу помощь. Имеется: public IList&lt;EcdWarranty&gt; Warraties { get; set; } private List&lt;EcdWarranty&gt;...

Как из одного столбца выбрать нужные значения и вставить в другой столбец?
Доброго времени суток! Столкнулся с проблемой: В одном столбце в ячейке есть определенный редко совпадающий текст. Нужно разделить этот...

Как при выборе значения в Combobox отобразить на форме только нужные элементы
Скажите, как можно при выборе определенного значения в Combobox отобразить на форме только нужные элементы для заполнения? Я так понимаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru