Block If Without End If? (1 Viewer)

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
Hello,

I'm pulling my hair out i now getting Block if without end if and it's showing a problem with my formload part.

Here's the code:

Private Sub Form_Load()
If frmOyezstrakerCustomerMailOrderSub!CustomerCardType.Enabled = False Then Me.CustomerAddress.Enabled = False
If frmOyezstrakerCustomerMailOrderSub!CustomerCardType.Enabled = False Then Me.CustomerPostCode.Enabled = False
RefreshDetails
If MsgBox("Would you like to start a new Customer Order?", vbYesNo, "New Customer Order?") = vbYes Then
DoCmd.GoToRecord , , acNewRec
If IsNull(Me.txtRecordNumber) = False Then Me.txtRecordNumber.Visible = False
If IsNull(Me.txtTotalRecords) = False Then Me.txtRecordNumber.Visible = False
If Above = False Then Me.Record_Label.Visible = False
If Above = False Then Me.RecordOf_Label.Visible = False
Else
If IsNull(Me.CustomerDetailsID) Then
If MsgBox("No Customer Orders Found!", vbOKOnly, "Error Message") = vbOK Then
DoCmd.RunCommand acCmdCloseWindow
End If
End Sub

Where have i gone wrong?

Thanks
 

Fuga

Registered User.
Local time
Today, 06:43
Joined
Feb 28, 2002
Messages
566
My guess is you´re missing a few
Code:
end if
or
Code:
elseif

Fuga.
 

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
Where Do they go?

Thanks
 

Fuga

Registered User.
Local time
Today, 06:43
Joined
Feb 28, 2002
Messages
566
Well, as a rule, you need as many end ifs as you have ifs.

But then there are the elses etc.

It´s a bit hard to know what youre trying to do, but think of it like tests:
Code:
if(something) then
Do whatever
End if

this was the simple case, now if you nest it:

Code:
if(something) then
if(something else) then
Do whatever
end if
end if

or if you use else

Code:
If(something) then
Do whatever
else
Do whatever else
end if

Now the first example executes the Whatever if something is true, while the second example executes the whatever if both something and something else is true. And finally the third example executes the whatever else if something is false.

Hope it helps.

Fuga.
 

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
I have had a fiddle with no luck do you think someone could do the corrected version. I'm still very new to VBA.

Thanks
 
R

Rich

Guest
If frmOyezstrakerCustomerMailOrderSub!CustomerCardTyp e.Enabled Then Me.CustomerAddress.Enabled = True
EndIf
If frmOyezstrakerCustomerMailOrderSub!CustomerCardTyp e.Enabled Then Me.CustomerPostCode.Enabled = True
EndIf


If IsNull(Me.txtRecordNumber) Then Me.txtRecordNumber.Visible = True
Me.Record_Label.Visible = True
EndIf
If IsNull(Me.txtTotalRecords) Then Me.txtRecordNumber.Visible = True
Me.RecordOf_Label.Visible = True
EndIf


however I'm confused by these two statements since they seem to contradict each other.

If MsgBox("Would you like to start a new Customer Order?", vbYesNo, "New Customer Order?") = vbYes Then
DoCmd.GoToRecord , , acNewRec
Else
If IsNull(Me.CustomerDetailsID) Then
If MsgBox("No Customer Orders Found!", vbOKOnly, "Error Message") = vbOK Then
DoCmd.RunCommand acCmdCloseWindow
 

pbaldy

Wino Moderator
Staff member
Local time
Yesterday, 21:43
Joined
Aug 30, 2003
Messages
36,124
Rich said:
If frmOyezstrakerCustomerMailOrderSub!CustomerCardType.Enabled Then Me.CustomerAddress.Enabled = True
EndIf
If frmOyezstrakerCustomerMailOrderSub!CustomerCardType.Enabled Then Me.CustomerPostCode.Enabled = True
EndIf


If IsNull(Me.txtRecordNumber) Then Me.txtRecordNumber.Visible = True
Me.Record_Label.Visible = True
EndIf
If IsNull(Me.txtTotalRecords) Then Me.txtRecordNumber.Visible = True
Me.RecordOf_Label.Visible = True
EndIf

Those will actually cause compile errors; due to the mixing of the one-line format of an If/Then statement with the block format. It is difficult to tell exactly what you're trying to do. I'd advise switching exclusively to the block format, at which point it will be easier to see your intentions and what's missing (in fact you'll probably see it for yourself).
 

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
Hello,

What i'm trying to do is When a shop member starts a new order and they want to review old orders if there arn't any i want a message saying no orders found and for the form to close?

Any Ideas on how to change that last bit of code to allow this?

Thanks
Ben
 

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
Hello,

I finally got it sorted here's the updated code:
Private Sub Form_Load()
If frmOyezstrakerCustomerMailOrderSub!CustomerCardType.Enabled Then Me.CustomerAddress.Enabled = True
If frmOyezstrakerCustomerMailOrderSub!CustomerCardType.Enabled Then Me.CustomerPostCode.Enabled = True
RefreshDetails
If MsgBox("Would you like to start a new Customer Order?", vbYesNo, "New Customer Order?") = vbYes Then
DoCmd.GoToRecord , , acNewRec
If IsNull(Me.txtRecordNumber) Then Me.txtRecordNumber.Visible = False
Me.Record_Label.Visible = False
If IsNull(Me.txtTotalRecords) Then Me.txtRecordNumber.Visible = False
Me.RecordOf_Label.Visible = False
Else
DataCheck
End If
End Sub

Private Sub DataCheck()
If IsNull(Me.CustomerDetailsID) Then
MsgBox "No Customer Records Found", vbOKOnly, "Customer Records"
DoCmd.Close
End If
End Sub
 

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
Required Fields

What i would like now is that when a shop assistant is filling out an order form i would like it to verify the fields with friendly messages i've tried it in the table and changing the fields to required but the messages are less than friendly. Is there some code i can add to the save and close buttons to check the fields that are required have data in them if either they close or save the order?

Thanks
 

workmad3

***** Slob
Local time
Today, 05:43
Joined
Jul 15, 2005
Messages
375
indentation helps you match things up, for example:
Code:
Private Sub Form_Load()
	If frmOyezstrakerCustomerMailOrderSub!CustomerCardTyp e.Enabled = False Then Me.CustomerAddress.Enabled = False
	If frmOyezstrakerCustomerMailOrderSub!CustomerCardTyp e.Enabled = False Then Me.CustomerPostCode.Enabled = False
	RefreshDetails
	If MsgBox("Would you like to start a new Customer Order?", vbYesNo, "New Customer Order?") = vbYes Then
		DoCmd.GoToRecord , , acNewRec
		If IsNull(Me.txtRecordNumber) = False Then Me.txtRecordNumber.Visible = False
		If IsNull(Me.txtTotalRecords) = False Then Me.txtRecordNumber.Visible = False
		If Above = False Then Me.Record_Label.Visible = False
		If Above = False Then Me.RecordOf_Label.Visible = False
	Else
		If IsNull(Me.CustomerDetailsID) Then
			If MsgBox("No Customer Orders Found!", vbOKOnly, "Error Message") = vbOK Then
				DoCmd.RunCommand acCmdCloseWindow
			End If
End Sub

A quick glance at it then shows that you are missing 2 end ifs at the end of your code :)
 

boblarson

Smeghead
Local time
Yesterday, 21:43
Joined
Jan 12, 2001
Messages
32,059
Workmad3 - He doesn't need any "End IF" when putting the whole test on one line. He's got several lines where he says If...Then... and the part after THEN doesn't fall on a next line. If you do it that way you don't need an End If, but it can make your line very long and hard to read.
 

workmad3

***** Slob
Local time
Today, 05:43
Joined
Jul 15, 2005
Messages
375
boblarson: I know that. I only indented the if statements where he had spanned the statement on to 2 lines :p
 

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
Hello,

Thanks for the above code!

How does this code look:

It's for a mail order form

Option Compare Database
Private Sub btnCardStartDate_Click()
Me.CustomerCardStartDate = PopUpCalendar(Me.CustomerCardStartDate)
End Sub
Private Sub btnCardExpiryDate_Click()
Me.CustomerCardExpiryDate = PopUpCalendar(Me.CustomerCardExpiryDate)
End Sub
Private Sub btnPaymentProcessed_Click()
Me.PaymentProcessedDate = PopUpCalendar(Me.PaymentProcessedDate)
End Sub
Private Sub Form_Load()
msgResponse = MsgBox("Do you require Mail Order?", vbYesNo, "Mail Order")
Select Case msgResponse
Case vbYes
EnableMailOrder
Case vbNo
DisableMailOrder
End Select
End Sub
Private Sub DisableMailOrder()
If IsNull(Me.CustomerMailOrderID) Then
Me.CustomerMailOrderID.Enabled = False
Me.CustomerDetailsID.Enabled = False
Me.CustomerCardType.Enabled = False
Me.CustomerCardNumber.Enabled = False
Me.CustomerCardIssueNo.Enabled = False
Me.CustomerCardHolderName.Enabled = False
Me.CustomerCardStartDate.Enabled = False
Me.CustomerCardExpiryDate.Enabled = False
Me.CustomerCardSecurityNumber.Enabled = False
Me.CustomerCardAddress.Enabled = False
Me.CustomerCardPostCode.Enabled = False
Me.CustomerCardTelephoneNumber.Enabled = False
Me.PaymentProcessedDate.Enabled = False
Me.PaymentProcessed.Enabled = False
Me.CustomerMailOrderID.Locked = False
Me.CustomerDetailsID.Locked = False
Else
Me.CustomerMailOrderID.Enabled = True
Me.CustomerDetailsID.Enabled = True
Me.CustomerCardType.Enabled = True
Me.CustomerCardNumber.Enabled = True
Me.CustomerCardIssueNo.Enabled = True
Me.CustomerCardHolderName.Enabled = True
Me.CustomerCardStartDate.Enabled = True
Me.CustomerCardExpiryDate.Enabled = True
Me.CustomerCardSecurityNumber.Enabled = True
Me.CustomerCardAddress.Enabled = True
Me.CustomerCardPostCode.Enabled = True
Me.CustomerCardTelephoneNumber.Enabled = True
Me.PaymentProcessedDate.Enabled = True
Me.PaymentProcessed.Enabled = True
Me.CustomerMailOrderID.Locked = True
Me.CustomerDetailsID.Locked = True
Exit_DisableMailOrder:
Exit Sub
End If
Error_DisableMailOrder:
End Sub
Private Sub EnableMailOrder()
If IsNull(Me.CustomerMailOrderID) Then
Me.CustomerMailOrderID.Enabled = True
Me.CustomerDetailsID.Enabled = True
Me.CustomerCardType.Enabled = True
Me.CustomerCardNumber.Enabled = True
Me.CustomerCardIssueNo.Enabled = True
Me.CustomerCardHolderName.Enabled = True
Me.CustomerCardStartDate.Enabled = True
Me.CustomerCardExpiryDate.Enabled = True
Me.CustomerCardSecurityNumber.Enabled = True
Me.CustomerCardAddress.Enabled = True
Me.CustomerCardPostCode.Enabled = True
Me.CustomerCardTelephoneNumber.Enabled = True
Me.PaymentProcessedDate.Enabled = True
Me.PaymentProcessed.Enabled = True
Me.CustomerMailOrderID.Locked = True
Me.CustomerDetailsID.Locked = True
Else
Me.CustomerMailOrderID.Enabled = False
Me.CustomerDetailsID.Enabled = False
Me.CustomerCardType.Enabled = False
Me.CustomerCardNumber.Enabled = False
Me.CustomerCardIssueNo.Enabled = False
Me.CustomerCardHolderName.Enabled = False
Me.CustomerCardStartDate.Enabled = False
Me.CustomerCardExpiryDate.Enabled = False
Me.CustomerCardSecurityNumber.Enabled = False
Me.CustomerCardAddress.Enabled = False
Me.CustomerCardPostCode.Enabled = False
Me.CustomerCardTelephoneNumber.Enabled = False
Me.PaymentProcessedDate.Enabled = False
Me.PaymentProcessed.Enabled = False
Me.CustomerMailOrderID.Locked = False
Me.CustomerDetailsID.Locked = False
Exit Sub
End If
End Sub
 

Banana

split with a cherry atop.
Local time
Yesterday, 21:43
Joined
Sep 1, 2005
Messages
6,318
1) You should always insert "Option Explicit" in top of each module. This will help remind you to strong type your variable and make your life easier.

2) I hope your code is properly indented. It's barely readable as it is.

3) It looks you have two events doing exactly same thing. If that is the case, it may be easier to maintain the code if you use Call method.

4) Use With...End With block if you are going to refer to several properties/methods of same thing. It's faster.

Code:
Private Sub Combobox_AfterUpdate
  
Call ControlEnabler

End Sub

Private Sub AnotherCombobox_AfterUpdate

Call ControlEnabler

End Sub

Private Sub Form_Open

Call ControlEnabler

End Sub

Public Sub ControlEnabler

With Me
   If IsNull(Me.CustomerMailOrderID) Then
    .CustomerMailOrderID.Enabled = True
    .CustomerDetailsID.Enabled = True
    .CustomerCardType.Enabled = True
    .CustomerCardNumber.Enabled = True
    .CustomerCardIssueNo.Enabled = True
    .CustomerCardHolderName.Enabled = True
    .CustomerCardStartDate.Enabled = True
    .CustomerCardExpiryDate.Enabled = True
    .CustomerCardSecurityNumber.Enabled = True
    .CustomerCardAddress.Enabled = True
    .CustomerCardPostCode.Enabled = True
    .CustomerCardTelephoneNumber.Enabled = True
    .PaymentProcessedDate.Enabled = True
    .PaymentProcessed.Enabled = True
    .CustomerMailOrderID.Locked = True
    .CustomerDetailsID.Locked = True
  Else
    .CustomerMailOrderID.Enabled = False
    .CustomerDetailsID.Enabled = False
    .CustomerCardType.Enabled = False
    .CustomerCardNumber.Enabled = False
    .CustomerCardIssueNo.Enabled = False
    .CustomerCardHolderName.Enabled = False
    .CustomerCardStartDate.Enabled = False
    .CustomerCardExpiryDate.Enabled = False
    .CustomerCardSecurityNumber.Enabled = False
    .CustomerCardAddress.Enabled = False
    .CustomerCardPostCode.Enabled = False
    .CustomerCardTelephoneNumber.Enabled = False
    .PaymentProcessedDate.Enabled = False
    .PaymentProcessed.Enabled = False
    .CustomerMailOrderID.Locked = False
    .CustomerDetailsID.Locked = False
  End If
End With

End Sub
 
Last edited:

pbaldy

Wino Moderator
Staff member
Local time
Yesterday, 21:43
Joined
Aug 30, 2003
Messages
36,124
I'll agree with Banana and throw out one more thought: boolean logic to chop the lines in half. This type of thing:

Code:
If IsNull(Me.CustomerMailOrderID) Then 
  BooleanVariable = True
Else
  BooleanVariable = False
End If

Me.CustomerMailOrderID.Enabled = BooleanVariable

That way you only have one line per control instead of two.
 
Last edited:

circlestech

Registered User.
Local time
Today, 05:43
Joined
Aug 7, 2006
Messages
10
I think i'm getting to the stage where i need to get some who knows what there doing to check over my database and make changes to it to make it all work correctly. I've only started VBA a bit this month.
 
R

Rich

Guest
Public Sub ControlEnabler

With Me
If IsNull(Me.CustomerMailOrderID) Then
.CustomerMailOrderID.Enabled = True
.CustomerDetailsID.Enabled = True
.CustomerCardType.Enabled = True
.CustomerCardNumber.Enabled = True
.CustomerCardIssueNo.Enabled = True
.CustomerCardHolderName.Enabled = True
.CustomerCardStartDate.Enabled = True
.CustomerCardExpiryDate.Enabled = True
.CustomerCardSecurityNumber.Enabled = True
.CustomerCardAddress.Enabled = True
.CustomerCardPostCode.Enabled = True
.CustomerCardTelephoneNumber.Enabled = True
.PaymentProcessedDate.Enabled = True
.PaymentProcessed.Enabled = True
.CustomerMailOrderID.Locked = True
.CustomerDetailsID.Locked = True

Surely a For each Cntl in Me.Controls would be even better?
 

Banana

split with a cherry atop.
Local time
Yesterday, 21:43
Joined
Sep 1, 2005
Messages
6,318
Rich said:
Surely a For each Cntl in Me.Controls would be even better?

That's good point- if he wanted all controls on the form to be disabled/enabled. However, wouldn't that also mean there'd be nothing to select from? Will it be limited to detail section or the entire form?
 
R

Rich

Guest
No because each control also has a tag property and you can also use a SelectCase which can be used something like
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acLabel
If ctl.Tag = "A" Then
 

Users who are viewing this thread

Top Bottom