PC Review


Reply
Thread Tools Rate Thread

Code to Implement Required Cells Not Working

 
 
Bob
Guest
Posts: n/a
 
      12th Apr 2010
I have a worksheet called "Change Request Form" where users are required to
input values in the following cells:

C9 = CPM Full Name
C10 = IT PM Full Name
C11 = Change Type
C12 = Reason Category
C13 = Project Name
C14 = Release
C15 = PAT ID
C16 = PRISM ID
C17 = Explanation
E15 = New PAT ID
E16 = New PRISM ID

I want to require users to provide input in most or all of the other
aforementioned cells prior to Saving the workbook depending on the value of
cell C11.

I wrote the code shown below and put it in the ThisWorkbook object.
Unfortunately, upon testing, users are still able to Save the workbook
without all the required cells being populated.

Being somewhat of a novice with VBA, I would be very grateful if someone
could tell me where I have gone wrong with my code.

Thanks in advance for any assistance.

Bob

-----------------------

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

' This code checks to see that all required fields contain
' data before allowing the user to Save the workbook

Dim iCell As Variant

' Change Type = blank

If Sheets("CTI Change Request Form").Range("C11").Value = "" Then
Cancel = True
MsgBox "The workbook cannot be saved until a Change Type has
been selected.", _
vbCritical, "Missing Change Type!"
Sheets("CTI Change Request Form").Range("C11").Select
Exit Sub
End If

' Reason Category = blank

If Sheets("CTI Change Request Form").Range("C12").Value = "" Then
Cancel = True
MsgBox "The workbook cannot be saved until a Reason Category has
been selected.", _
vbCritical, "Missing Reason Category!"
Sheets("CTI Change Request Form").Range("C12").Select
Exit Sub
End If

' Change Type = ADD

If Sheets("CTI Change Request Form").Range("C11").Value = "ADD" Then
For Each iCell In Sheets("CTI Change Request
Form").Range("C9:C11,C13:C16")
If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL fields have been
populated.", _
vbCritical, "Missing Required Data!"
Exit Sub
End If
Next iCell
End If

' Change Type = MOVE

If Sheets("CTI Change Request Form").Range("C11").Value = "MOVE" Then
For Each iCell In Sheets("CTI Change Request Form").Range("C9:C17")
If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL fields have been
populated.", _
vbCritical, "Missing Required Data!"
Exit Sub
End If
Next iCell
End If

' Change Type = DROP, ON HOLD, CANCEL, or RE-START

If Sheets("CTI Change Request Form").Range("C11").Value = "DROP" Or _
Sheets("CTI Change Request Form").Range("C11").Value = "ON HOLD" Or _
Sheets("CTI Change Request Form").Range("C11").Value = "CANCEL" Or _
Sheets("CTI Change Request Form").Range("C11").Value = "RE-START" Then
For Each iCell In Sheets("CTI Change Request
Form").Range("C9:C13,C15:C17")
If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL fields have been
populated.", _
vbCritical, "Missing Required Data!"
Exit Sub
End If
Next iCell
End If

' Change Type = REF. CHANGE and Reason Category = PAT ID changed

If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
Sheets("CTI Change Request Form").Range("C12").Value = "PAT ID changed"
Then
For Each iCell In Sheets("CTI Change Request
Form").Range("C9:C13,C15:C17,E15")
If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL fields have been
populated.", _
vbCritical, "Missing Required Data!"
Exit Sub
End If
Next iCell
End If

' Change Type = REF. CHANGE and Reason Category = PRISM ID changed

If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
Sheets("CTI Change Request Form").Range("C12").Value = "PRISM ID changed"
Then
For Each iCell In Sheets("CTI Change Request
Form").Range("C9:C13,C15:C17,E16")
If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL fields have been
populated.", _
vbCritical, "Missing Required Data!"
Exit Sub
End If
Next iCell
End If

' Change Type = REF. CHANGE and Reason Category = PAT and PRISM IDs changed

If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
Sheets("CTI Change Request Form").Range("C12").Value = "PAT and PRISM IDs
changed" Then
For Each iCell In Sheets("CTI Change Request
Form").Range("C9:C13,C15:C17,E15:E16")
If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL fields have been
populated.", _
vbCritical, "Missing Required Data!"
Exit Sub
End If
Next iCell
End If

End Sub

 
Reply With Quote
 
 
 
 
JLatham
Guest
Posts: n/a
 
      12th Apr 2010
Bob, I took the liberty of revising your code to use Select Case instead of
all of the IF..Then statements, and also added an object to assign as that
worksheet (mostly for brevity of code lines).

The testing all pre-processes the C11/C12 values by removing any leading or
trailing blanks from them and converting them to all UPPERCASE for more
positive testing. For example, when you test them for = "", it may be that
one or the other actually contains " ", in which case your test would fail.
With Trim() it won't.

Make a copy of your workbook and replace the code in it with the code below
and see how it goes. Watch out for line-wraps; after copying your code from
your posting I had to do a bit of fixing up from all the damage the system
here did to it, and I'm sure it'll repeat that again. I tried to shorten
them up enough to where it won't, but it often fools me.

I also added a couple of Case Else statements that will report to you when
the value of either C11 or C12 is not any of the tested values. I presume
you have coded this to cover all valid entries in C11 and C12, so this would
help if you forgot one or there's a typo involved in things.


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)

' This code checks to see that all required fields contain
' data before allowing the user to Save the workbook

Dim iCell As Variant
Dim ctiSheet As Worksheet

Set ctiSheet = _
ThisWorkbook.Worksheets("CTI Change Request Form")

'moved to the top since we only have one thing to
'consider if C12 is blank/empty
' the Trim() will make sure that a single space
' in the cell doesn't fool your testing
' Reason Category = blank
If Trim(ctiSheet.Range("C12").Value) = "" Then
Cancel = True
MsgBox "The workbook cannot be saved until " & _
"a Reason Category has been selected.", _
vbCritical, "Missing Reason Category!"
ctiSheet.Range("C12").Select
Set ctiSheet = Nothing ' housekeeping
Exit Sub
End If

'use Select Case for now to help visualize process and
'values that C11 may take
' UCase and Trim will make sure that certain typos
' won't affect the results
Select Case UCase(Trim(ctiSheet.Range("C11")))
Case Is = ""
' Change Type = blank
Cancel = True
MsgBox "The workbook cannot be saved until a " & _
"Change Type has been selected.", _
vbCritical, "Missing Change Type!"
Sheets("CTI Change Request Form").Range("C11").Select

Case Is = "ADD"
' Change Type = ADD
For Each iCell In ctiSheet.Range("C9:C11,C13:C16")
If IsEmpty(ctiSheet.Range(iCell.Address)) Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL " & _
"fields have been populated.", _
vbCritical, "Missing Required Data!"
End If
Next iCell

Case Is = "MOVE"
' Change Type = MOVE
For Each iCell In ctiSheet.Range("C9:C17")
If IsEmpty(ctiSheet.Range(iCell.Address)) Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL " & _
"fields have been populated.", _
vbCritical, "Missing Required Data!"
End If
Next iCell

Case Is = "DROP", "ON HOLD", "CANCEL RE-START"
' Change Type = DROP, ON HOLD, CANCEL, or RE-START
For Each iCell In ctiSheet.Range("C9:C13,C15:C17")
If IsEmpty(ctiSheet.Range(iCell.Address)) Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL " & _
"fields have been populated.", _
vbCritical, "Missing Required Data!"
End If
Next iCell

Case Is = "REF. CHANGE"
' Change Type = REF. CHANGE also check Reason Category
'and Reason Category = PAT ID changed
Select Case UCase(Trim(ctiSheet.Range("C12")))
Case Is = "PAT ID CHANGED" ' all UPPER CASE
'Reason Category = PAT ID changed
For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E15")
If IsEmpty(ctiSheet.Range(iCell.Address)) Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL " & _
"fields have been populated.", _
vbCritical, "Missing Required Data!"
End If
Next iCell

Case Is = "PRISM ID CHANGED"
'Reason Category = PRISM ID changed
For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E16")
If IsEmpty(ctiSheet.Range(iCell.Address)) Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL " & _
"fields have been populated.", _
vbCritical, "Missing Required Data!"
End If
Next iCell

Case Is = "PAT AND PRISM IDS CHANGED"
'Reason Category = PAT and PRISM IDs changed
For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E15:E16")
If IsEmpty(ctiSheet.Range(iCell.Address)) Then
Cancel = True
MsgBox "The workbook cannot be saved until ALL " & _
"fields have been populated.", _
vbCritical, "Missing Required Data!"
End If
Next iCell

Case Else
'this assumes that all possible valid cases for C12
'have been tested previously
MsgBox "Change Type entry is not any expected entry!", _
vbCritical, "C11 Has Unexpected Value"
Cancel = True

End Select ' end Reason Category Tests

Case Else
'this assumes that all possible valid cases for C11
'have been tested previously
MsgBox "Change Type entry is not any expected entry!", _
vbCritical, "C11 Has Unexpected Value"
Cancel = True
End Select
'housekeeping
Set ctiSheet = Nothing

End Sub


"Bob" wrote:

> I have a worksheet called "Change Request Form" where users are required to
> input values in the following cells:
>
> C9 = CPM Full Name
> C10 = IT PM Full Name
> C11 = Change Type
> C12 = Reason Category
> C13 = Project Name
> C14 = Release
> C15 = PAT ID
> C16 = PRISM ID
> C17 = Explanation
> E15 = New PAT ID
> E16 = New PRISM ID
>
> I want to require users to provide input in most or all of the other
> aforementioned cells prior to Saving the workbook depending on the value of
> cell C11.
>
> I wrote the code shown below and put it in the ThisWorkbook object.
> Unfortunately, upon testing, users are still able to Save the workbook
> without all the required cells being populated.
>
> Being somewhat of a novice with VBA, I would be very grateful if someone
> could tell me where I have gone wrong with my code.
>
> Thanks in advance for any assistance.
>
> Bob
>
> -----------------------
>
> Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
>
> ' This code checks to see that all required fields contain
> ' data before allowing the user to Save the workbook
>
> Dim iCell As Variant
>
> ' Change Type = blank
>
> If Sheets("CTI Change Request Form").Range("C11").Value = "" Then
> Cancel = True
> MsgBox "The workbook cannot be saved until a Change Type has
> been selected.", _
> vbCritical, "Missing Change Type!"
> Sheets("CTI Change Request Form").Range("C11").Select
> Exit Sub
> End If
>
> ' Reason Category = blank
>
> If Sheets("CTI Change Request Form").Range("C12").Value = "" Then
> Cancel = True
> MsgBox "The workbook cannot be saved until a Reason Category has
> been selected.", _
> vbCritical, "Missing Reason Category!"
> Sheets("CTI Change Request Form").Range("C12").Select
> Exit Sub
> End If
>
> ' Change Type = ADD
>
> If Sheets("CTI Change Request Form").Range("C11").Value = "ADD" Then
> For Each iCell In Sheets("CTI Change Request
> Form").Range("C9:C11,C13:C16")
> If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL fields have been
> populated.", _
> vbCritical, "Missing Required Data!"
> Exit Sub
> End If
> Next iCell
> End If
>
> ' Change Type = MOVE
>
> If Sheets("CTI Change Request Form").Range("C11").Value = "MOVE" Then
> For Each iCell In Sheets("CTI Change Request Form").Range("C9:C17")
> If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL fields have been
> populated.", _
> vbCritical, "Missing Required Data!"
> Exit Sub
> End If
> Next iCell
> End If
>
> ' Change Type = DROP, ON HOLD, CANCEL, or RE-START
>
> If Sheets("CTI Change Request Form").Range("C11").Value = "DROP" Or _
> Sheets("CTI Change Request Form").Range("C11").Value = "ON HOLD" Or _
> Sheets("CTI Change Request Form").Range("C11").Value = "CANCEL" Or _
> Sheets("CTI Change Request Form").Range("C11").Value = "RE-START" Then
> For Each iCell In Sheets("CTI Change Request
> Form").Range("C9:C13,C15:C17")
> If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL fields have been
> populated.", _
> vbCritical, "Missing Required Data!"
> Exit Sub
> End If
> Next iCell
> End If
>
> ' Change Type = REF. CHANGE and Reason Category = PAT ID changed
>
> If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
> Sheets("CTI Change Request Form").Range("C12").Value = "PAT ID changed"
> Then
> For Each iCell In Sheets("CTI Change Request
> Form").Range("C9:C13,C15:C17,E15")
> If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL fields have been
> populated.", _
> vbCritical, "Missing Required Data!"
> Exit Sub
> End If
> Next iCell
> End If
>
> ' Change Type = REF. CHANGE and Reason Category = PRISM ID changed
>
> If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
> Sheets("CTI Change Request Form").Range("C12").Value = "PRISM ID changed"
> Then
> For Each iCell In Sheets("CTI Change Request
> Form").Range("C9:C13,C15:C17,E16")
> If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL fields have been
> populated.", _
> vbCritical, "Missing Required Data!"
> Exit Sub
> End If
> Next iCell
> End If
>
> ' Change Type = REF. CHANGE and Reason Category = PAT and PRISM IDs changed
>
> If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
> Sheets("CTI Change Request Form").Range("C12").Value = "PAT and PRISM IDs
> changed" Then
> For Each iCell In Sheets("CTI Change Request
> Form").Range("C9:C13,C15:C17,E15:E16")
> If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL fields have been
> populated.", _
> vbCritical, "Missing Required Data!"
> Exit Sub
> End If
> Next iCell
> End If
>
> End Sub
>

 
Reply With Quote
 
Bob
Guest
Posts: n/a
 
      12th Apr 2010
JLatham, Wow! I did not expect you (and I wasn't looking for anyone) to
re-write the entire code block. Thanks a million!!! I sincerely appreciate
it.

Had I known you were going to do this, I would have also mentioned in my
post that C11 and C12 contain Data Validation Lists. Furthermore, the
choices displayed in C12 automatically change depending on the choice
selected in C11.

Thanks again for all your help!

Regards,
Bob


"JLatham" wrote:

> Bob, I took the liberty of revising your code to use Select Case instead of
> all of the IF..Then statements, and also added an object to assign as that
> worksheet (mostly for brevity of code lines).
>
> The testing all pre-processes the C11/C12 values by removing any leading or
> trailing blanks from them and converting them to all UPPERCASE for more
> positive testing. For example, when you test them for = "", it may be that
> one or the other actually contains " ", in which case your test would fail.
> With Trim() it won't.
>
> Make a copy of your workbook and replace the code in it with the code below
> and see how it goes. Watch out for line-wraps; after copying your code from
> your posting I had to do a bit of fixing up from all the damage the system
> here did to it, and I'm sure it'll repeat that again. I tried to shorten
> them up enough to where it won't, but it often fools me.
>
> I also added a couple of Case Else statements that will report to you when
> the value of either C11 or C12 is not any of the tested values. I presume
> you have coded this to cover all valid entries in C11 and C12, so this would
> help if you forgot one or there's a typo involved in things.
>
>
> Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
> Cancel As Boolean)
>
> ' This code checks to see that all required fields contain
> ' data before allowing the user to Save the workbook
>
> Dim iCell As Variant
> Dim ctiSheet As Worksheet
>
> Set ctiSheet = _
> ThisWorkbook.Worksheets("CTI Change Request Form")
>
> 'moved to the top since we only have one thing to
> 'consider if C12 is blank/empty
> ' the Trim() will make sure that a single space
> ' in the cell doesn't fool your testing
> ' Reason Category = blank
> If Trim(ctiSheet.Range("C12").Value) = "" Then
> Cancel = True
> MsgBox "The workbook cannot be saved until " & _
> "a Reason Category has been selected.", _
> vbCritical, "Missing Reason Category!"
> ctiSheet.Range("C12").Select
> Set ctiSheet = Nothing ' housekeeping
> Exit Sub
> End If
>
> 'use Select Case for now to help visualize process and
> 'values that C11 may take
> ' UCase and Trim will make sure that certain typos
> ' won't affect the results
> Select Case UCase(Trim(ctiSheet.Range("C11")))
> Case Is = ""
> ' Change Type = blank
> Cancel = True
> MsgBox "The workbook cannot be saved until a " & _
> "Change Type has been selected.", _
> vbCritical, "Missing Change Type!"
> Sheets("CTI Change Request Form").Range("C11").Select
>
> Case Is = "ADD"
> ' Change Type = ADD
> For Each iCell In ctiSheet.Range("C9:C11,C13:C16")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "MOVE"
> ' Change Type = MOVE
> For Each iCell In ctiSheet.Range("C9:C17")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "DROP", "ON HOLD", "CANCEL RE-START"
> ' Change Type = DROP, ON HOLD, CANCEL, or RE-START
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "REF. CHANGE"
> ' Change Type = REF. CHANGE also check Reason Category
> 'and Reason Category = PAT ID changed
> Select Case UCase(Trim(ctiSheet.Range("C12")))
> Case Is = "PAT ID CHANGED" ' all UPPER CASE
> 'Reason Category = PAT ID changed
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E15")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "PRISM ID CHANGED"
> 'Reason Category = PRISM ID changed
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E16")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "PAT AND PRISM IDS CHANGED"
> 'Reason Category = PAT and PRISM IDs changed
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E15:E16")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Else
> 'this assumes that all possible valid cases for C12
> 'have been tested previously
> MsgBox "Change Type entry is not any expected entry!", _
> vbCritical, "C11 Has Unexpected Value"
> Cancel = True
>
> End Select ' end Reason Category Tests
>
> Case Else
> 'this assumes that all possible valid cases for C11
> 'have been tested previously
> MsgBox "Change Type entry is not any expected entry!", _
> vbCritical, "C11 Has Unexpected Value"
> Cancel = True
> End Select
> 'housekeeping
> Set ctiSheet = Nothing
>
> End Sub
>
>
> "Bob" wrote:
>
> > I have a worksheet called "Change Request Form" where users are required to
> > input values in the following cells:
> >
> > C9 = CPM Full Name
> > C10 = IT PM Full Name
> > C11 = Change Type
> > C12 = Reason Category
> > C13 = Project Name
> > C14 = Release
> > C15 = PAT ID
> > C16 = PRISM ID
> > C17 = Explanation
> > E15 = New PAT ID
> > E16 = New PRISM ID
> >
> > I want to require users to provide input in most or all of the other
> > aforementioned cells prior to Saving the workbook depending on the value of
> > cell C11.
> >
> > I wrote the code shown below and put it in the ThisWorkbook object.
> > Unfortunately, upon testing, users are still able to Save the workbook
> > without all the required cells being populated.
> >
> > Being somewhat of a novice with VBA, I would be very grateful if someone
> > could tell me where I have gone wrong with my code.
> >
> > Thanks in advance for any assistance.
> >
> > Bob
> >
> > -----------------------
> >
> > Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
> >
> > ' This code checks to see that all required fields contain
> > ' data before allowing the user to Save the workbook
> >
> > Dim iCell As Variant
> >
> > ' Change Type = blank
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "" Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until a Change Type has
> > been selected.", _
> > vbCritical, "Missing Change Type!"
> > Sheets("CTI Change Request Form").Range("C11").Select
> > Exit Sub
> > End If
> >
> > ' Reason Category = blank
> >
> > If Sheets("CTI Change Request Form").Range("C12").Value = "" Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until a Reason Category has
> > been selected.", _
> > vbCritical, "Missing Reason Category!"
> > Sheets("CTI Change Request Form").Range("C12").Select
> > Exit Sub
> > End If
> >
> > ' Change Type = ADD
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "ADD" Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C11,C13:C16")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = MOVE
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "MOVE" Then
> > For Each iCell In Sheets("CTI Change Request Form").Range("C9:C17")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = DROP, ON HOLD, CANCEL, or RE-START
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "DROP" Or _
> > Sheets("CTI Change Request Form").Range("C11").Value = "ON HOLD" Or _
> > Sheets("CTI Change Request Form").Range("C11").Value = "CANCEL" Or _
> > Sheets("CTI Change Request Form").Range("C11").Value = "RE-START" Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C13,C15:C17")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = REF. CHANGE and Reason Category = PAT ID changed
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
> > Sheets("CTI Change Request Form").Range("C12").Value = "PAT ID changed"
> > Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C13,C15:C17,E15")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = REF. CHANGE and Reason Category = PRISM ID changed
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
> > Sheets("CTI Change Request Form").Range("C12").Value = "PRISM ID changed"
> > Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C13,C15:C17,E16")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If

 
Reply With Quote
 
Bob
Guest
Posts: n/a
 
      12th Apr 2010
JLatham, after I replaced my code with yours, I noticed that if I attempt to
Save the workbook when some of the fields are still blank, the display of the
message box loops "x" times (where "x" = number of remaining empty fields).
In other words, if I input a value only in cell C11, the message box
continues to be displayed until I have clicked the OK button 8 times.

Could you please tell me how to fix this?

Thanks again.

Regards,
Bob


"JLatham" wrote:

> Bob, I took the liberty of revising your code to use Select Case instead of
> all of the IF..Then statements, and also added an object to assign as that
> worksheet (mostly for brevity of code lines).
>
> The testing all pre-processes the C11/C12 values by removing any leading or
> trailing blanks from them and converting them to all UPPERCASE for more
> positive testing. For example, when you test them for = "", it may be that
> one or the other actually contains " ", in which case your test would fail.
> With Trim() it won't.
>
> Make a copy of your workbook and replace the code in it with the code below
> and see how it goes. Watch out for line-wraps; after copying your code from
> your posting I had to do a bit of fixing up from all the damage the system
> here did to it, and I'm sure it'll repeat that again. I tried to shorten
> them up enough to where it won't, but it often fools me.
>
> I also added a couple of Case Else statements that will report to you when
> the value of either C11 or C12 is not any of the tested values. I presume
> you have coded this to cover all valid entries in C11 and C12, so this would
> help if you forgot one or there's a typo involved in things.
>
>
> Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
> Cancel As Boolean)
>
> ' This code checks to see that all required fields contain
> ' data before allowing the user to Save the workbook
>
> Dim iCell As Variant
> Dim ctiSheet As Worksheet
>
> Set ctiSheet = _
> ThisWorkbook.Worksheets("CTI Change Request Form")
>
> 'moved to the top since we only have one thing to
> 'consider if C12 is blank/empty
> ' the Trim() will make sure that a single space
> ' in the cell doesn't fool your testing
> ' Reason Category = blank
> If Trim(ctiSheet.Range("C12").Value) = "" Then
> Cancel = True
> MsgBox "The workbook cannot be saved until " & _
> "a Reason Category has been selected.", _
> vbCritical, "Missing Reason Category!"
> ctiSheet.Range("C12").Select
> Set ctiSheet = Nothing ' housekeeping
> Exit Sub
> End If
>
> 'use Select Case for now to help visualize process and
> 'values that C11 may take
> ' UCase and Trim will make sure that certain typos
> ' won't affect the results
> Select Case UCase(Trim(ctiSheet.Range("C11")))
> Case Is = ""
> ' Change Type = blank
> Cancel = True
> MsgBox "The workbook cannot be saved until a " & _
> "Change Type has been selected.", _
> vbCritical, "Missing Change Type!"
> Sheets("CTI Change Request Form").Range("C11").Select
>
> Case Is = "ADD"
> ' Change Type = ADD
> For Each iCell In ctiSheet.Range("C9:C11,C13:C16")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "MOVE"
> ' Change Type = MOVE
> For Each iCell In ctiSheet.Range("C9:C17")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "DROP", "ON HOLD", "CANCEL RE-START"
> ' Change Type = DROP, ON HOLD, CANCEL, or RE-START
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "REF. CHANGE"
> ' Change Type = REF. CHANGE also check Reason Category
> 'and Reason Category = PAT ID changed
> Select Case UCase(Trim(ctiSheet.Range("C12")))
> Case Is = "PAT ID CHANGED" ' all UPPER CASE
> 'Reason Category = PAT ID changed
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E15")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "PRISM ID CHANGED"
> 'Reason Category = PRISM ID changed
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E16")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Is = "PAT AND PRISM IDS CHANGED"
> 'Reason Category = PAT and PRISM IDs changed
> For Each iCell In ctiSheet.Range("C9:C13,C15:C17,E15:E16")
> If IsEmpty(ctiSheet.Range(iCell.Address)) Then
> Cancel = True
> MsgBox "The workbook cannot be saved until ALL " & _
> "fields have been populated.", _
> vbCritical, "Missing Required Data!"
> End If
> Next iCell
>
> Case Else
> 'this assumes that all possible valid cases for C12
> 'have been tested previously
> MsgBox "Change Type entry is not any expected entry!", _
> vbCritical, "C11 Has Unexpected Value"
> Cancel = True
>
> End Select ' end Reason Category Tests
>
> Case Else
> 'this assumes that all possible valid cases for C11
> 'have been tested previously
> MsgBox "Change Type entry is not any expected entry!", _
> vbCritical, "C11 Has Unexpected Value"
> Cancel = True
> End Select
> 'housekeeping
> Set ctiSheet = Nothing
>
> End Sub
>
>
> "Bob" wrote:
>
> > I have a worksheet called "Change Request Form" where users are required to
> > input values in the following cells:
> >
> > C9 = CPM Full Name
> > C10 = IT PM Full Name
> > C11 = Change Type
> > C12 = Reason Category
> > C13 = Project Name
> > C14 = Release
> > C15 = PAT ID
> > C16 = PRISM ID
> > C17 = Explanation
> > E15 = New PAT ID
> > E16 = New PRISM ID
> >
> > I want to require users to provide input in most or all of the other
> > aforementioned cells prior to Saving the workbook depending on the value of
> > cell C11.
> >
> > I wrote the code shown below and put it in the ThisWorkbook object.
> > Unfortunately, upon testing, users are still able to Save the workbook
> > without all the required cells being populated.
> >
> > Being somewhat of a novice with VBA, I would be very grateful if someone
> > could tell me where I have gone wrong with my code.
> >
> > Thanks in advance for any assistance.
> >
> > Bob
> >
> > -----------------------
> >
> > Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
> >
> > ' This code checks to see that all required fields contain
> > ' data before allowing the user to Save the workbook
> >
> > Dim iCell As Variant
> >
> > ' Change Type = blank
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "" Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until a Change Type has
> > been selected.", _
> > vbCritical, "Missing Change Type!"
> > Sheets("CTI Change Request Form").Range("C11").Select
> > Exit Sub
> > End If
> >
> > ' Reason Category = blank
> >
> > If Sheets("CTI Change Request Form").Range("C12").Value = "" Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until a Reason Category has
> > been selected.", _
> > vbCritical, "Missing Reason Category!"
> > Sheets("CTI Change Request Form").Range("C12").Select
> > Exit Sub
> > End If
> >
> > ' Change Type = ADD
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "ADD" Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C11,C13:C16")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = MOVE
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "MOVE" Then
> > For Each iCell In Sheets("CTI Change Request Form").Range("C9:C17")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = DROP, ON HOLD, CANCEL, or RE-START
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "DROP" Or _
> > Sheets("CTI Change Request Form").Range("C11").Value = "ON HOLD" Or _
> > Sheets("CTI Change Request Form").Range("C11").Value = "CANCEL" Or _
> > Sheets("CTI Change Request Form").Range("C11").Value = "RE-START" Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C13,C15:C17")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = REF. CHANGE and Reason Category = PAT ID changed
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
> > Sheets("CTI Change Request Form").Range("C12").Value = "PAT ID changed"
> > Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C13,C15:C17,E15")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If
> > Next iCell
> > End If
> >
> > ' Change Type = REF. CHANGE and Reason Category = PRISM ID changed
> >
> > If Sheets("CTI Change Request Form").Range("C11").Value = "REF. CHANGE" And _
> > Sheets("CTI Change Request Form").Range("C12").Value = "PRISM ID changed"
> > Then
> > For Each iCell In Sheets("CTI Change Request
> > Form").Range("C9:C13,C15:C17,E16")
> > If IsEmpty(Sheets("CTI Change Request Form").Range(iCell.Address))
> > Then
> > Cancel = True
> > MsgBox "The workbook cannot be saved until ALL fields have been
> > populated.", _
> > vbCritical, "Missing Required Data!"
> > Exit Sub
> > End If

 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
format cells as zip code not working SS Microsoft Excel Misc 3 3rd Dec 2009 02:53 AM
Search cells code not working Phrank Microsoft Excel Programming 8 7th Sep 2007 03:05 AM
How to implement required field validation =?Utf-8?B?157Xmdeb15DXnCDXp9eo15nXkdeV16E=?= Microsoft ADO .NET 2 16th Mar 2006 05:25 PM
Avoiding page breaks across merged cells - Code not working as expected Alan Microsoft Excel Programming 2 26th Sep 2005 03:55 AM
email from cells to outlook - code not working periro16 Microsoft Excel Programming 2 17th Aug 2005 04:24 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 02:04 PM.