Макрос для запуска строительного блока для определенного текста в документах MS Word

Я ищу макрос, который запускает и запускает строительный блок для определенного текста в документах MS Word.

мне нравится этот код ниже, полученный с этого форума. Но меня интересует, как найти конкретный текст и автоматически запустить этот макрос.

Например: если в моих документах Word есть текст «MyBB», то мне нужен строительный блок с именем «MyBB», который появится автоматически после запуска кода.

я сохранил много строительных блоков и активировал их с помощью клавиши F3 для определенного текста в повседневной работе.

Нужна помощь в изменении кода, который запускает упомянутое выше

Sub InsertMyBB()
'
' Assumes that the Building Block is of the type AutoText (wdTypeAutoText) in Category "General"
' See https://msdn.microsoft.com/en-us/library/bb243303(v=office.12).aspx
'
' This is based in part upon contributions from Greg Maxey and Jay Freedman - any errors remain mine
' Written by Charles Kenyon February 2016
'
Dim sBBName As String
Dim sTempName As String
Dim oBB As BuildingBlock
sBBName = "MyBB" 'use the name of your building block instead of "MyBB"
sTempName = ThisDocument.FullName ' puts name and full path of template in string variable
On Error Resume Next
Application.Templates.LoadBuildingBlocks  ' thank you Timothy Rylatt
Set oBB = Application.Templates(sTempName).BuildingBlockTypes(wdTypeAutoText) \_
.Categories("General").BuildingBlocks(sBBName)
If Err.Number = 0 Then
oBB.Insert Selection.Range, True
Else
MsgBox Prompt: = "The Building Block '" & sBBName & "' cannot be found in " & \_
ThisDocument.Name & ".", Title: = "Didn't Work!"
End If
On Error GoTo 0
lbl_Exit:
Exit Sub
End Sub
Sub INSERTTABLE()
Dim strSearch As String


    strSearch = "3000"
    
    Selection.Find.ClearFormatting
    With Selection.Find
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindStop
        .MatchCase = True
        .Format = True
        .Text = strSearch
        .Execute
    Do While Selection.Find.Found = True And icount < 1000
    icount = icount + 1
    Selection.HomeKey unit:=wdStory
       Selection.Find.Execute
    Selection.Range.InsertAutoText
     
     Loop
   
    strSearch = "5000"
      Selection.Find.ClearFormatting
    With Selection.Find
         .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindStop
        .MatchCase = True
        .Format = True
        .Text = strSearch
        .Execute
    Do While Selection.Find.Found = True And icount < 1000
    icount = icount + 1
    Selection.HomeKey unit:=wdStory

    Selection.Find.Execute
    Selection.Range.InsertAutoText

    Loop
   
    End With
    End With
   End Sub

Вы спрашиваете, как найти в документе все экземпляры «MyBB» и заменить этот текст тем, что находится в стандартном блоке? Или вы просите более общий подход, при котором код ищет все экземпляры текста, соответствующие имени любого строительного блока?

Tim Williams 16.08.2024 18:00

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

devlin carnate 16.08.2024 18:10

Да. Найдите все экземпляры «MyBB» в документе Word, и его следует изменить на таблицу/строительный блок. Я сохранил строительный блок как «MyBB».

Scan 2020 16.08.2024 18:20

Но код должен искать только «MyBB»?

Tim Williams 16.08.2024 18:53

Да. Я думаю, что если что-то получится, мы сможем найти следующий текст с помощью команды цикла и использовать тот же код, чтобы получить строительный блок.

Scan 2020 16.08.2024 19:08

Где хранятся ваши строительные блоки? И где хранится код? В вашем «Нормальном» шаблоне?

Tim Williams 16.08.2024 19:11

Только обычный шаблон.

Scan 2020 16.08.2024 19:32

Это мой макрос, который можно найти на моей странице «Автотекст», «Автозамена» и «Строительные блоки». addbalance.com/usersguide/…

Charles Kenyon 16.08.2024 21:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Sub CheckAllBB()
'
' Assumes that the Building Block is of the type AutoText (wdTypeAutoText) in Category "General"
' See https://msdn.microsoft.com/en-us/library/bb243303(v=office.12).aspx
'
' This is based in part upon contributions from Greg Maxey and Jay Freedman - any errors remain mine
' Written by Charles Kenyon February 2016
'
    Dim sBBName As Variant, sTempName As String
    Dim oBB As BuildingBlock, oBBT As BuildingBlockType, doc As Document
    
    sTempName = ThisDocument.FullName
    Application.Templates.LoadBuildingBlocks  ' thank you Timothy Rylatt
    Set oBBT = Application.Templates(sTempName).BuildingBlockTypes(wdTypeAutoText)
    
    Set doc = ActiveDocument 'the document with placeholders to be replaced
    
    'loop over building block names
    For Each sBBName In Array("MyBB1", "MyBB2", "MyBB3")
        Set oBB = Nothing    'reset to nothing
        On Error Resume Next
        'Try to get the building block
        Set oBB = oBBT.Categories("General").BuildingBlocks(sBBName)
        On Error GoTo 0
        
        If Not oBB Is Nothing Then 'got the building block?
            ReplaceAllBB doc, oBB  'perform the replacement(s)
        Else
            MsgBox "The Building Block '" & sBBName & "' cannot be found in " & _
                    ThisDocument.Name & ".", vbExclamation, "Building Block not found"
        End If
    Next sBBName
        
End Sub


Sub ReplaceAllBB(doc As Document, BB As BuildingBlock)
    Dim allBB As New Collection, rng As Range
    Set rng = doc.Range
    With rng.Find
        .Forward = True
        .Text = BB.Name
        .MatchWholeWord = True
        Do While .Execute
            allBB.Add rng.Duplicate
        Loop
    End With
    Debug.Print "Found " & allBB.Count; " instances of '" & BB.Name & "'"
    For Each rng In allBB
        BB.Insert rng, True
    Next rng
End Sub

Спасибо за ваш ответ. Сохранил код в обычном режиме VBA. После запуска кода появляется список всплывающих окон макросов, в которых не удается найти «ReplaceALLBB», а также он отмечен в поле списка макросов и не отображается ни в одной группе.

Scan 2020 17.08.2024 07:17

Вам нужно вызвать его из своего кода, например ReplaceAllBB ActiveDoument, oBB

Tim Williams 17.08.2024 09:11

'Sub replaceAllBB() с activedocument.Content Dim allBB как новая коллекция, rng как диапазон с rng.Find .Forward = True .Text = BB.Name .MatchWholeWord = True Do While .Execute allBB.Add rng.Duplate Loop End With Debug .Распечатать «Найдено» & allBB.Count; " Экземпляры '" и BB.Name и "'" для каждого кольца во всех BB BB.Insert rng, True Next rng End With End Sub'

Scan 2020 19.08.2024 16:33

Новое в коде макроса/vba. извините, что беспокою всех. я получаю ошибку № 91 «переменная объекта или переменная блока не установлена»

Scan 2020 19.08.2024 16:36

Пожалуйста, не делитесь кодом через онлайн-файлы — вы можете отредактировать свой вопрос, добавить туда свой код и объяснить конкретную проблему, с которой вы столкнулись.

Tim Williams 20.08.2024 18:33

Хорошо, конечно. Ссылка на онлайн удалена. Выше добавлена ​​новая таблица под кодовым названием «Вставка». Я не могу запустить два макроса с помощью цикла cmd.

Scan 2020 20.08.2024 19:29

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

Tim Williams 20.08.2024 19:53

Спасибо Тиму Уильямсу и Чарльзу Кеньону за поддержку с кодами и разъяснениями. Изучил несколько, искал несколько, и, наконец, пришел полный набор кода, который выполнил то, что мне было нужно. Это сэкономило 1 час из моего 9-часового рабочего времени. :)

Scan 2020 21.08.2024 15:56

Другие вопросы по теме