Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Word / Programming / August 2006

Tip: Looking for answers? Try searching our database.

Adding Bullets and Symbols to Protected Forms using Form Fields

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
CoachTony - 29 Aug 2006 16:28 GMT
Hello,

I have several templates that are protected using form fields...I am trying
to figure out a way to allow the users of the form to implement bullets and
symbols (such as the copyright symbol) to some the form fields.

When the user attempts to access the Insert menu or the formatting menu,
they are grayed out.

I have used the Spell Checker macro found on this site, it works great... I
am hoping there is a similar macro for these other needs.

Thanks  in advance for you help!
Signature

Coach Tony

Jean-Guy Marcil - 30 Aug 2006 00:29 GMT
CoachTony was telling us:
CoachTony nous racontait que :

> Hello,
>
[quoted text clipped - 10 lines]
>
> Thanks  in advance for you help!

The thing is, formfields are supposed to be used to gather data, so
formatting is not important.
That being said, it is not uncommon for users to want to have a locked form
act as a document...

So, in your case, the easiest is to have a button on a custom toolbar that
allows the user to apply a pre-defined style to a formfield, or part of the
formfield.
That way you still have some kind of control and users will not be able to
affect the protected parts of the form.

Use the code you have to Unprotect/Protect, but instead of doing a spell
check, do this instead:

(Untested, you may have to adapt it to suit your need):

   Selection.Style = "myStyleWithBullets"

Signature

Salut!
_______________________________________
Jean-Guy Marcil - Word MVP
jmarcilREMOVE@CAPSsympatico.caTHISTOO
Word MVP site: http://www.word.mvps.org

CoachTony - 30 Aug 2006 02:48 GMT
Thanks very much for your help on this, although I am not too clear on your
instructions.

Below is the code used for the spellchecker, perhaps you can point out which
piece(s) need modification for me, please -)

Option Explicit

Dim Cancelled As Boolean, MyRange As Range, _
       CorrectedError As String, oDoc As Document

Sub RunSpellcheck()

Dim oSection As Section, OriginalRange As Range

'If no documents open, quit macro
If Documents.Count = 0 Then
   Exit Sub
End If

Set oDoc = ActiveDocument

'Check what type of protection - if any - has been applied
Select Case oDoc.ProtectionType

   'If not protected, or if protected for tracked changes,
   'run spellchecker and quit
   '-------------
   Case wdNoProtection, wdAllowOnlyRevisions
       If Options.CheckGrammarWithSpelling Then
           oDoc.CheckGrammar
       Else
           oDoc.CheckSpelling
       End If
       Application.ScreenUpdating = True
       Application.ScreenRefresh
       If oDoc.SpellingErrors.Count = 0 Then
           If Options.CheckGrammarWithSpelling Then
               MsgBox "The spelling and grammar check is complete", _
                       vbInformation
           Else
               MsgBox "The spelling check is complete", vbInformation
           End If
       End If
       System.Cursor = wdCursorNormal
       Exit Sub
   '-------------
   Case wdAllowOnlyComments
       'Don't want to run spellchecker if protected for comments
        Exit Sub
End Select

Set OriginalRange = Selection.Range
System.Cursor = wdCursorWait

'-------------
'-------------
'If we've got this far, it's protected for forms
'Now unprotect the document
oDoc.Unprotect
oDoc.SpellingChecked = False

'Check each section for its protection property -
'which you can get even after unprotecting the document.
'If the section was protected, call a subroutine to spellcheck the formfields.
'if it wasn't, spellcheck the section
StatusBar = "Spellchecking document ..."
For Each oSection In oDoc.Sections
   If oSection.ProtectedForForms Then
       Call CheckProtectedSection(oSection)
       If Cancelled Then
           'Boolean variable returned by CheckProtectedSection
           'procedure if user pressed Cancel button
           Exit For
       End If
   Else
       If oSection.Range.SpellingErrors.Count > 0 Then
           Application.ScreenUpdating = True
           oSection.Range.CheckSpelling
           If oSection.Range.SpellingErrors.Count > 0 Then
               'User pressed Cancel button
               '(Pressing Ignore reduces the count, pressing Cancel doesn't)
               Exit For
           End If
       End If
   End If
Next oSection

'Re-protect the document
oDoc.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
OriginalRange.Select
Application.ScreenUpdating = True
Application.ScreenRefresh
If oDoc.Range.SpellingErrors.Count = 0 Then
   If Options.CheckGrammarWithSpelling Then
       MsgBox "The spelling and grammar check is complete", _
               vbInformation
   Else
       MsgBox "The spelling check is complete", vbInformation
   End If
End If

'Release variables from memory
System.Cursor = wdCursorNormal
Cancelled = False
CorrectedError = vbNullString
Set MyRange = Nothing

End Sub

Private Sub CheckProtectedSection(oSection As Section)

Dim FmFld As FormField, FmFldCount As Long, Pos As Long

'check only the text formfields,
'don't check listboxes and checkboxes - this speeds up the code
Application.ScreenUpdating = False
For Each FmFld In oSection.Range.FormFields
   'Check to see if the field is a text formfield
   If FmFld.Type = wdFieldFormTextInput Then
       'Check if the field is a 'real' text field (no date, formula etc);
       'and that it is enabled for text input
       If FmFld.TextInput.Type = wdRegularText And FmFld.Enabled Then
           'The following subroutine won't be called if Word 97 is in use
           If Not Left$(Application.Version, 1) = "8" Then
               Call TurnNoProofingOff(FmFld)
           End If
           FmFld.Range.SpellingChecked = False

           'Change the language constant in the following line if necessary;
           'when you type the = sign, a list of all supported language
           'constants will appear, and you can choose one from the list.
           FmFld.Range.LanguageID = wdEnglishUS
           'Or whichever language is appropriate for you

           'If the current form field contains errors, spellcheck the text
in it
           If FmFld.Range.SpellingErrors.Count > 0 Then
               'The following condition is to allow for a Word 97 bug, which
               'was fixed in 2000; (and in the latest Word 97 patches). If
               'the formfield is in a table and contains more than one
               'paragraph, then spellchecking it will crash Word 97
               If Left$(Application.Version, 1) = "8" _
                         And FmFld.Range.Paragraphs.Count > 1 _
                         And FmFld.Range.Tables.Count > 0 Then
                   Call Word97TableBugWorkaround(FmFld)
                   If Cancelled Then Exit Sub
               Else
                   'Set a range to the formfield's range in case the user
                   'accidentally destroys the formfield by overtyping its
entire
                   'contents
                   Set MyRange = FmFld.Range
                   FmFldCount = oSection.Range.FormFields.Count
                   Application.ScreenUpdating = True

                   FmFld.Range.CheckSpelling

                   If IsObjectValid(FmFld) Then
                       If FmFld.Range.SpellingErrors.Count > 0 Then
                           'User pressed Cancel button. (Pressing Ignore
                           'reduces the count, pressing Cancel doesn't)
                           Cancelled = True
                           Exit Sub
                       End If
                   Else
                       'If formfield was destroyed because user overtyped its
                       'entire contents
                       CorrectedError = MyRange.Text
                       If Len(CorrectedError) = 0 Then
                           CorrectedError = MyRange.Words(1).Text
                       End If

                       'Formfields should really NEVER be preceded by a tab;
                       'design your forms so that each formfield is in its
own
                       'table cell (removing borders as necessary).
However, to
                       'cater for any legacy forms you may have, the
following
                       'loop works around the possibility that it might be
                       'preceded by a tab
                       Pos = InStr(CorrectedError, vbTab)
                       Do While Pos > 0
                           CorrectedError = Mid$(CorrectedError, Pos + 1)
                           Pos = InStr(CorrectedError, vbTab)
                       Loop

                       'If formfield was destroyed when the user corrected
the
                       'spelling, reinstate it, and put the user's
correction into its
                       'result. Note that although Undo reinstates the
Formfield
                       'itself, if the Formfield is preceded by a tab, It
doesn't
                       'reinstate the FmFld object, hence the need to do a
count
                       '(although, as previously stated, in a well-designed
form,
                       'formfields should never be preceded by a tab, as it's
                       'better use table cells (removing borders as
necessary).
                       Do While Not FmFldCount = _
                               oSection.Range.FormFields.Count
                           oDoc.Undo
                       Loop

                       'Also due to a Word bug, if the formfield is
preceded by a
                       'tab, the text within the formfield may now be
selected
                       'without the formfield itself being selected!
                       'Hence the following convoluted workaround
                       If Selection.FormFields.Count = 0 Then
                           Selection.MoveRight unit:=wdCharacter
                           Selection.MoveLeft unit:=wdCharacter, Extend:=True
                       End If
                       If Not IsObjectValid(FmFld) Then
                           Set FmFld = Selection.FormFields(1)
                       End If
                       FmFld.Result = CorrectedError
                   End If
               End If
               Application.ScreenUpdating = False
           End If
       End If
   End If
Next FmFld

End Sub

Private Sub TurnNoProofingOff(FmFld As FormField)
   'This subroutine is called only in Word 2000 and above
   FmFld.Range.NoProofing = False
End Sub
Private Sub Word97TableBugWorkaround(FmFld As FormField)

'Unlink formfield (convert to text)
Set MyRange = FmFld.Range
FmFld.Range.Fields(1).Unlink
Application.ScreenUpdating = True
MyRange.CheckSpelling
If MyRange.SpellingErrors.Count > 0 Then
   'User pressed Cancel button
   '(Pressing Ignore reduces the count, pressing Cancel doesn't)
   Cancelled = True
End If
CorrectedError = MyRange.Text
'Undo to reinstate the formfield
Do While Not IsObjectValid(FmFld)
   oDoc.Undo
Loop
FmFld.Range.Fields(1).Result.Text = CorrectedError
Application.ScreenUpdating = False

End Sub

Signature

Coacb Tony

> CoachTony was telling us:
> CoachTony nous racontait que :
[quoted text clipped - 31 lines]
>
>     Selection.Style = "myStyleWithBullets"
Jean-Guy Marcil - 30 Aug 2006 16:18 GMT
CoachTony was telling us:
CoachTony nous racontait que :

> Thanks very much for your help on this, although I am not too clear
> on your instructions.
>
> Below is the code used for the spellchecker, perhaps you can point
> out which piece(s) need modification for me, please -)

Option Explicit

Sub ChangeFieldFormatting()

Dim MyRange As Range
Dim oDoc As Document

Set oDoc = ActiveDocument
'I've simplified the code since you seemed pretty sure that
'it will only be used with docs that are protected for forms

'Check If protected - if not quit
Select Case oDoc.ProtectionType
   Case wdNoProtection, wdAllowOnlyRevisions, wdAllowOnlyComments
       'Don't want to run code if not protectyed or has wrong
       'type of protection
        Exit Sub
End Select

Set MyRange = Selection.Range

'If we've got this far, it's protected for forms
'Now unprotect the document
oDoc.Unprotect
oDoc.SpellingChecked = False

Selection.Style = "myStyleWithBullets"

'Re-protect the document
oDoc.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
MyRange.Select

Set MyRange = Nothing

End Sub

Signature

Salut!
_______________________________________
Jean-Guy Marcil - Word MVP
jmarcilREMOVE@CAPSsympatico.caTHISTOO
Word MVP site: http://www.word.mvps.org

CoachTony - 30 Aug 2006 17:17 GMT
Wow, thanks for your persistance in helping me with my problem!

Still having some trouble though..

After creating the new macro, I add it to the menu ("Tools") so the users
can make use of it easly.

The previous version of the code worked wonderfully...but when I try to
implement this code and attach then run it I get an error "5834 - Item with
specified name does not exist".

When I enter debug mode it sits on the line ..."Selection.Style =
"myStyleWithBullets"

It would seem I need to break these two functions into seperate bits of
code...

...any thoughts on inserting symbols??

Once again, thanks for your help...you are awesome!
Signature

Coacb Tony

> CoachTony was telling us:
> CoachTony nous racontait que :
[quoted text clipped - 40 lines]
>
> End Sub
Jean-Guy Marcil - 30 Aug 2006 20:58 GMT
CoachTony was telling us:
CoachTony nous racontait que :

> Wow, thanks for your persistance in helping me with my problem!
>
[quoted text clipped - 9 lines]
> When I enter debug mode it sits on the line ..."Selection.Style =
> "myStyleWithBullets"

"myStyleWithBullets" is just a fictional style name I used to show you that
you have to first create a style with bullets.

Once you have created that style, use its name in the code instead of
"myStyleWithBullets".

Signature

Salut!
_______________________________________
Jean-Guy Marcil - Word MVP
jmarcilREMOVE@CAPSsympatico.caTHISTOO
Word MVP site: http://www.word.mvps.org

 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.