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. Anonymous
    2013-02-24T17:02:19+00:00

    Doug -  Thanks a lot.  Your macro also accomplished what I wanted done for the project!  However, it doesn't really advance the ball on my larger goal (see my comments to Greg, above).  

    About the document -- you're correct about it already containing some TABS and asterisks.  I've replaced it with a cleaned up version on Skydrive.

    You're also correct in noticing the "Published online" entry that would be missed (and there are a whole lot more of those in the entire document).  I've corrected that in the version of the macro I'm using to only look for "Published " (bolded).  The reason I hadn't originally used "Published " was that I  was anticipating the possibility that the text of some of those obituaries might include the word "published" (or even "Published") in describing that person as an author (such as "Published author of [whatever]"), so I wanted to try to be sure to limit the effect of the macro to just those places where I was sure I wanted to insert what would become delimiters.  The "belt & suspenders" on that was adding the required me that it be bolded. 

    Thanks for your help.

    Was this answer helpful?

    0 comments No comments
  2. Anonymous
    2013-02-24T16:46:31+00:00

    Thanks Jay.  I appreciate the explanation, as well as the fact that you recognize my frustration that the macro facility does not include an easy way for a non-programmer user to cause a recorded macro to do what it was recorded to do from top to bottom in a document and then stop executing.

    Was this answer helpful?

    0 comments No comments
  3. Anonymous
    2013-02-24T16:41:37+00:00

    Thanks a lot Greg.  That macro does accomplish what I needed for the specific project and it is definitely compact (in fact, it's less than 1/2 the number of lines of code originally generated by the macro recorder to do that "thing" only once!).  So, I'm sure it must be extremely efficient and it probably executes faster than just repeating execution of the recorded code over and over. 

    However, it does not help me achieve my larger goal of being able to record a macro and then have specific code statements that can be added to that recorded code (presumably, before and after the recorded code) to cause the recorded macro code to execute repeatedly from the top to the bottom of the document and then stop executing. 

    The reason I want to be able to approach it in that manner is that, while I can now look at your code, figure out how it works, and I certainly would be able to use it as a model to do something similar on another project tomorrow, the truth is that it easily may be two years before I'm faced with another project where I have something similar to do again, by which time I will have forgotten it all.  So, when these occasional repetitive macro needs occur, the easiest thing for me (or other non-programmer users) to be able to do is just record the steps to make the desired changes, then have a way to easily supplement the recorded macro code so it will repeat that activity from top to bottom in the document.  These are usually "one shot" occurrences for which the items to be changed are different each time and what's important at the time is being able to "get it done" easily without having to learn - or recall - programming concepts.  So elegant, efficient, performance-optimized coding is not a priority at all.

    Think of it like this:  Assume that the inefficient code (result of using macro recorder plus inserting "repeating" statements into that macro) takes 3 minutes to execute and a macro built by someone with good knowledge of programming concepts would only take 30 seconds to execute.  That 2 1/2 minute time difference is FAR less than the difference between (1) the time it would take the occasional macro user to learn (or get back up to speed on) the programming concepts necessary to build the macro correctly from scratch and (2) the time it would take for that same user to just record what s/he wants done and then add "repeating" statements to that recorded macro. 

    But, perhaps that larger goal just cannot be achieved. 

    Thanks again for the great macro that does what I really needed done.

    Was this answer helpful?

    0 comments No comments