#1
|
|||
|
|||
Hello all,
I've written a small macro that does the following:
It works more or less as I want it to, however, the problems is that I need to use it on large documents (~600 pages, containing a couple of hundreds of heading5s), which either takes a long time or crashes Word. My question is if it is possible to do this in a more optimal way. This is the first time I'm fiddling with VBA, so I don't really know how to approach this performance issue. See my code below, any input is appreciated! Code:
Sub InsertTable() Dim tempTable As Paragraph Dim lineCount As Long Application.ScreenUpdating = False ActiveDocument.DeleteAllEditableRanges wdEditorEveryone lineCount = 0 strTableloc = "INSERT TABLE HERE" strSection2start = "SECTION 2 START" strSection2end = "SECTION 2 END" strSection4start = "SECTION 4 START" strSection4end = "SECTION 4 END" For Each tempTable In ActiveDocument.Paragraphs If tempTable.Style = ActiveDocument.Styles(wdStyleHeading5) Then tempTable.Range.Editors.Add wdEditorEveryone lineCount = lineCount + 1 End If Next ActiveDocument.SelectAllEditableRanges wdEditorEveryone Selection.Copy Set rng1 = ActiveDocument.Range With rng1 With .Find .Text = strTableloc If .Execute = True Then ActiveDocument.Range(rng1.Start, rng1.End).Select End If End With End With Selection.TypeParagraph Selection.PasteAndFormat (wdFormatPlainText) 'select the whole list Selection.MoveUp Unit:=wdLine, Count:=lineCount, Extend:=wdExtend 'create table from the list Selection.ConvertToTable Separator:=wdSeparateByTabs, _ NumColumns:=6, NumRows:=lineCount ', AutoFitBehavior:=wdAutoFitFixed With Selection.Tables(1) .ApplyStyleHeadingRows = True .ApplyStyleLastRow = False .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = False .LeftPadding = 0 .RightPadding = 0 End With Selection.Cut Selection.PasteAppendTable InsertSectionBrake strSection2start InsertSectionBrake strSection2end InsertSectionBrake strSection4start InsertSectionBrake strSection4end Selection.GoTo What:=wdGoToSection, Which:=wdGoToAbsolute, Count:=2 Selection.PageSetup.Orientation = wdOrientLandscape Selection.GoTo What:=wdGoToSection, Which:=wdGoToAbsolute, Count:=4 Selection.PageSetup.Orientation = wdOrientLandscape ActiveDocument.DeleteAllEditableRanges wdEditorEveryone Application.ScreenUpdating = True End Sub Sub InsertSectionBrake(reference) Set rng1 = ActiveDocument.Range With rng1 With .Find .Text = reference If .Execute = True Then ActiveDocument.Range(rng1.Start, rng1.End).Select End If End With End With Selection.InsertBreak Type:=wdSectionBreakNextPage Selection.EndKey Unit:=wdLine, Extend:=wdExtend Selection.Delete Unit:=wdCharacter, Count:=2 End Sub
Thanks again for your help. |
#2
|
||||
|
||||
Try the following code. As you'll see, you really don't need all your indicators for where to insert the breaks. All this stuff:
SECTION 2 START SECTION 2 END SECTION 4 START SECTION 4 END can be deleted from the document. What I don't understand, though, is why your document isn't pre-configured with the required Sections & page layouts. Code:
Option Explicit Sub InsertSummaryTable() Application.ScreenUpdating = False Dim RngTbl As Range, RngSctn As Range With ActiveDocument.Range With .Find .Text = "Chapter 2" .Style = "Heading 1" .Format = True .Wrap = wdFindContinue .Execute End With If .Find.Found = True Then Set RngSctn = .Paragraphs.Last.Next.Range.Paragraphs.Last.Range With RngSctn .Characters.First.InsertBreak wdSectionBreakNextPage .Start = .Start + 1 .Sections.First.PageSetup.DifferentFirstPageHeaderFooter = False .End = .End + 1 .Characters.Last.InsertBreak wdSectionBreakNextPage .Sections.First.PageSetup.Orientation = wdOrientLandscape End With End If With .Find .Text = "Chapter 3" .Style = "Heading 1" .Execute End With If .Find.Found = True Then Set RngSctn = .Duplicate.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel") Set RngTbl = RngSctn.Tables(1).Range.Characters.Last.Next.Paragraphs.First.Range With RngSctn .End = .End + 1 .Characters.First.InsertBreak wdSectionBreakNextPage .Characters.Last.InsertBreak wdSectionBreakNextPage .Start = .Start + 1 .Sections.First.PageSetup.Orientation = wdOrientLandscape End With ActiveDocument.TablesOfContents.Add Range:=RngTbl, _ RightAlignPageNumbers:=False, UseHeadingStyles:=True, _ UpperHeadingLevel:=5, LowerHeadingLevel:=5, _ IncludePageNumbers:=False, UseHyperlinks:=False DoEvents With RngTbl .End = .End + 1 .End = .Fields(1).Result.End .Fields(1).Unlink .ConvertToTable Separator:=wdSeparateByTabs, _ NumColumns:=6, NumRows:=.Paragraphs.Count, AutoFit:=False DoEvents With .Tables(1) .Borders.Enable = True .ApplyStyleHeadingRows = True .ApplyStyleLastRow = False .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = False .Range.Cut End With End With RngSctn.Tables(1).Select Selection.Collapse wdCollapseEnd Selection.PasteAppendTable End If End With Application.ScreenUpdating = True End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
|||
|
|||
Hello macropod,
sorry for not replying in such a long time, I was on vacation. Thank you for the great help you've provided. Yours solution does everything I need and the code will for sure serve as reference when I'll try to write some other scripts as well. Thanks again! |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Fixed last page header/footer without the use of section breaks | HelpNeed | Word VBA | 2 | 06-27-2017 06:15 PM |
Table of contents with section breaks (text in table in header) | Dmonk | Word | 2 | 05-23-2017 04:29 AM |
Auto section break macro - want to have no header on first page of document | cspeid03 | Word | 1 | 05-17-2017 12:18 PM |
Hidden page breaks and section breaks | jrasicmark | Word | 3 | 06-02-2014 11:28 PM |
Deleted Section Breaks Changes Page Breaks | Brantnshellie | Word | 0 | 02-01-2009 09:22 PM |