Swapping User Names

I have a client who wants the user name that appears in my Microsoft Word comments and revisions to match the level of editing being done. For example, in a document I am copyediting my user name should read “copyeditor” and in a document I am proofreading it should read “proofreader.” Manually changing the user name when I switch between documents doesn’t take a lot of time, but it is a bit of a pain to do repeatedly. The manual change also creates the opportunity for misspellings and inconsistencies to creep in.

Figure 1: Each time the macro is run, Word’s user name is set to the next name in the series

To automate changing the user name, I created a macro that steps through a series of names and assigns the next name in the series each time the macro is run. (It also changes the user initials.) After the last name has been assigned, the macro starts again with the first name in the series. Editing the user names in the series involves a little adjustment of the macro’s code but is not too complicated.

Using the Macro

The version of the macro presented below has four user-name-and-initial options. Each time the macro is run, the user name will be updated to the next name in the series and this new user name will appear in the Word status bar (in the lower left corner of the screen) until a key or mouse button is pressed. If you would also like to have a pop-up dialogue box display the updated name, delete the apostrophe in the second to last line, before “MsgBox.”

Manually entering a user name in Word will not affect the way the macro works. If a user name that is not part of the series has been manually entered, the first user name in the series (in this case, “Dev Editor”) will be substituted when the macro is run. While the macro sets user initials, it doesn’t check to see if they have been manually edited. Any manual edits of user initials will be overwritten when the macro is run.

I assign this macro to the keyboard shortcut Alt + u to make it easier to run. If you would like to have this macro automatically add that shortcut, delete the apostrophe in the second line, before “KeyBindings.” You will have to run the macro once manually before the shortcut will be set.

Customizing the User Names

You will likely want to edit the series of user names. This involves a little adjustment of the “case” commands in the macro but is not too complicated of a process. The steps are as follows.

Determine how long of a series you want. To remove a name from the series, delete one set of three lines: a line beginning with “Case” and the following two lines that begin “NewName” and “NewInitials.” Don’t delete the final “Case Else” statement, though. To add a name to the series, duplicate the three lines mentioned above and place them before the final “Case Else” section.

Adjust the user names and initials. On the lines beginning  with “NewName” and “NewInitials” change the text in quotes to the desired user name and initials. Then set the name in the first line that starts with “Case” to match the “NewName” field in the “Case Else” section. Finally, change the name in each of the other “Case” lines to match the “NewName” field in the section that precedes it.

 The Code

Sub Swap_User_Names()
     'KeyBindings.add wdKeyCategoryMacro, "Swap_User_Names", BuildKeyCode(wdKeyAlt, wdKeyU)
     OldName = Application.UserName
     Select Case OldName
         Case "Dev Editor"
             NewName = "Copyeditor"
             NewInitials = "CE"
         Case "Copyeditor" 
             NewName = "Proofreader"
             NewInitials = "PR"
         Case "Proofreader" 
             NewName = "Cold Reader"
             NewInitials = "CR"
         Case Else
             NewName = "Dev Editor"
             NewInitials = "DE"
     End Select
     Application.UserName = NewName
     Application.UserInitials = NewInitials
     StatusBar = "User Name is now " & NewName
     'MsgBox ("User Name is now " & NewName)
 End Sub

Tools for Style Setters

Word users commonly adjust the formatting of text in four ways:

  • Assigning a paragraph style such as No Spacing or Block Text
  • Assigning a character style such as Strong or Emphasis
  • Applying manual paragraph formatting such as indenting and line spacing
  • Applying manual character formatting such as italics or underlining

Users can easily make all of these format adjustments using the ribbon or shortcut keys. However, figuring out after the fact which styles have been applied or where a particular bit of formatting comes from can take some work. The ribbon can indicate some of the formatting that has been applied, but not all of it and not consistently. For example, the Styles section of the ribbon and the Styles pane indicate at most one applied style. If both a paragraph style and a character style have been applied, the field will only indicate the character style. The ribbon also doesn’t disclose whether the indicated style has been overridden by manual adjustments.

A solution to this problem is available via the Style Inspector pane the Reveal Formatting pane. Unfortunately, Microsoft has hidden the former—neither a button on the ribbon nor a built-in shortcut is provided. And access to the latter is only slightly better.

Style Inspector

Figure 1: The Style Inspector Pane

The Style Inspector pane (Figure 1) provides a summary of the formatting applied at the current cursor location, indicating the names of assigned paragraph and character styles (in white fields) and manually applied paragraph and character formatting (in gray fields). Beside each field is a button that allows the user to reset that particular type of formatting. And included at the bottom of the pane are buttons to launch the Reveal Formatting pane, create a new style, and clear all formatting at one time.

While the interface clearly lays things out for the user, more is available if you poke around. If you want to see what formatting the styles provide, you need to hover your cursor over the respective fields. (Or you can bring up the Reveal Formatting pane). The paragraph and character style fields are also drop-down menus that provide access to additional commands. Some of these duplicate the functions of other easier-to-access buttons, though.

Another not-immediately-obvious quirk of this pane is that it provides clearer information if you have placed your cursor within the text you want to analyze rather than selected the text. If you select text that contains more than one paragraph style, the paragraph formatting field will appear empty; the same happens if your selection contains two character styles. But seeing a blank field at least indicates a problem. If, however, you select text containing two or more manual character format changes or paragraph format changes, the field will identify only the first one in the selection. However, the buttons will still remove formatting, whether or not the fields identify it.

Given the usefulness of this pane, why doesn’t it have a predefined shortcut or button to provide access to it? The easiest built-in path is to use the shortcut CTRL + ALT + SHIFT + S to bring up the Styles pane and then press the Style Inspector button (the middle button in the lower left corner of the pane). If you find yourself using Style Inspector frequently, you can create a keyboard shortcut to the “FormattingPaneCurrent” command. Or you can create a quick access toolbar button or ribbon button for the “Style Inspector” command. (Why two different names? Apparently to make things even more complicated.)

NOTE: Microsoft Office Word 2007 Essential Reference for Power Users by Matthew Strawbridge indicates two additional lurking issues. The first is that the manual paragraph styling field does not indicate all types of paragraph formatting. Unfortunately Strawbridge doesn’t state which ones. The second is that the text-level field will not indicate that any formatting has been applied if you place the cursor at either end of a stretch of formatted text.

Reveal Formatting

Figure 2: The Reveal Formatting Pane

The Reveal Formatting pane (Figure 2) provides a detailed list of formatting at the font, paragraph, and section levels and acts as a nice supplement to the Style Inspector. The “Distinguish style source” toggle, located at the bottom of the pane, adds headings to the list to clarify which formats have been manually applied and which are applied via a style. This is particularly useful because it indicates when a paragraph style includes character-level formatting. The “selected text” field is also a drop-down menu providing access to a few additional commands.

Another useful feature is the “Compare to another selection” option that indicates how the format of two selections differ. This tool is toggled on and off using the control near the top of the pane.

Unlike Style Inspector, Reveal Formatting does have a predefined shortcut key: Shift + F1. Unfortunately, it does not include a button to launch the Style Inspector. (This is another reason to set up a Style Inspector shortcut).

As with all Word features, Reveal Formatting isn’t perfect:

  • The “Show all formatting marks” toggle at the bottom on the page simply duplicates the “show/hide ¶” toggle on the ribbon.
  • This pane doesn’t provide any way to adjust styles, though there is a Clear Formatting option under the Selected Text drop-down menu.
  • If the selected text contains more than one character or paragraph style, the field only identifies the first style. Multiple applications of manually applied styling also causes this misreporting.
  • The drop-down menu commands “Apply formatting of surrounding text” and “Clear formatting” really only work as expected when applied to selections.

Counting Words by Chapter

When starting a new project I have found it very useful to develop a chapter-by-chapter word count for the manuscript: this lets me make sure my pace isn’t too fast or too slow and helps me develop a schedule for how many chapters per day I should cover. Developing this count by hand isn’t particularly efficient, so I recently decided to hunt down a macro to handle this work for me.

After a bit of online searching I found a macro posted by onesecondglance that did what I wanted. However it took a long time to analyze book-length Word documents, even after extensive rewriting. To replace it I developed new a macro using code by CuberChase as a starting point.

This macro queries the user for the name of the Word style applied to chapter headings (“Heading 1” is the default) and then counts words from the start of one heading to the start of the next. It also counts any words that appear before the first heading. It then creates a new word document and inserts into it the name of each chapter followed by that chapter’s word count. A tab character is inserted between each chapter name and word count so that the contents can be easily cut and pasted into an Excel spreadsheet.

As written the macro does have a few limitations, which I may get around to addressing if they present a problem:

  • It considers anything formatted using the heading style to be a heading, including blank lines, so make sure that the style is only applied to actual headings.
  • It does not count text in footnotes, endnotes or text boxes.
  • It does not like hidden track changes in headings and has been written to display all revisions before running. Because of this it will extract both the original and revised heading text.


The Code

Sub Chapter_Word_Count()
'Based on code from: http://stackoverflow.com/questions/17218587/how-to-parse-ms-word-document-by-style-with-vba

	Dim iCount As Integer
	Dim iArrayCount As Integer
	Dim bFound As Boolean
	Dim rParagraphs As Range
	Dim lCurPos As Long
	Dim iParNum As Integer
	Dim iOffset As Integer
	Dim rBody As Range
	Dim sMyStyle As String

        With ActiveWindow.View.RevisionsFilter
            .Markup = wdRevisionsMarkupAll
            .View = wdRevisionsViewFinal
        End With

	'Initialize 100-entry array
	Dim sArray() As String
	iArrayCount = 100
	iOffset = 0
	ReDim sArray(1 To 3, 1 To iArrayCount)

	'Collect name of style type
	sMyStyle = InputBox("What is the name of the Word style used for chapter headings?", "Count Chapter Words", "Heading 1")
	Application.ScreenUpdating = False

	'Move to top of the document
	Selection.HomeKey Unit:=wdStory

	'Set search parameters and look for the first instance
	With Selection.Find
		.Text = ""
		.Replacement.Text = ""
		.Forward = True
		.Wrap = wdFindContinue
		.Format = False
		.MatchCase = False
		.MatchWholeWord = False
		.MatchKashida = False
		.MatchDiacritics = False
		.MatchAlefHamza = False
		.MatchControl = False
		.MatchByte = False
		.MatchAllWordForms = False
		.MatchSoundsLike = False
		.MatchFuzzy = False
		.MatchWildcards = True
		.Style = sMyStyle
	End With

	'If found start loop to check for entries
	'counter added to avoid endless loops
	Do While Selection.Find.Found = True And iCount < 1000
	iCount = iCount + 1
	'Add results to array 
	If Selection.Find.Found Then 

		bFound = True
		lCurPos = ActiveDocument.Bookmarks("\EndOfSel").Start
		Set rParagraphs = ActiveDocument.Range(Start:=0, End:=lCurPos) 
		iParNum = rParagraphs.Paragraphs.Count 

		'Check array size and resize if necessary 
		If ii Mod iArrayCount = 0 Then ReDim Preserve sArray(1 To 3, 1 To UBound(sArray, 1) + iArrayCount) 
		'add an initial entry if doc doesn't start with a heading 
			If iCount = 1 And iParNum > 1 Then
				sArray(2, iCount) = "[Before first heading] "
				sArray(3, iCount) = 1
				iOffset = 1
			End If

			sArray(2, iCount + iOffset) = Selection.Text
			sArray(3, iCount + iOffset) = iParNum

			'Reset the find parameters
		End If

	If bFound Then
		'Finalise the array to the actual size
		ReDim Preserve sArray(1 To 3, 1 To iCount + iOffset)

		'Calculate chapter lengths, including length of chapter heading
		For ii = LBound(sArray, 2) To UBound(sArray, 2) - 1
			'Select range of paragraphs to measure
			Set rBody = ActiveDocument.Range(Start:=ActiveDocument.Paragraphs(CInt(sArray(3, ii))).Range.Start, _
                        End:=ActiveDocument.Paragraphs(CInt(sArray(3, ii + 1)) - 1).Range.End)
			sArray(1, ii) = rBody.ComputeStatistics(wdStatisticWords)
		Next ii
			Set rBody = ActiveDocument.Range(Start:=ActiveDocument.Paragraphs(CInt(sArray(3, UBound(sArray, 2)))).Range.Start, _
			sArray(1, UBound(sArray, 2)) = rBody.ComputeStatistics(wdStatisticWords)

		'Output results to a new document
		Application.ScreenUpdating = True
		For ii = LBound(sArray, 2) To UBound(sArray, 2)
			Selection.Text = Left(sArray(2, ii), Len(sArray(2, ii)) - 1) & Chr(9) & sArray(1, ii) & Chr(10)
			Selection.MoveRight wdCharacter, 1
		Next ii
		'If no headings found, return alternate message
			MsgBox "This document does not use the style " & sMyStyle, vbExclamation + vbOKOnly, "Bad Style Name"
	End If
End Sub


An Inline Commenting Macro

Inline comments—that is, comments inserted within the body of a document—can be a very useful alternative to Word’s built-in Comments tool (in a previous post I discuss their pros and cons). However, formatting them so that they stand out from the text requires a few extra keystrokes for each comment.

To make formatting less labor intensive, I cooked up a short macro (presented below) that automates the process. Its operation is very simple. If the user types a comment, selects it, and runs the macro, the comment will be reformatted: braces will be placed on either end of the comment, and the braces and comment will have the built-in Word style Strong applied to them. If the macro is run without any text being selected, a set of braces will be inserted, the Strong style will be applied to them, and the cursor placed between the braces, allowing a comment to be easily entered. For the macro to really save you work, you will need to assign it a keyboard shortcut (I use Ctrl+Alt+q).

Using a Word style allows all comments to be quickly reformatted by changing the definition of the style. It also allows all comments to be quickly selected using the Select All option in the Styles toolbar; this can be handy if you want to quickly delete or copy all comments. The macro’s use of the predefined Strong style can be a problem if you are using that style for other content in your document, but this can be fixed by changing the name of the style referenced in the macro. Since the macro applies one style to all comments, color-coding isn’t supported. However, if you prefer to color-code comments, one option is to replace the line in the macro stating

Selection.Range.Style = wdStyleStrong


Selection.Range.HighlightColorIndex = Options.DefaultHighlightColorIndex

to apply the current highlighting color, rather than a text style, to each inline comment as it is created.

Note: While poking around on the internet recently, I came across a similar but more elaborate set of macros, created by Professor Benjamin L. Read, for working with inline notes. If you are interested in color-coding your notes, his macros might be useful to try out.


The Code

Sub InsertInlineComment()
'Written by Michael Schuler, 2014.
'Recommended shortcut: CTRL+ALT+q
    Set myRange = Selection
    myRange.InsertBefore " {"
    myRange.InsertAfter "} "
    Selection.Range.Style = wdStyleStrong
    Selection.MoveLeft Count:=1
    Selection.MoveRight Count:=2
End Sub


Automating a Style Sheet (Part 2)

As mentioned in Automating a Style Sheet, Part 1, I recently came across the StyleThat macro, which facilitates copying of terms from a manuscript to a style sheet. It seemed pretty useful but had a few weak points, so I made some adjustments to its code to try to fix things.

A useful feature that I didn’t add, but would have liked to, would alphabetize terms as they are inserted. Integrating a sorting function into the macro could be done, but would slow the process down a bit down. Instead, I created a stand-alone macro that sorts all of the terms in the style sheet at the same time. This allows one to alphabetize the content as often as desired.

This macro (shown below) works by finding content between adjacent headings, or between a heading and the end of the document, and then sorting these entries into alphabetical order. For this to work properly all headings used to organize terms need to use a custom style named Style Sheet Heading. Since it finds headings based on their style name rather than their content, this macro can be used to sort material organized using categories different from those required by the StyleThat macro (for example, it will sort content organized using the headings “people” and “places”). The Style Sheet Heading style can have any appearance you want; the macro only cares about its name.

When sorting, the macro will ignore trailing spaces or line returns, but blank lines within a set of terms will get sorted to the top of the list, so it is best to avoid including these.

Operation of the macro is simple: just make your style sheet the active Word document and run the macro. I have found it handy to run the macro fairly regularly, and recommend assigning a keyboard shortcut to it.

If you find this macro useful, if you have problems with it, or if you have suggestions for improvements, please let me know.

The Code


Sub SortStyleSheet()
'Recommended shortcut: ALT+1
Dim i As Paragraph
Dim sortrange As Range
flag = 0
'flag value: 0=no heading yet located; 1=heading located; 2=entries to sort located
Selection.Collapse Direction:=wdCollapseEnd
  For Each i In ActiveDocument.Paragraphs
        If i.Style.NameLocal = "Style Sheet Heading" Then
            If flag = 2 Then
            While (Asc(Selection.Characters.Last) = 13) Or (Asc(Selection.Characters.Last) = 32)
                Selection.MoveEnd Unit:=wdCharacter, Count:=-1
                 If Len(Trim(Selection.Text)) > 1 Then Selection.Sort SortOrder:=wdSortOrderAscending
                 flag = 1
                 flag = 1
            End If
           If flag = 1 Then
              Set sortrange = i.Range
              flag = 2
              If flag = 2 Then
                 Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
              End If
           End If
        End If
    While (Asc(Selection.Characters.Last) = 13) Or (Asc(Selection.Characters.Last) = 32)
           Selection.MoveEnd Unit:=wdCharacter, Count:=-1
    If flag = 2 Then
        If Len(Trim(Selection.Text)) > 1 Then Selection.Sort SortOrder:=wdSortOrderAscending
    End If
 End Sub