-
DocumentBeforeClose Help
Hi all,
I am trying to validate all form fields in a Word doc prior to close and message the user that these fields must be completed before the doc closes. Once they have clicked 'OK', I want the doc to stay open to allow them to update mandatory fields. This what I have so far (which doesn't work):
Code:
Private Sub DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
Dim intResponse As Integer
Dim FFld As FormField
Set Doc = ActiveDocument
For Each FFld In Doc.FormFields
If Trim(FFld.Result) = "" Then
intResponse = MsgBox("Please enter a value in each field", vbOKOnly)
' Cancel = True will prevent the document from closing once the sub is complete
' Cancel = False will close the document after sub is complete.
Cancel = True
End If
Next
End Sub
Thanks for your help!
-
There is no VBA documentbeforeclose event, so it is not surprising that it doesn't work
If you are going to use macros then you could validate the fields as you complete the form - http://www.gmayor.com/formfieldmacros.htm but you cannot force users to run the macros.
Personally I would not use legacy form fields. I would use content controls, which have their own exit events - but you still need macros.
-
Quote:
Originally Posted by
Mrbrtsde
Hi all,
I am trying to validate all form fields in a Word doc prior to close and message the user that these fields must be completed before the doc closes. Once they have clicked 'OK', I want the doc to stay open to allow them to update mandatory fields. This what I have so far (which doesn't work):
Code:
Private Sub DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
Dim intResponse As Integer
Dim FFld As FormField
Set Doc = ActiveDocument
For Each FFld In Doc.FormFields
If Trim(FFld.Result) = "" Then
intResponse = MsgBox("Please enter a value in each field", vbOKOnly)
'Cancel = True will prevent the document from closing once the sub is complete
'Cancel = False will close the document after sub is complete.
Cancel = True
End If
Next
End Sub
Thanks for your help!
That is an Application event so you first have to create the class.
In a new class module (named clsNormal) paste:
Code:
Option Explicit
Private WithEvents mWordApp As Word.Application
Private Sub Class_Initialize()
Set mWordApp = Word.Application
End Sub
Private Sub mWordApp_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
End Sub
In a new standard module paste:
Code:
Option Explicit
Private oCls As clsNormal
Sub AutoExec()
Set oCls = New clsNormal
lbl_Exit:
Exit Sub
End Sub
-
Code:
Private Sub DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
Dim intResponse As Integer
Dim FFld As FormField
Dim allFieldsCompleted As Boolean
allFieldsCompleted = True
For Each FFld In Doc.FormFields
If Trim(FFld.Result) = "" Then
intResponse = MsgBox("Please enter a value in each field", vbOKOnly)
allFieldsCompleted = False
Exit For ' Exits the loop immediately after finding an incomplete field
End If
next
If Not allFieldsCompleted Then
Cancel = True ' Prevents the document from closing when there are incomplete fields
End If
End Sub
With this change, the document will not close if any fields are not completed. The user will receive a warning and can continue to update required fields before closing the document.
-
It looks like you're on the right track with your DocumentBeforeClose event. However, the issue might stem from the fact that once you find an empty form field, you're setting Cancel = True, which prevents the document from closing, but you also need to ensure that the message box doesn't keep popping up for every empty field.
Consider breaking the loop after displaying the message to avoid multiple prompts. Here’s a quick adjustment you could make:
Copy
Code:
If Trim(FFld.Result) = "" Then
MsgBox "Please enter a value in each field", vbOKOnly
Cancel = True
Exit For ' Exit the loop after showing the message
End If
This way, the user will only see the message once, and they can fill in the required fields before trying to close the document again. Hope this helps!