Arhn - архитектура программирования

Макрос vba word для помещения строки в существующий заголовок

Я пытаюсь написать макрос, который находит/заменяет строку, а затем перемещает ее в существующий заголовок. Оригинальный текст такой:

<сильный>1. Заголовок 1

ID: abcd

1.1 Заголовок 2

ID: abcd

И это должно выглядеть так:

1.Заголовок 1 abcd

1.1 Заголовок 2 abcd

У меня есть некоторые проблемы с кодом, который я пытался написать, в основном потому, что я новичок, но это то, что я создал до сих пор:

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Style = "Heading 2"
With Selection.Find
    .Text = "abcd"
    .Replacement.Text = "abcd^p"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False

End With
Selection.Find.Execute Replace:=wdReplaceAll

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

РЕДАКТИРОВАТЬ: Надеюсь, я снова не облажаюсь, извините большое :). Итак, у меня есть raw, который представляет собой необработанный текст, и я хочу обработать его, чтобы он выглядел как этот финал. Я уже разобрался, спасибо вам как заменить текст, просто застрял на сырой версии. Спасибо, у меня вроде как есть пиво или два

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Итак, у меня есть 5 типов форматов заголовков, 1. Заголовок 1, 1.1 Заголовок 2 и т. д. до 5, и все они имеют под собой идентификатор, каждый с определенным номером, но имя одно и то же, ID ASD_PC_AWP_[XXXX]. Мне просто нужно избавиться от ID ASD_PC_ и поместить AWP_[xxxx] на тот же уровень заголовка, например: 1.Heading 1 AWP_[xxxx1] ** , **2. Заголовок 2 AWP_[xxx2]...

31.10.2018

Ответы:


1

Пытаться:

Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "ID:*^13"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    Set Rng = .Duplicate.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
    Rng.End = Rng.Paragraphs.First.Range.End - 1
    Rng.InsertAfter Split(Split(.Duplicate.Text, ":")(1), vbCr)(0)
    .Text = vbNullString
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub
31.10.2018
  • Спасибо, это сработало, но с некоторыми проблемами, идентификатор находится на том же уровне, что и заголовок, но и все идентификаторы из документа. Можно ли настроить код так, чтобы он работал только в определенном стиле? например, Заголовок 1, Заголовок 2, Обычный? 01.11.2018
  • @Luca Вы должны быть более четкими в своих требованиях. Ваш первоначальный поток ничего не говорит о стиле заголовка, применяемом к идентификаторам. Более того, он изображает текст идентификатора, переназначаемый заголовкам с разными схемами нумерации, что подразумевает использование разных стилей заголовков. Вопрос в вашем комментарии выше неоднозначен; к чему относится «конкретный стиль»? 02.11.2018
  • спасибо, большое спасибо за вашу любезную помощь, пока я был расплывчатым. Код Freeflows помог мне с задачей, которую я имел, и человек, vba трудно, я должен сказать. Еще раз большое спасибо за макрос и бесплатно за вашу помощь, время и нервы со мной :P. Хорошего дня 02.11.2018

  • 2

    Выполните поиск по шаблону для любого маркера абзаца, за которым следует ID:.

    .Text = "^13ID:"
    .Replacement.Text = ""

    Вам нужно будет указать стиль текста, заменяющего стиль заголовка, потому что, когда вы удаляете маркер абзаца в конце абзаца заголовка, вы также удаляете информацию о стиле для абзаца заголовка.

    Вам нужно будет сделать это с каждым заголовком стиля, за которым следует текст ID:.

    Обновлено 1 ноября 2018 г.

    Следующий код должен работать. Я получил некоторые подсказки от оригинального кода Macropods.

    Обновление 2 2018-11-01

    Пересмотрено для работы со списком стилей, определенных пользователем по запросу ОП.

    Sub ConsolidateHeadingWithID()
    
    Const HEADINGS                                   As String = "Heading 1,Heading 2,Heading 3,Heading 4,Heading 5,Other style,another style"
    
    Dim my_headings                                 As Variant
    Dim my_heading                                  As Variant
    my_headings = Split(HEADINGS, ",")
    
    For Each my_heading In my_headings
    
            With ActiveDocument.StoryRanges(wdMainTextStory)
    
                With .Find
    
                    .ClearFormatting
                    .format = True
                    .Text = ""
                    .Style = my_heading
                    .MatchWildcards = True
                    .Wrap = wdFindStop
                    .Execute
    
                End With
    
                Do While .Find.Found
    
                    If .Duplicate.Next(unit:=wdWord).Text = "ID" Then
    
                        .Duplicate.Next(unit:=wdParagraph).Style = my_heading
    
                    End If
    
                    .Collapse wdCollapseEnd
                    .MoveStart unit:=wdCharacter, Count:=2
                    .Find.Execute
    
                Loop
    
            End With
    
            With ActiveDocument.Range.Find
    
                .ClearFormatting
                .format = True
                .Text = "(^13)(ID:)(*)(AWP_)([0-9]{1,})"
                .Style = my_heading
                .Replacement.Text = " [\4\5]"
                .MatchWildcards = True
                .Wrap = wdFindContinue
                .Execute Replace:=wdReplaceAll
    
            End With
    
        Next
    
    End Sub
    
    31.10.2018
  • Спасибо, я пробовал писать так: .Text = ^13ID*ASD_PC_AWP_([0-9]@)([0-9]@)([0-9]@)^13 .Replacement.Text = [AWP_ \1\2\3] .Style = Заголовок 2 Но ничего не происходит, возможно я ошибся. И я установил Wildcards = True, а также Format... 31.10.2018
  • Это потому, что ваш вопрос не отражает того, что вы на самом деле пытаетесь сделать. Как и в предыдущем вопросе, с которым я вам помог. Обновите свой вопрос, чтобы отразить фактический текст для поиска и желаемый результат. Пожалуйста, не добавляйте никаких ложных []. 31.10.2018
  • Я отредактировал основной вопрос, надеюсь, теперь стало лучше :). 31.10.2018
  • Очень плохое обновление, так как люди не знают, что меняется, пока не перейдут по ссылкам на изображения. Текст поиска должен быть "(^13)(ID:)(*)(AWP_)([0-9]{1,})", а текст замены должен быть "\4\5". Обратите внимание, что \n в поле замены не будет работать, если вы не укажете поля в строке поиска. Поля заключены в (). Вам также может понадобиться включить .font.bold=false в логику замены. 31.10.2018
  • Ну, может быть, потому что я не очень хорошо умею записывать, поэтому поместил туда изображения, извините за это. Я просто пытаюсь понять vba и логику всего этого всего за 2-3 дня и попытался объяснить, как я мог. Спасибо, я постараюсь прикрепить ваш код и посмотреть, что я получу. 31.10.2018
  • @Freeflow Вопрос перед правками достаточно ясен. Каким может быть «фактический текст», не имеет значения. 01.11.2018
  • Возможно, мы не синхронизированы с правками OP, поскольку я не помню, чтобы вопрос выглядел так, как сейчас, когда я делал свои комментарии. Извиняюсь перед всеми, если я столкнулся с немного тупым. Я понял, что ОП хочет изменить, например. «1.1 Заголовок уровня 2 ‹crlf›ID:‹?›ASD_PC_AWP_XXXX‹crlf›» на «1.1 Заголовок уровня 2 [AWP_XXXX]‹crlf›» при сохранении стиля, примененного к 1.1 Заголовок уровня 2. 01.11.2018
  • Freeflow, спасибо, я попробовал ваш код, но он не сохраняет примененные стили. 01.11.2018
  • Я снова взглянул на него и на гениальный код Macropod и нашел решение, которое работало с созданным мной тестовым документом. Я разместил код как обновление к моему ответу выше. 01.11.2018
  • да, это ответ, большое спасибо. Просто быстрый вопрос: не могли бы вы сказать мне, легко ли адаптировать ваш код, чтобы использовать его и для других стилей? Если это уже не слишком много, потому что вы много сделали, еще раз спасибо :) (ps: спрашиваю, потому что я не знаю, что принесет ближайшее будущее, и я не работаю с VBA :(.) 01.11.2018
  • Мой предыдущий комментарий потерялся, но, если вы не заметили, я обновил код, чтобы использовать список пользовательских стилей. 02.11.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..