Coding the ENTER key to move between form fields in a protected fo

B

bmac

Good Afternoon All,

I'm new to VBA and I don't have a clue. I'm talking zero
knowledge. I found a knowledge base article that does exactly what I need it
to do. However, when the document containing the macros is opened and I open
up a new Word document and I type some text in the document and hit the Enter
Key, nothing happens. Is there some code in VBA that will apply the code to
the active document and not to the normal.dot template. I have also
double-checked to make sure that the code wasn't attached to the normal.dot
template, but I guess somehow it has gotten attached. Any help will be
greatly appreciated. I'm sending out an S.O.S.....I also apologize if there
has already been a posting for question, but I couldn't seem to find it. I'm
been working on this issue for 4 days now and I'm stumped. Here's my code:

Sub EnterKeyMacro()
'
' EnterKeyMacro Macro
' Macro created 10/14/2005 by BMcNearly

' Check whether the document is protected for forms
' and whether the protection is active.

If ActiveDocument.ProtectionType = wdAllowOnlyFormFields And _
Selection.Sections(1).ProtectedForForms = True Then

' Retrieve the bookmark of the current selection.
' This is equivalent to the name of the form field.

myformfield = Selection.Bookmarks(1).Name

' Go to the next form field if the current form field
' is not the last one in the document.


If ActiveDocument.FormFields(myformfield).Name <> _
ActiveDocument.FormFields(ActiveDocument.FormFields.Count) _
.Name Then
ActiveDocument.FormFields(myformfield).Next.Select
Else

' If the current form field is the last one,
' go to the first form field in the document.

ActiveDocument.FormFields(1).Select
End If
Else

' If the document is not protected for forms,
' insert a tab stop character.

Selection.TypeText Chr(13)
End If


End Sub
Sub AutoNew()
' Do Not protect the document containing these macros.

CustomizationContext = ActiveDocument.AttachedTemplate

' Bind the ENTER key to the EnterKeyMacro.

KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyReturn), _
KeyCategory:=wdKeyCategoryMacro, Command:="EnterKeyMacro"

' Reprotect the document with Forms protection.

ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True

End Sub
Sub AutoOpen()
' This macro will reassign the ENTER key when you open an existing
' Word form fields document.

CustomizationContext = ActiveDocument.AttachedTemplate

' Bind the Enter key to the EnterKeyMacro.

KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyReturn), _
KeyCategory:=wdKeyCategoryMacro, Command:="EnterKeyMacro"

End Sub
Sub AutoClose()

CustomizationContext = ActiveDocument.AttachedTemplate
FindKey(KeyCode:=BuildKeyCode(wdKeyReturn)).Disable

' Disables prompt to save template changes.

Templates(1).Save

End Sub


Thanks again...

bmac
 
T

Tony Jollans

The code looks like it is designed to go in a template (.dot) rather than a
document (.doc)

However, I'm not clear what you expect from it. If you
open up a new Word document and I type some text in the document and hit
the Enter Key,

then nothing will happen. It is designed to work with a document containing
a Word Form (protected except for some designated input fields)
 
B

bmac

Thanks Tony for the response. I apologize if my question is out in left
field. When a user opens the form (let's just call it TestForm) they can use
the Enter Key or the Tab key to move from one field to the other. The code
that I provided causes the Enter key to move from field to field in a
protected document. The problem that I have is that if the user has to stop
in the middle of filling out the form and wants to respond to an email (using
Microsoft Word as the email editor) and they hit the Enter key, the Enter key
will not move the cursor to the next line while the TestForm is opened. It
is as if the macros are always running as long as the TestForm is opened.
When the TestForm is closed, then the EnterKey works. Is there a way for me
to modify the code below to only apply the macros to the ActiveDocument and
not to the Normal.dot template? Any help will be greatly appreciated. I've
read about putting borderless cells in the document and assigning exact
dimensions to it, but doesn't seem to be playing nice either. Thanks.

bmac
 
D

Doug Robbins - Word MVP

If the reason for programming the Enter key to move from one field to the
next was simply to stop the entry into a formfield from expanding and
distorting the form, what was the problem that you encountered with setting
the dimensions of table cells to exact dimensions which is the usual way of
obtaining that effect.

However, an easy way (though untested) around your problem with the email
situation maybe to use Shift+Enter

Or, do not use Word as the email editor.

--
Hope this helps.

Please reply to the newsgroup unless you wish to avail yourself of my
services on a paid consulting basis.

Doug Robbins - Word MVP
 
T

Tony Jollans

Hi bmac,

Ah, sorry, I misunderstood.

The critical factor here is where the customization, the setting of the
Enter key, lives. Assuming the code is in your TestForm document the setting
will be in the template attached to TestForm and, if that is normal.dot, the
setting will apply everywhere. Having said that I have just done a very
quick test and it does seem to behave slightly strangely when using Word as
Outlook editor.

If the code lives in TestForm and applies only to TestForm, then it should
not try to apply the setting to the Template - it is sufficient to apply it
to the Document and, that way, it affects nothing else. To do that, change
(in three places - AutoOpen, AutoNew, and AutoClose) ..

CustomizationContext = ActiveDocument.AttachedTemplate

to

CustomizationContext = ActiveDocument

If the code is in a Document (and not a Template) there is no need to keep
the AutoNew - and even if it is in a Template, I suspect you don't really
want it as it will make designing a new form difficult.

It would also help, generally, if the EnterKeyMacro included some code to
deal with what the key did when not in a FormField - but that probably
wouldn't matter if the key was only set in the protected document.
 
B

bmac

Hey Tony,
I tried the following and still no joy. I made the procedures
Private. This released the EnterKey when other documents are opened while
the TestDocument is open, but now the form gets distorted. So, I'm back to
square one. However, I did change the CustomizationContext = ActiveDocument.
I feel that I'm really close, but there is a piece that is missing, and
since I don't know what code to write on my own. I'm stumped. Any help
will be greatly appreciated. Thanks for all your help so far. I think that
I'm right on the verge of a breakthrough.
 
C

Charles Kenyon

The EnterKey procedure needs to be in either the document itself or in the
document's template. Then it will not apply to other documents. You need
only assign it to the Enter Key in the template or document once, making
sure that your customization context is that template or document (and not
normal.dot).

Was the knowledge base article you found:
http://support.microsoft.com/default.aspx?scid=kb;en-us;211219 ?

If your users can't be trained to not use the Enter key, though, you might
simply structure your forms so that the fields will not expand down. Then,
if they press the Enter key, they can type all they want but it will not
show up on your form or move other things on the form around.
--
Charles Kenyon

Word New User FAQ & Web Directory: http://addbalance.com/word

Intermediate User's Guide to Microsoft Word (supplemented version of
Microsoft's Legal Users' Guide) http://addbalance.com/usersguide


--------- --------- --------- --------- --------- ---------
This message is posted to a newsgroup. Please post replies
and questions to the newsgroup so that others can learn
from my ignorance and your wisdom.
 
B

bmac

Good Morning Charles,
Yeah the article that you made reference to was the one that I used
for my code. I have tried to make sure that the customization would not be
applied to the Normal.dot template by using the suggestions that Tony gave
me. My form is not set up such that I can use borderless table cells. I have
tried Private and changing the customization code. I'm not sure what to do
at this point. Any continued ideas would be greatly appreciated. Thanks.

bmace
 
T

Tony Jollans

Hi bmac,

If you make the code private it won't run and so you won't have any
settings. It must be public.

If you stick to the original code with the single change of making the
keybinding in the activedocument you should be alright. You may find,
however, that as a result of trying out different things you have a residual
keybinding stored in normal which you may have to manually delete.
 
C

Charles Kenyon

I just wrote the following code.

Sub EnterKeyMacro()
MsgBox "This is the entrykey procedure"
End Sub

Sub SetItNow()
' Do Not protect the template containing these macros.
CustomizationContext = ThisDocument
' Bind the ENTER key to the EnterKeyMacro.
KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyReturn), _
KeyCategory:=wdKeyCategoryMacro, Command:="EnterKeyMacro"
End Sub

Sub ReSetIt()
CustomizationContext = ThisDocument
' Bind the Enter key to the EnterKeyMacro.
KeyBindings.ClearAll
End Sub

The first one is the macro to substitute for the Enter key. It is simply a
test and flashes a message box.

The second one sets the keybinding for the macro. It needs to be run only
once and will be effective in that document from then on.

The third turns it off so you can actually do some work using the Enter key
if you decide to revise your template.

The ThisDocument object refers to the document or template that contains the
procedure being run.

Put the procedure you want for your enter key in your form's tempate.
Then, in the template, run the second macro and it will set the key binding
for that template and all documents based on the template. You only need to
run this once.

The third macro is to reset keybindings (in that template only).

"Private" does not have anything to do with the customization context.
--
Charles Kenyon

Word New User FAQ & Web Directory: http://addbalance.com/word

Intermediate User's Guide to Microsoft Word (supplemented version of
Microsoft's Legal Users' Guide) http://addbalance.com/usersguide


--------- --------- --------- --------- --------- ---------
This message is posted to a newsgroup. Please post replies
and questions to the newsgroup so that others can learn
from my ignorance and your wisdom.
 
B

bmac

Thanks Charles and Tony,
I will give your ideas a try and see how it goes. I will post a
message later this evening to let you know the results. Thanks again.

bmac
 
B

bmac

Charles and Tony,
I'm still working on the code, but I do have a question for
Charles. Do I add my original code for the EnterKey Macro and remove the
MsgBox message so it will run and not just flash the message "This is the
EnterKey Procedure? Any other ideas for me to try in case this doesn't work?
So far, the code that Charles suggested is adding an additional line. So I
don't know if the keybinding code is being called. Any help will be greatly
appreciated. Attached is the code the way I have it now. Thanks a great
deal guys.


Sub EnterKeyMacro()

MsgBox "This is the entrykey procedure"
'
' EnterKeyMacro Macro
' Macro created 10/14/2005 by BMcNearly

' Check whether the document is protected for forms
' and whether the protection is active.

If ActiveDocument.ProtectionType = wdAllowOnlyFormFields And _
Selection.Sections(1).ProtectedForForms = True Then

' Retrieve the bookmark of the current selection.
' This is equivalent to the name of the form field.

myformfield = Selection.Bookmarks(1).Name

' Go to the next form field if the current form field
' is not the last one in the document.


If ActiveDocument.FormFields(myformfield).Name <> _
ActiveDocument.FormFields(ActiveDocument.FormFields.Count) _
..Name Then
ActiveDocument.FormFields(myformfield).Next.Select
Else

' If the current form field is the last one,
' go to the first form field in the document.

ActiveDocument.FormFields(1).Select
End If
Else

' If the document is not protected for forms,
' insert a tab stop character.

Selection.TypeText Chr(13)
End If

End Sub

Sub SetItNow()
' Do Not protect the template containing these macros.
CustomizationContext = ThisDocument
' Bind the ENTER key to the EnterKeyMacro.
KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyReturn), _
KeyCategory:=wdKeyCategoryMacro, Command:="EnterKeyMacro"
End Sub

Sub ReSetIt()
CustomizationContext = ThisDocument
' Bind the Enter key to the EnterKeyMacro.
KeyBindings.ClearAll
End Sub
 
C

Charles Kenyon

Yes. I didn't test your code in it. I was just checking to make sure that
the code I wrote actually attached and detached from the Enter key when I
ran the other macros. So, you put your code in the EnterKey macro.

An extra line as in inserts a paragraph mark?
--
Charles Kenyon

Word New User FAQ & Web Directory: http://addbalance.com/word

Intermediate User's Guide to Microsoft Word (supplemented version of
Microsoft's Legal Users' Guide) http://addbalance.com/usersguide


--------- --------- --------- --------- --------- ---------
This message is posted to a newsgroup. Please post replies
and questions to the newsgroup so that others can learn
from my ignorance and your wisdom.
 
B

bmac

Good Morning Charles,
Yes, when I said adding an additional line, I meant that it adds a
paragraph mark. Sorry about that. I was saying that it wasn't moving to the
next formfield when hitting the EnterKey, but it was adding a paragraph mark.
Sorry for the confusion. Thanks

bmac
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top