PDA

View Full Version : DocumentBeforeClose Help



Mrbrtsde
11-18-2021, 09:24 AM
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):


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!

gmayor
11-18-2021, 10:57 PM
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.

gmaxey
12-13-2021, 03:21 PM
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):


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:



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:


Option Explicit
Private oCls As clsNormal
Sub AutoExec()
Set oCls = New clsNormal
lbl_Exit:
Exit Sub
End Sub

gohoga
02-21-2024, 02:55 AM
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
EndIf
next


If Not allFieldsCompleted Then
Cancel = True ' Prevents the document from closing when there are incomplete fields
EndIf
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.