Posts Tagged ‘macros’


Word: Macro to show the Modern Comments pane and reduce its width

May 21, 2021

If you have Word 365’s new Modern Comments, you’ve probably figured out that they open by default in Contextual (floating) view and that there’s an option (on the Review tab) to change that to List view (i.e. a Comments pane docked to the right of the workspace). You may have also figured out that you can resize that window by dragging the vertical divider left (to make it wider) or right (to make it narrower). The size you select is carried over to any new documents you create in the same session, but not to documents you opened earlier, and is NOT remembered the next time you open Word. Which means you have to set this up again.

I created a macro that you can assign to a keyboard shortcut or Quick Access Toolbar icon that:

  • opens the Comments in List view (even if they were closed or were already displayed in Contextural or List view), AND
  • resizes the width of the Comments pane to a value you specify in the macro (in my macro, it’s 300, but experiment with this—I found 200 was too narrow for my laptop where I tested this, and 500 was too wide).
Sub CommentsPane()
' CommentsPane macro
' Opens the Modern Comments pane (List view) at the width specified
' Created by Rhonda Bracey, Cybertext Consulting Pty Ltd, 21 May 2021

    With Application.CommandBars("Comments")
        .Visible = True
        .Width = 300
    End With

End Sub


Word: Batch convert old DOC documents to DOCX

November 22, 2020

I was going through some folders and found quite a number of Word files in DOC format that I created before I started using Word 2007, which was when the DOCX format was introduced. While I can open each and save it as DOCX, that becomes very tedious if you have more than a few to do. Off to the internet to see if there was a macro or other way of batch converting DOC files to DOCX files.

The two that offered the most promise were a macro from the makers of Kutools ( and a converter program ( I thought I’d try the macro first, and as it worked fine for what I wanted, I didn’t download and test the converter program.

Notes about the macro:

  • When testing, put the DOC files into a temporary folder and run the macro on that folder. You can copy the resulting DOCX files to the correct folder later. Once you are confident it works as expected, you could run the macro on the original folder.
  • Subfolders are ignored. The macro only works on the selected folder.
  • All the DOC files are opened briefly, then saved as DOCX, without your intervention. Let the macro run until it finishes.
  • All the new DOCX files will have the current date as the date of creation. All original date creation and modification information will be lost, and also possibly original author information (I didn’t check this).
  • If there are already DOCX files of the same name in the folder, this process will overwrite them automatically. This isn’t usually an issue, but if at some point you manually saved a DOC file as DOCX, then modified it, the converted DOCX file will overwrite that modified file. This is why it’s advisable to do these conversions in a separate folder to the original, then copy back once done.
  • If some of the DOC files are quite old, you may get a message that it cannot save Word 95 binary files (or similar), and the macro will not run. To include these documents in the conversion, got to File > Options in Word, then select Trust Center. Click Trust Center Settings, then go to File Block Settings. Uncheck the boxes for relevant file types that the macro got hung up on. Don’t forget to change this back later!

And in case that macro ever goes missing from the website linked above, I’ve pasted it here, with some additional comments. If you use this one, copy it all—do not retype it as several lines go off the page:

Sub ConvertDocToDocx()
' Opens all DOC files in a folder and saves as DOCX files
' Asks for the folder location of the DOC files when you run the macro
' If DOCX files of the same name exist in the folder, it will overwrite them
' Recommendation: Put DOC files into a separate folder and run there
' NOTE: Converted files will have today's date---original file date is lost forever

' From: by ExtendOffice 20181128
' From (22 Nov 2020):

    Dim xDlg As FileDialog
    Dim xFolder As Variant
    Dim xFileName As String
    Application.ScreenUpdating = False
    Set xDlg = Application.FileDialog(msoFileDialogFolderPicker)
    If xDlg.Show <> -1 Then Exit Sub
    xFolder = xDlg.SelectedItems(1) + "\"
    xFileName = Dir(xFolder & "*.doc", vbNormal)
    While xFileName <> ""
        Documents.Open FileName:=xFolder & xFileName, _
            ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, _
            PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
            WritePasswordDocument:="", WritePasswordTemplate:="", Format:= _
            wdOpenFormatAuto, XMLTransform:=""
        ActiveDocument.SaveAs xFolder & Replace(xFileName, "doc", "docx"), wdFormatDocumentDefault
        xFileName = Dir()
    Application.ScreenUpdating = True
End Sub

[Links last checked 22 November 2020]



Word: Macro to find and highlight a set of specified words

February 22, 2020

This is a simpler version of a previous blog post—it doesn’t require you to set up and store a separate file of the words you want to highlight.

I wanted to create a list of vague words (such as some, most, often, frequently, sometimes—words that aren’t explicit or specific enough in technical writing and editing) that a simple Microsoft Word macro could find and highlight for me. I found some macros online that each partly solved the problem, and adapted one from Macropod (Paul Edstein) to suit my purposes as it was the closest to what I wanted. Full thanks to Macropod for this one.

There are several ways you can adapt this macro—I’ve commented some of my ideas in the code. I think the words are case sensitive, so if you want one with a capital (e.g. Some), you should add it as another entry.

NOTE: Copy all the code below to the clipboard—it goes off the page, so don’t type it out as you’ll miss some of it or could make a typo—then paste it into your VBA window.

Sub VagueWords()

' Source: Paul Edstein (Macropod), 8 Aug 2015:
' Original macro name: MultiReplace
' Adapted by Rhonda Bracey, Cybertext Consulting, 22 Feb 2020
' You could duplicate this macro with a different name (e.g. LegalWords [for must, shall, etc.]) using a different list of words in the StrFind and StrRepl lists

Dim StrFind As String
Dim StrRepl As String
Dim i As Long

' In StrFind and StrRepl, add words between the quote marks, separate with a comma, NO spaces
' To only highlight the found words (i.e. not replace with other words), either use StrRepl = StrFind OR use the SAME words in the same order in the StrRepl list as for the StrFind list; comment/uncomment to reflect the one you're using
' To replace a word with another and highlight it, put the new word in the StrRepl list in the SAME position as the word in the StrFind list you want to replace; comment/uncomment to reflect the one you're using

StrFind = "very,just,rarely,often,frequently,majority,most,minority,some,perhaps,maybe,regularly,sometimes,occasionally,best,worst,worse,better,seldom,few,many"
StrRepl = StrFind
' StrRepl = "very,just,rarely,often,frequently,majority,most,minority,some,perhaps,maybe,regularly,sometimes,occasionally,best,worst,worse,better,seldom,few,many"
Set RngTxt = Selection.Range

' Set highlight color - options are listed here:
' main ones are wdYellow, wdTurquoise, wdBrightGreen, wdPink
Options.DefaultHighlightColorIndex = wdTurquoise

Selection.HomeKey wdStory

' Clear existing formatting and settings in Find and Replace fields

With ActiveDocument.Content.Find
  .Format = True
  .MatchWholeWord = True
  .MatchAllWordForms = False
  .MatchWildcards = False
  .Wrap = wdFindContinue
  .Forward = True
  For i = 0 To UBound(Split(StrFind, ","))
    .Text = Split(StrFind, ",")(i)
    .Replacement.Highlight = True
    .Replacement.Text = Split(StrRepl, ",")(i)
    .Execute Replace:=wdReplaceAll
  Next i
End With
End Sub

For another way to do this, but instead changing the colour of a selected set of words, see

Update Oct 2020: A professor has made a YouTube video for his students/colleagues of this in action:

[Links last checked June 2020]


Word: Macros to switch from No Markup to All Markup views

June 2, 2019

I worked on a 350p technical report the past two weeks, and was forever switching between No Markup (Final) view and All Markup (Final: Show Markup [i.e. track changes]) view. Moving the mouse to do that got old pretty quick, even though I have that control on my Quick Access Toolbar. What I needed was a keyboard command or two to flip between views. Well, I couldn’t find one! I couldn’t even find the command in the list of all commands. That’s not to say one doesn’t exist—just that I couldn’t find it. Update 5 June 2019: Angela, one of this blog’s subscribers, had a solution that she shared with me. I’ll leave the other macros in this post, but if you want one that just does it all in one toggle command, skip the information below and scroll down to the end under ‘Angela’s solution’.

What to do? Well, one way to get a keyboard shortcut it to create a macro that does what you want to do, and then assign a keyboard shortcut to it. That’s what I ended up doing, except I had to create two macros—one for showing and one for hiding the track changes (I couldn’t figure out how to create a ‘toggle’ macro that used the same command to turn on and off, depending on the current state). And I assigned these keyboard shortcuts that had some logic for me: Ctrl+Shift+{ (i.e. open the bracket) to show the markup, and Ctrl+Shift+} (i.e. close the bracket) to hide the markup. But you can use whatever shortcut that works for you.

The two macros I wrote are below. Once you’ve added them to you VBA area, assign a keyboard shortcut to them from the Customize Ribbon options area.

This macro shows all markup:

Sub MarkupViewAll()
' Shows All Markup view for markup (i.e. shows track changes)
' Created by Rhonda Bracey, CyberText Consulting, 31 May 2019
    With ActiveWindow.View
        .ShowRevisionsAndComments = True
    End With
End Sub

This macro shows the final view:

Sub MarkupViewFinal()
' Shows Final view for markup (i.e. hides track changes)
' Created by Rhonda Bracey, CyberText Consulting, 31 May 2019
    With ActiveWindow.View
        .ShowRevisionsAndComments = False
        .RevisionsView = wdRevisionsViewFinal
    End With
End Sub

I’m sure somebody cleverer with macros than me could write something more elegant (such as using the one macro and keyboard shortcut to toggle the view depending on the current view—if you know how to do that, feel free to contribute in the comments.

Angela’s solution

NOTE: Some of this macro goes off the page—to get it all, copy this macro, don’t retype it.

Sub ToggleMarkupViewAllToFinal()
' Toggles from Markup view all to Markup view final
    ActiveWindow.View.ShowRevisionsAndComments = Not ActiveWindow.View.ShowRevisionsAndComments
End Sub

Thanks Angela! (by the way, I assigned Alt+m as my keyboard shortcut for this—it works a treat!


Word: Macro to insert a landscape page

May 14, 2019

A client wanted an easy way for her staff to insert a landscape page into a report without messing up the headers and footers. I recorded a macro that does just that, but it relies on headers and footers being laid out using the alignment tabs, not borderless tables. Alignment tabs are much better than inserting tabs yourself as they automatically adjust if you change the page layout.

Note: If you use borderless tables for your headers and footers, this macro will still work, but you’ll have to manually turn off the Link to Previous options for the landscape page’s headers and footers and also for the following portrait page. I might see if I can tweak the macro to do that—if so, I’ll write it up as a separate blog post.

Step 1: Set up alignment tabs for the headers and footers

  1. Open a new Word document (or the template if you want to set this up in your template).
  2. Double-click in the header area to open the header. The cursor will be at the left margin.
  3. Optional: Add any text you want positioned at the left.
  4. In the Header & Footer Tools tab > Position group, click Insert Alignment Tab.
  5. By default the next position is Center. Make sure it’s selected, then click OK.
  6. Optional: Add any text you want positioned in the centre.
  7. Click Insert Alignment Tab again.
  8. Select Right then click OK.
  9. Optional: Add any text you want positioned at the right.
  10. In the Header & Footer Tools tab > Navigation group, click Go to Footer.
  11. Repeat steps 3 to 9 above for the footers.
  12. Double-click in the main body of the document to close the header/footer area.

Step 2: Install and run the macro

The macro you will use to insert a landscape section is listed below these steps.

  1. Go to the View tab >Macros group, then select View Macros from the drop-down list.
  2. In the Macro Name field, type InsertLandscape (if you have other macros listed, the one listed first will be in that field—just type over it)
  3. Click Create. This opens the Visual Basic for Applications (VBA) window, with these lines already inserted:
    Sub InsertLandscape()
    ‘ InsertLandscape macro
    End Sub
  4. Copy the macro below this set of steps.
  5. Paste it into the blank area above End Sub.
  6. Save the change and close the VBA window. (If you’re working in a template and only want this macro available to documents based on that template, then select the template name from the Macros in field.)
  7. Test the macro by running it:
    • Go to the View tab >Macros group, then select View Macros from the drop-down list.
    • Select the InsertLandscape macro.
    • Click Run.
  8. A landscape section should be inserted into your document, and the headers and footers should all align correctly for the landscape section.


' Inserts a landscape section, adjusts headers and footers
' Created by Rhonda Bracey, CyberText Consulting, May 2019
Selection.InsertBreak Type:=wdSectionBreakNextPage
Selection.InsertBreak Type:=wdSectionBreakNextPage
Selection.MoveUp Unit:=wdLine, Count:=2
If Selection.PageSetup.Orientation = wdOrientPortrait Then
Selection.PageSetup.Orientation = wdOrientLandscape
Selection.PageSetup.Orientation = wdOrientPortrait
End If
ActiveWindow.ActivePane.SmallScroll Down:=-3
ActiveWindow.ActivePane.LargeScroll Down:=1

What this macro does:

  • Inserts an empty paragraph.
  • Inserts a Next Page section break.
  • Inserts two more empty paragraphs.
  • Inserts another Next Page section break.
  • Moves the cursor back up to one of the empty paragraphs between the two section breaks.
  • Changes the area between the section breaks to Landscape orientation.

Word: Macro-enabled templates stripped by Dropbox?

May 2, 2019

Well, well, well! I haven’t encountered this before, but it looks as though stripped the macros from two Word templates I created for a client earlier this week.

I’d emailed her the templates (dotm files) on Tuesday, and sent some follow-up notes on Wednesday. Today (Thursday) she contacted me to ask if I’d sent the templates because she hadn’t received them. I thought that maybe her email provider’s security settings were stopping them getting through, so I zipped them up and emailed her the zip file. The zip file didn’t get to her either, so I created a folder for her in my account and put the individual template files there and sent her the link to the folder.

She was able to download the templates, but when she tried to run them, she got error messages about the macros. She contacted her IT people and me. I’ve just got off the phone with her IT guy—he also had trouble with the templates and had macro error messages, and when I walked him through where the macros should be, they weren’t there. I emailed him a zip file, but he didn’t get that either. I also put the zip file into the folder, and he was able to get that. Once he’d extracted the files locally, he was able to open a new document based on the template successfully AND run the macros without error. He also did some quick Googling and found that DOES strip macros from Word templates. But not from those files stored in zip files—yet.

What are we to do? I use Word macros to save myself and authors enormous amounts of time. This is part of my job. My clients want quick and easy ways to apply corporate formatting to imported Excel tables and the like, to add landscape pages without angst, and so on. I create or modify macro-enabled templates for my clients and need to send the revised versions to them. If email settings and now are either not allowing the templates through, or are stripping the macros out of them, how are those of us who live remotely from our clients meant to do our jobs?


Word: Macro to autofit all tables to the window size

February 17, 2019

Some 11 years ago, I published a macro for setting all tables to autofit to the width of the page (i.e. within the page margins). Here’s a slightly different version written by Stefan Blom in 2012—his original macro was called SetFitToWin, but I’ve modified that for my purposes so I can easily see from the name what this macro does. Copy/paste all the text of this macro—some goes off the page, so don’t retype it because you might miss some.

Sub SetTableToFitToWindow()
' From Stefan Blom (April 2012):
' Adapted title (was SetFitToWin), Rhonda Bracey, Cybertext Consulting, Feb 2019

    Dim t As Table
    For Each t In ActiveDocument.Tables
        t.AutoFitBehavior wdAutoFitWindow
    Next t
End Sub

The same caveats apply as per the original blog post in 2008—this changes ALL your tables, so test on a copy of your document first to make sure you don’t inadvertently change tables you didn’t want to change.

[Links last checked February 2019]


Word: Macro to add left and right padding to all table cells in a document

January 18, 2019

Here’s an issue I found in a document I was editing this week—someone had set most of the tables to have 0 cm padding for the left and right margins of each cell (the default is 0.19 cm for metric users). This meant the text butted right up against the cell borders (it was most noticeable on the left as I was using ragged right justification). I needed to change the cell padding back to 0.19 cm.

This is easy enough to do if you’ve only got one or two tables to fix (select the table, right-click and select Table Properties; on the Table tab, click Options, then set the left and right margins to 0.19 cm; click OK to save and exit).

But this was a nearly 300-page document with hundreds of tables, many of which had their margins set to 0 cm. Off to Google to see if someone had a quicker way. They did. I tested the macro and modified it a bit for my purposes, then ran it on a copy of my big document and fixed the problem on all tables in my document in seconds.


  • This macro will set the left and right margin padding for ALL tables in your document. In most cases that’s what you’ll want, but if you want some tables to have different padding, change those tables or cells manually after running this macro.
  • ALWAYS test on a copy of your document before running the macro on your main document!

Here’s the macro (I suggest you copy it from here so that you get all of it—on some devices, the text may go off the screen):

Sub TablePadding()
' TablePadding Macro
' Adapted from a macro by Greg Maxey:
' Set left and right cell padding for ALL table cells to 0.19 cm
Dim oTbl As Word.Table
 For Each oTbl In ActiveDocument.Tables
    oTbl.LeftPadding = CentimetersToPoints(0.19)
    oTbl.RightPadding = CentimetersToPoints(0.19)

Thanks to Greg Maxey for the original macro that I modified. If you want to change the padding to be smaller or larger, change the 0.19 value to a smaller or larger number.


Word: Macro to set the language for ALL styles

September 21, 2018

One of the issues with setting the language for a Word document is that DOESN’T change the language set for the styles. If you’re lucky, your styles use the same language as your default language, but sometimes they don’t (especially if the document has come from authors in other countries). This can result in some strange behaviour under specific circumstances.

I have a macro for setting the language for all ‘ranges’ in a document, but I needed something to change the language settings for ALL styles in one command. After a bit of internet sleuthing, I came across an answer that looked promising and modified it to suit my purposes. It works! I tested it on a sample document, where I’d set the language for Normal to Alsatian, for Heading 1 to Afrikaans, and for Heading 2 to English (US). The only text I had in the document used Normal style, but that didn’t matter—the language settings for the styles still changed to the one I’d specified in the macro. In my case, that’s English (Australian) [in VBA code that’s wdEnglishAUS].

The only thing you need to change in this macro is the LanguageID. Here are some common ones for English:

  • wdEnglishAUS
  • wdEnglishCanadian
  • wdNewZealand
  • wdEnglishSouthAfrica
  • wdEnglishUK
  • wdEnglishUS.

Here’s the macro (copy it—some of it may go off the page, so if you type it you may miss some):

Sub ChangeLangStyles()

' Macro to change language in styles
' Adapted from Macropod (17 July 2012)

Dim oDoc As Document, oSty As Style
Set oDoc = ActiveDocument
    With oDoc
        For Each oSty In .Styles
            On Error Resume Next
            oSty.LanguageID = wdEnglishAUS
            On Error GoTo 0
    End With
End Sub

I adapted it from one shared by Macropod back in July 2012:, and full acknowledgement goes to him.

[Links last checked September 2018]


Word: Macro to convert from one style to another

September 11, 2018

I should have hunted this out years ago. My main client has a habit of changing templates every couple of years, which means the old docs have to go onto the current template when they get revised. It’s a pain and involves quite a few steps (and up to several hours) per document. I still have to do the cover page and headers/footers manually, and all the landscape/portrait sections, but now I’ve got a way to convert styles in the older template to differently named styles in the newer template. For styles with the same name, no such conversion is necessary, but when the old style is called ‘Table Bullet 1’ and the new one is called ‘Table Bullet’ you have to either reapply the correct style everywhere it is used (ugh!), do a global find and replace for the style, or do a ‘select all’ for the style and then click the new style to apply it.

Some caveats:

  • Test first. Test on a COPY of the old document before doing it on the original copy, and any other documents in the set.
  • Make sure you’ve applied the new template to the old document so that the new styles are available in the document. (or, use the Organizer to copy styles across from the old template to the new [longer, slower method]).
  • Make a list of the old styles and the matching, but differently named, new styles—make sure you write down the style names EXACTLY (including any hyphens in the style name) otherwise this macro won’t work.
  • This macro runs a find and replace and replaces ALL. Test first.

Acknowledgements: I modified the macro written by Christina and available from here: to suit my client’s situation.

In my modified macro below, several styles used in tables had name changes, as did one for the appendix headings. You can add more for your circumstances—just make sure you add a new ‘Set’ line with a unique name, call that name in a separate ‘With’ statement, and make sure you add that name to the ‘Dim’ statement at the top of the macro.

If you want to use/modify this macro, copy/paste the code below–some of it runs off the page, so if you retype the code you may miss some critical command. Then modify the Set names (if required) and the style names in the double quotes.

Sub FNR_Styles()

' Converts old table and Appendix styles to new using find and replace
' Rhonda Bracey, 11 Sept 2018 (modified from [Christina])

Dim objDoc As Document
Dim table1 As Style, table2 As Style, table3 As Style, table4 As Style, app1 As Style

Set objDoc = ActiveDocument
' This code does *NOT* protect against the possibility that these styles don't
' appear in the document. That's probably not a concern with built-in styles,
' but be aware of that if you want to expand upon this for other uses.
' Set up as many of these as you need, giving each a unique name.
' The style name in the quote marks is the NEW style name.
' Make sure you add the name to the second Dim row at the top of the macro as well.

Set table1 = ActiveDocument.Styles("Table Text")
Set table2 = ActiveDocument.Styles("Table Bullet")
Set table3 = ActiveDocument.Styles("Table Heading White")
Set table4 = ActiveDocument.Styles("Table Text Number")
Set app1 = ActiveDocument.Styles("Appendix Heading")

' Searches the entire document (but not foot/endnotes, headers, or footers)
' for the old style and replaces it with the new style.

With objDoc.Content.Find
    .Style = "Table Text - Left"
    ' The style in the quote marks is the OLD style name
    With .Replacement
    .Style = table1
    End With
    ' Below is the Replace All command.
    ' Could change this to Replace:=wdReplaceOne to replace one only
    .Execute Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll
End With

With objDoc.Content.Find
    .Style = "Table Bullet 1"
    With .Replacement
    .Style = table2
    End With
    .Execute Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll
End With
With objDoc.Content.Find
    .Style = "Table Head - Center"
    With .Replacement
    .Style = table3
    End With
    .Execute Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll
End With
With objDoc.Content.Find
    .Style = "Table Text - Number"
    With .Replacement
    .Style = table4
    End With
    .Execute Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll
End With
With objDoc.Content.Find
    .Style = "App H1"
    With .Replacement
    .Style = app1
    End With
    .Execute Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll
 End With

End Sub