Fixed: Word VBA crashes on “Find.Execute Replace:=wdReplaceAll”

This morning I hit a test case in which, for the first time in over a year running the same Word VBA macro, a Range.Find.Execute Replace:=wdReplaceAll hung, then crashed Word 2013 (32-bit, running on Win8.1 x64).  The Execute was running inside a custom Undo record, and was the first action taken inside that record.

Searching led me to this forum post by vbRichard suggesting that the empty Undo record was the problem.  I edited my code to change the document after opening the record, before running Execute, and Execute now runs fine!  Thanks to vbRichard, whomever you are 🙂 .  I also added code to clean up the change just before closing the Undo record.

Since my use case is English, I added a zero-width joiner (“ZWJ”, ChrW(&H200D)) before the text I was processing, then deleted it at the end.  I could have used any character I was confident wouldn’t appear in the input, or wouldn’t affect the function’s main task.  The result is below (licensed CC-BY 4.0).

' Top of module:
Private Const U_ZWJ = &H200D

' Inside a function:
Dim r as Range
' ... code here to set r ...
Dim undos As UndoRecord
Set undos = Application.UndoRecord
undos.StartCustomRecord "90125"     ' or whatever record title you like
r.InsertBefore ChrW(U_ZWJ)
    ' now r includes the ZWJ.  
r.MoveStart wdCharacter, 1          ' remove the ZWJ from r
' ... code here to process r ...
r.MoveStart wdCharacter, -1         ' re-select the ZWJ
If AscW(r.Characters.first) = U_ZWJ Then   'sanity check
    r.Collapse wdCollapseStart
    r.MoveEnd wdCharacter, 1        ' select only the ZWJ
End If


Boolean searching in Microsoft Outlook

Turns out it can be done!  This article from Slipstick Systems shows you how to enable the Query Builder in the Advanced Find dialog box.

I was trying to search for two partial words in the Subject of my emails in Outlook 2013.  Turns out the “Search” box in the folder view only finds matches at the start of a word.  The Advanced Search dialog box, Advanced pane, looked promising.  However, when I added multiple criteria, I think it was ORing them rather than ANDing.  Not sure, but I do know that I added two separate Subject terms and not all the results had both terms in their Subject fields.

With Query Builder, each search criterion I entered was automatically added to an AND group, and the search results were what I expected.  Now if only you didn’t have to tweak the registry to enable this incredibly useful feature…

Breaking infinite loops in VBA

I do a lot of Visual Basic for Applications (VBA) development in Microsoft Office. Any program can get stuck in an infinite loop, and when my VBA programs have it has always meant data loss. The Internet to the rescue, as of not quite a month ago!

To break VBA code execution, at least in Office 2013, hit Ctrl+Scroll Lock.  Obvious, right? 😉

Huge thanks to MSDN user povidla, who posted this solution in the MSDN forums.  Povidla, if you’re reading this, please comment so I can thank you directly!

Edit I have found that, in some situations, this doesn’t work unless there is a DoEvents call to catch the Ctrl+ScrLk.  If you have a loop that might be infinite, sticking a DoEvents in it is probably a good practice.

Greetings to Stack Overflow users!  I keep hoping that Povidla will find this page.  If you happen to know who Povidla is, please pass along a thank you from me.  Regardless, thanks for reading!