2013-02-28 3 views
2

Я хотел бы определить макрос в Microsoft Word 2007, который вставляет оглавление с предоставленными автоматическими стилями при нажатии горячей клавиши. Я успешно определен макрос для вставки (например, основной) таблицы не-стиле содержимого следующим образом:Какой код VBA следует использовать в Microsoft Word 2007 Макро для создания Оглавление

Sub InsertTableOfContents() 
' 
' InsertTableOfContents Macro 
' 
' 
    With ActiveDocument 
     .TablesOfContents.Add Range:=Selection.Range, RightAlignPageNumbers:= _ 
      True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _ 
      LowerHeadingLevel:=3, IncludePageNumbers:=True, AddedStyles:="", _ 
      UseHyperlinks:=True, HidePageNumbersInWeb:=True, UseOutlineLevels:= _ 
      True 
     .TablesOfContents(1).TabLeader = wdTabLeaderDots 
     .TablesOfContents.Format = wdIndexIndent 
    End With 
End Sub 

Однако при попытке вставить стилизованную оглавление следующим образом:

Sub InsertStyledTOC() 
' 
' Macro to insert a table of contents styled like Automatic Table 2 
' 
ActiveDocument.AttachedTemplate.BuildingBlockEntries("Automatic Table 2"). _ 
    Insert Where:=Selection.Range, RichText:=True 
End Sub 

Я получаю следующее сообщение об ошибке:

Run-time error 5941 The requested member of the collection does not exist

Я считаю, что это указывает на то, что упоминаемая член BuildingBlockEntries (например, автоматическая таблица 2) не существует, но я не ясно, почему или как исправить это.

Спасибо за помощь

Edit - я попытался использовать FilePath по умолчанию шаблон Building Blocks приложения, как предложено:

Application.Templates("C:\Program Files\Microsoft Office\Office12\Document Parts\1033\Building Blocks.dotx").BuildingBlockEntries("Automatic Table 2").Insert Where:=Selection.Range _ , RichText:=True

Однако, я все еще получаю ошибку: Run-time error 5941 The requested member of the collection does not exist

+0

Является ли TOC 'Selection.Range'? Так вы просто пытаетесь применить стиль к «Selection.Range»? Знаете ли вы, что такое «BuildingBlockEntries»? (Понятия не имею!). Попробуйте ввести это в ближайшее окно (нажмите Ctrl + G из редактора VBA): 'для i = 1 для активированного документа. AttachedTemplate.buildingblockentries.count: debug.Print activedocument.AttachedTemplate.buildingblockentries (i) .name: next i' – mkingston

+0

Кроме того, попытались ли вы записать макрос, выполнив установку желаемого стиля TOC и проверив код? – mkingston

+0

Приведенный выше код был создан в результате записи макроса, в котором я выбрал оглавление (Автоматическая таблица 2) из ​​меню «Ссылки -> Оглавление». Я еще не пробовал вводить код отладки, поэтому попробую. Извините, новичок в vba и макросах. – Christian

ответ

1

Ваш код ожидает, что строительные блоки будут найдены в прикрепленном шаблоне, который, если у вас нет сделал что-нибудь особенное, возможно, Normal.dotm. Microsoft фактически хранит встроенные строительные блоки в другом шаблоне. Если вы запишете макрос, вы увидите, где находится этот шаблон (мой находится в «C: \ Users \ owner \ AppData \ Roaming \ Microsoft \ Block Building Block \ 1033 \ 14 \ Built-In Building Blocks.dotx») ,

Итак, у вас есть два варианта. Вы можете использовать коллекцию Templates для доступа к этому шаблону и вставить из нее строительный блок (макрорекордер - ваш друг здесь). Или вы можете сохранить строительный блок в Normal.dotm, чтобы сделать доступ к нему немного проще. Для этого нажмите «Вставить»> «Быстрый текст»> «Блокировка блоков», найдите свой строительный блок в списке, отредактируйте его свойства и сохраните его в «Нормальном». Если вы это сделаете, ваш код должен работать (у меня 2010 год, но я уверен, что это очень похоже).

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

Edited добавить код, который я получаю от записи макросов:

Application.Templates(_ 
    "C:\Users\owner\AppData\Roaming\Microsoft\Document Building Blocks\1033\14\Built-In Building Blocks.dotx" _ 
    ).BuildingBlockEntries("Automatic Table 2").Insert Where:=Selection.Range _ 
    , RichText:=True 

Таким образом, вы должны попробовать заменить код в InsertStyledTOC с этим.

+0

Благодарим вас за помощь. Какая функциональность, записанная в макросе, потребует, чтобы сгенерированный код vba отображал местоположение встроенных строительных блоков? – Christian

+0

На самом деле, я нашел, где находится этот файл, 'Building Blocks', но я не уверен, как получить к нему доступ с помощью коллекции шаблонов, не могли бы вы привести пример? – Christian

+0

Добавлен код ответа. – Christina

Смежные вопросы