It must be one of the most asked questions about macros - why has it not been addressed in the macro language after all these years?

Anonymous
2013-02-19T05:49:37+00:00

To those of us who are just users and not programmers, it seems like MS Word "macros" -- particularly recorded macros -- ought to include the capability to be easily constructed to (1) go to some identifiable place in a document and "do" some things starting from that point (such as "find" a new paragraph immediately followed by the word "publish", then go to the end of that line of text and insert "**") and then (here comes the sticking point) (2) repeat that series of activities over and over UNTIL some identifiable point is reached in the document [e.g., the end of the page; the end of the document; the end of the paragraph]. 

But for some reason, Word macros cannot be made to do that in an "easy for non-programmers to understand" sort of way.  I've had it explained to me several times that I must use references to "ranges" and/or "counts" and all sorts of other commands that seem overly complicated to just "go to a place and do this", then go to the next such place, and do the same thing", and keep doing that UNTIL . . .  It's certainly nothing that can be accomplished by recording a macro (as it logically should be.)   With help, I'll finally get a macro cobbled together to do what I need done.  But when the next occasion to do something like that comes along -- maybe a year later -- I've forgotten all those inscrutable concepts and I once again find myself just needing to record a macro doing some set of activities and then have it repeat itself through the document.

I know it's easy for programmers to understand all these arcane requirements to be able to get a macro to work through a document that way, but a lot of us "out here" are just regular users who occasionally need to be able to do repetitive tasks within a particular document and believe it should be easier to accomplish this sort of thing than it appears the macro language permits. 

Can someone explain why the macro language cannot be made to easily allow a macro to just do something like: 

   DO         [find <text>, then move from there to another point 8 characters away and then make some change to the text at that point], then     LOOP (DOing that same series of things again} UNTIL [the End of the Page or the End of the Document is reached], then just Stop the macro from further executing.

I'm sure I haven't used the right syntax above, but I hope you get the point - it ought to be just that simple to accomplish that sort of chore, but it isn't. 

Can anyone explain WHY the macro language CAN'T work this way or, if it could be made to do so, why Microsoft has not done it in all these many years while countless ordinary users have struggled with (and posted questions all over the Internet about) this specific concept?

Microsoft 365 and Office | Word | For home | Windows

Locked Question. This question was migrated from the Microsoft Support Community. You can vote on whether it's helpful, but you can't add comments or replies or follow the question.

0 comments No comments
Answer accepted by question author
Anonymous
2013-02-24T17:37:41+00:00

D PaulDalton,

Glad I could help and I understand your comments and concerns. 

Unfortunately, I don't know if your suggestions will ever get any traction even if they made it to the "right person.  In line with what Jay and Peter have said, my experience is that VBA becomes less and less complete as Word progresses rather than more and more complete.  For example, everything that you could do as a user with a drawing or shape object in Word 2003, you could do with VBA.  With the new graphics engine introduced with Word 2010, there are many things that a user can do that now cannot be done with VBA.  Most of the things that you can do with those graphics are not even recorded.  I suspect that the recorder will go away before it becomes anything like you envision.  Still, it is a good and valid vision.

Good luck.

Was this answer helpful?

0 comments No comments
Answer accepted by question author
Anonymous
2013-02-22T17:33:28+00:00

I have a few observations, and that's probably about all I'll be able to contribute here.

In order to get much further with getting Microsoft to do this, you'll need to get your idea onto their agenda. While it's possible that ideas posted here sometimes get some attention from them, you can't guarantee it: you aren't really dealing with Microsoft people (it's mostly volunteers), and certainly not the Microsoft product group people, in here. So you either need to know someone, or find a proxy (either someone close or perhaps an influential corporate that can see the value of the idea). As for timing, I don't know what their product cycle looks like now, either - it could well be changing rapidly as their Office 365 subscription service develops. But if it's the old cycle, I would guess they already have the outline if not most of the details for the version after 2013 and may be thinking about ideas after that. Also, I would be very surprised if they did not want to be absolutely sure of their ground as far as Intellectual Property is concerned.

On the technical front, the biggest technical questions for me are "what can be done in the 'DO' part of the feature?" (i.e. the one you described a few messages back)

If it's "execution of an arbitrary macro", then it can do anything VBA can do, form "something sensible" to "accidentally trash every file on the system." It can also contain infinite loops, code that results in untrappable errors - at least not trappable by VBA - and doubtless other things I haven't even thought about that may result in dismay for the user.

As long as the user is willing to take responsibility for their part of the code, I don't see any technical showstoppers*.* But that doesn't mean that such problems won't turn up.

From a support perspective though, having a half-and-half feature like that is a bit of a liability, to say the least.

Going to a slightly more detailed level, when I read your earlier messages, I got the impression that you were keen to avoid the more techie stuff involving selections, ranges etc. The trouble is that if the user still has to write VBA, e.g. to find something then move a few words to the right or whatever, they still have to understand that stuff. What's more, in the general case some code will function in (say) a paragraph in the main body of the document, but fail in a footer (say). In other words, in many cases the user would need to understand even more about their code.

When I first read your question, I had a slightly different idea as to what you were driving at. To me, how you avoid dealing with "allowing any piece of VBA" is to try to identify a small but potent set of things the user might want to do (obviously reducing the generality obtainable in VBA) and allow them to do those things and nothing else. That's one of the reasons I suggested that a change to the recorder might be needed - you'd only be able to record the things that the feature is designed to allow. Then the feature takes responsibility for making all that stuff happen. How to do that technically is a detail, but perhaps specify that the DO macro only contains calls to a number of predefined subs/functions that have been designed to behave well within the overall structure of the feature. Or define a completely new, small, non-VBA language and some VBA to interpret it.

Finally, I know we have been taking about Word and VBA. But really, we're talking about providing a set of features for repetitive processing. The Web App version of Word doesn't have any of that stuff, and perhaps it is intended that it never will. But because it doesn't have VBA, it would I think benefit far more from a feature to let its users do something like "do this in every paragraph that begins with 'Jack Robinson'"

Was this answer helpful?

0 comments No comments

39 additional answers

Sort by: Newest
  1. Paul Edstein 82,871 Reputation points Volunteer Moderator
    2013-02-24T21:05:57+00:00

    Thanks for the idea of using Find/Replace, though even that appears to require some understanding of somewhat complicated syntax -- I'll have to go study up on all that to be able to use it.

    BTW, I tried your suggestion, and it returned "Word has completed its search of the document and has made 0 replacements." So I imagine there's some tweak of the syntax that's needed to make it work as intended.

    Did you check theFind/Replace 'use wildcards' option? The fact nothing was found suggests not.

    And, just in case the 'lines' end with manual line breaks rather than paragraph breaks, you could use:

    Find = (Published [onlie]{2,6} [!^13^l]{1,})([^13^l])

    Replace = \1^t**\2

    If you're concerned that non-bold ranges will be processed when they shouldn't be, you can still specify 'bold' as one of the Find parameters.

    Was this answer helpful?

    0 comments No comments
  2. Doug Robbins - MVP - Office Apps and Services 323.6K Reputation points MVP Volunteer Moderator
    2013-02-24T21:05:03+00:00

    Paul,

    The following code would only find "Published" when it is the first word in a Paragraph.

    Dim rngFound As Range

    Selection.HomeKey wdStory

    With Selection.Find

    Do While .Execute(FindText:="^pPublished in", Forward:=True, _

    MatchWildcards:=False, Wrap:=wdFindStop, MatchCase:=True) = True

    Selection.Collapse wdCollapseEnd 'Collapse the selection so that the found text is not found by the next loop

    Set rngFound = Selection.Paragraphs(1).Range

    With rngFound

    .End = .End - 1 'Move the end of the range back one character so that it does not include the paragraph return

    .InsertAfter vbTab & "**"

    End With

    Loop

    End With

    The following modification of Paul's Wildcard Replace will do the same thing

    Find what:  (^13Published)([!^13]{1,})(^13)

    Replace with: \1\2^t**\3

    With respect to your comments to Greg, if my friends Greg, Jay and Paul are anything like myself, we do cannot always rattle off code without referencing some form of "cheat sheet" where we have accumulated examples of things that we have done previously, labelling them in a fashion that allows us to find them fairly easily.  In my case that is now a document that runs to 225 pages.

    For a reference on the use of Wildcards, see the following page of fellow MVP Graham Mayor's website:

    http://www.gmayor.com/replace_using_wildcards.htm

    Was this answer helpful?

    0 comments No comments
  3. Anonymous
    2013-02-24T17:26:58+00:00

    Paul -- Thanks for the idea of using Find/Replace, though even that appears to require some understanding of somewhat complicated syntax -- I'll have to go study up on all that to be able to use it. 

    BTW, I tried your suggestion, and it returned "Word has completed its search of the document and has made 0 replacements."  So I imagine there's some tweak of the syntax that's needed to make it work as intended. 

    But regardless of whether or not doing it with "Find/Replace" in the manner you suggest requires understanding of actual "programming concepts", it does require an "ordinary" user to invest a fair amount of learning time to be able to accomplish an occasional "one-shot" need (see my explanation above in response to Greg).  [Like so much in life, if you don't "use it" regularly, you "lose it".  Figuring out and properly using that Find/Replace syntax once a year probably means having to re-learn it each time.]

    Re:  "Published online" entries, see what I wrote in response to Doug, above.

    As I also mentioned to Doug above, inclusion of the requirement that the target be bolded was intended to make sure that the macro would not inadvertently execute if the word "published" (or "Published") happened to appear in the text of one of the obituaries.  So I don't think it's a red herring for my purposes. 

    Thanks again for the great idea on using Find/Replace.  If you can identify the tweak I need to make to it to make it work, please let me know.

    Was this answer helpful?

    0 comments No comments