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-19T23:59:26+00:00

    Thanks for the response, but it sort of proves what I said before -- that, for ordinary occasional users, it IS more complicated than it seems like it ought to be to have a macro do what seems to be a pretty simple thing. 

    You said:

    " your description of how the loop might work suggests a Selection-based approach, which is quite inefficient. VBA supports the much more efficient Range-based approach to coding. No, you don't have to work with ranges; you can work with selections, but experience programmers usually opt for efficiency."

    While I'm sure that everything you said there is true, it pretty much assumes that an ordinary user would/should know what a "Selection-based approach" is as opposed to a "Range-based approach,"  as well as understand coding concepts and what constitutes a more efficient way of coding. 

    My response is that they don't and it just seems like MS could/should do things to make working with macros a bit more UNcomplicated for ordinary users who need a tool that can accomplish repetitive tasks. 

    Perhaps part of the problem is the HELP that's provided in the program.  I know that, when I'm trying to figure out how to make a macro do something, the first place I try is HELP.  But just take a look at what is provided as "Help" about "range" or "selection" -- it's inscrutable, unless the reader happens to already understand programming concepts.  (In fact, I just noticed for the first time a line at the bottom of the Help dialog that says "Developer Reference" - hardly something that could be expected to be much "help" to ordinary users.)  

    Anyway, I guess I'm tilting at windmills.  But I really wish the folks at MS would give a lot more thought to making macros more accessible to ordinary users as well as to providing clearer and more useful macro "Help" for ordinary users so they would be able to get more functionality out of using macros without having to learn to be programmers.

    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-19T23:41:25+00:00

    That sort of thing certainly can be done, it's just a matter of incorporating the required commands to

    1.  Do whatever it is that is to be done when the text is found

    2.  Determine whether or not the procedure should continue

    The required construction is something like

    Selection.HomeKey wdStory

    Selection.Find.Font.Bold = True

    With Selection.Find

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

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

            If Left(Selection.Style, 7) <> "Heading" Then

                Selection.Style = "[bold style]"

                Selection.Collapse wdCollapseEnd

            End If

        Loop

    End With

    The If - End If part of the above construction (or something in place of it) is where the criteria for 1 and 2 above need to be defined.

    Often, it is not writing the code that is the tricky part, it is working out the logic that must be applied.

    Was this answer helpful?

    0 comments No comments
  3. Paul Edstein 82,871 Reputation points Volunteer Moderator
    2013-02-19T22:46:58+00:00

    why can't the language allow a macro to be written very simply along the lines of the example I gave above, which is more or less as follows: 

    DO               [find <text>, then move from there to another point 8 characters to the right (or, as               other examples: move to the end of the same line of text; move down one line and to               the right 3 characters) and then make some change to the text at that location (such               as a word change; a font change; inserting a paragraph or a tab, etc], and then     LOOP                (causing the macro to DO that same series of things over and over again}     UNTIL [a specified place in the document is reached (such as: the End of the Page; the End of the               Section; the End of the Document, etc.)], at which time the macro would Stopfurther execution.

    The simple answer is: It can be done and it's not at all difficult. Your complaint suggests a lack of familiarity with VBA.

    The VBA for all Office apps supports multiple forms of looping, including Do Until ... Loop , Do While ... Loop and While .. Wend. It is up to the user to add the relevant actions/parameters for the loop.

    FWIW, your description of how the loop might work suggests a Selection-based approach, which is quite inefficient. VBA supports the much more efficient Range-based approach to coding. No, you don't have to work with ranges; you can work with selections, but experience programmers usually opt for efficiency. Also, for most purposes, one doesn't need to use a counter to manage looping. Often, the counters are required for other purposes and the loops are used to update them. One of the few occasions a counter might be required is when you're trying to delete all items of a kind. In that case, for details I won't go into here, best practice is to loop through the collection backwards.

    Was this answer helpful?

    0 comments No comments