Why did my code stop working? - ms-access

When I entered docmd. In my code it worked, until I closed it then it stopped working here is my code .
Private Sub Command1_Click()
If (Txtusername = "123" And txtpassword = 123) Then
DoCmd.OpenForm FormName:="Kappa", View:=acNormal, DataMode:=acFormPropertySettings, windowMode:=acWindowNormal
DoCmd.Close
Else
MsgBox "Incorrect Login or Password"
End If
End Sub

I expect the form you call is opening then immediately closing (do you see it 'flash') because the opening form gets focus and the DoCmd.Close is acting on form that has focus. The calling form remains open. Specify the form to close.
DoCmd.Close acForm, "form name", acSaveNo

DoCmd.Close closes the object currently having the focus. This is the Form opened in the previous line. I assume that you want to close the Form running this code. So, write:
DoCmd.Close acForm, Me.Name

Related

After Login Open specific Navigationtab

In my MS-Access Database I Got a LoginForm, which checks If a User has Access to a specific form or Not.
My main, called "NavigationsFormular" has 4 Tabs
A normal User can access the 1st tab called "Bautagesbericht".
A ControlingUser can access the 2nd, 3d, 4th tab, but not the 1st!
The Login Form is a pop-up at start, I dont want to change it to a tab too,that would be ugly and not optimal.
After the Login succeeded, it loads up the Navigationform.
For the normal user its no problem, but for the controlling part it always says " No access " because it tried to open a tab he's not permitted to.
Thats the Code btw:
If Globals.UserAccess(Me.Name) = False Then
MsgBox " No access!"
DoCmd.Close acForm, Me.Name
End If
Now my idea was, that the Login Form open the form, which the user got permissions to by following code:
If Globals.UserAccess("frm_Räumstellenerfassung") = False Then
DoCmd.BrowseTo ObjectType:=acBrowseToForm, _
ObjectName:="frm_Taetigkeitseingabe_Büro", _
PathToSubformControl:="Navigationsformular.NavigationsUnterformular>frm_Taetigkeitseingabe_Büro.NavigationsUnterformular"
DoCmd.Close acForm, Me.Name
Else
DoCmd.OpenForm "Navigationsformular"
DoCmd.Close acForm, Me.Name
End If
End Sub
The Problem is that the Path is not right..
Hauptformular1 / MainFormular1 = "NavigationsFormular"
Unterformular1 / SubForm1 = "NavigationsUnterformular" (in German)
Formular1 = "frm_Taetigkeitseingabe_Büro"
Tried all combinations nothing helped.
BTW: A Button in my Naviagtion form with this Code is working. Apparently not when trying from an other form.
DoCmd.BrowseTo acBrowseToForm, "frm_Taetigkeitseingabe_Büro","Navigationsformular.NavigationsUnterformular"
ok I followed #June7 tipps. thanks for that. Here my solution:
Edited my form "frm_Räumstellenerfassung" ( Bautagesbericht) to
Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord , , acNewRec
If Globals.UserAccess("frm_Räumstellenerfassung") = False Then
DoCmd.BrowseTo acBrowseToForm, "frm_Taetigkeitseingabe_Büro", "Navigationsformular.NavigationsUnterformular"
End If
End Sub
So msg " No Access " is not popping up anymore and if the User has no rights to see this form, its browsing to the 2nd tab(Tätigkeitserfassung) without seeing any details of the 1st form.
My Login button just navigate to the navigationform
DoCmd.OpenForm "Navigationsformular"
DoCmd.Close acForm, Me.Name

Access 2010 VBA: Why doesn't this sequence of form openings and closings work?

I have a form "Form1" with a command button that when clicked, hides itself, and then opens another form "Form2" as follows:
Private Sub Command1_Click()
Me.Visible = False
DoCmd.OpenForm "Form2"
End Sub
The Form_Open subroutine of Form2 contains a check for errors. If an error is found, I want Form2 to display an error, close Form1, and then close itself:
Private Sub Form_Open(Cancel As Integer)
AnError = 'check for an error
If Not AnError Then
'things are OK
Else
Response = MsgBox("There was an error in Form2.", 0, "Form2 error message")
DoCmd.Close acForm, "Form1"
DoCmd.Close
End If
End Sub
I've tried numerous variations on this scheme for opening and closing the forms, and all fail in different ways. This particular one seems to do everything except actually close Form2 after the error message is displayed.
Once again I'm baffled about the way Access 2010 VBA handles the opening and closing of forms; the reference information at MSDN is atrocious. Thanks for any help.
You are close. - this code will also close Form2:
Private Sub Form_Open(Cancel As Integer)
'AnError = 'check for an error
If Not True Then
'things are OK
Else
Response = MsgBox("There was an error in Form2.", 0, "Form2 error message")
DoCmd.Close acForm, "Form1"
DoCmd.Close acForm, Me.Name 'Me.Name is used for illustration purposes, you can also use "Form2"
End If
End Sub
I've always seen this done via the UnLoad keyword
Try this,
If Not AnError Then
'things are OK
Else
Response = MsgBox("There was an error in Form2.", 0, "Form2 error message")
Unload Form1
'Unload Me
'OR since you can cancel this form loading
Cancel = True
End If
Try changing to the Me object:
Private Sub Form_Open(Cancel As Integer)
AnError = 'check for an error
If Not AnError Then
'things are OK
Else
Response = MsgBox("There was an error in Form2.", 0, "Form2 error message")
DoCmd.Close acForm, "Form1"
Me.Close
' or possibly Unload Me
End If
End Sub

ms access form closing ask save yesnocancel

I have put the VBA in Unload Form Event in ms access 2010
Private Sub Form_Unload(Cancel As Integer)
Dim strMsg As String
Dim iResponse As Integer
' Specify the message to display.
strMsg = "Do you wish to save the changes?" & Chr(10)
strMsg = strMsg & "Click Yes to Save or No to Discard changes."
' Display the message box.
iResponse = MsgBox(strMsg, vbQuestion + vbYesNoCancel, "Save Record?")
' Check the user's response.
If iResponse = vbYes Then
' Undo the change.
DoCmd.RunCommand acCmdSave
End If
If iResponse = vbNo Then
' Undo the change.
DoCmd.RunCommand acCmdUndo
End If
If iResponse = vbCancel Then
' Undo the change
Cancel = True
End If
End Sub
If data is changed then the above code is working fine, then yes to save & close, No to undo & close and cancel to cancel event and remain on the form
but when the data is unchanged then Yes button is working fine, but NO button do not close the form
Where I m mistaking ?
Your question is too vague because you simply state "NO button do not close the form."
You can do:
DoCmd.Close
See here:
Private Sub cmdCloseForm_Click()
On Error GoTo Err_cmdCloseForm_Click
DoCmd.RunCommand acCmdUndo 'OR Me.Undo - test which works best for your situation
DoCmd.Close
Exit_cmdCloseForm_Click:
Exit Sub
Err_cmdCloseForm_Click:
MsgBox Err.Description
Resume Exit_cmdCloseForm_Click
End Sub
On Me.Undo from Allen Browne:
Me.Undo cancels the edits in a specific form, so that it is no longer dirty.
Once the form is no longer dirty, no further undo is possible, because it
has reached the desired state. However, Me. represents the form that is in focus, so your form must have focus to perform the Me.Undo command.

runtime error 2448 you cant assign a value to this object

I am using David-W-Fenton's answer to this question to try to allow users to print a report when they click on a control, but I am getting the following error message:
runtime error 2448: you cannot assign a value to this object.
The line of code triggering the error is:
Me.txtPageTo.Value = numPages
Here is the full code of the OnLoad event handler for the form:
Private Sub Form_Load()
Dim varPrinter As Printer
Dim strRowsource As String
Dim strReport As String
If Len(Me.OpenArgs) > 0 Then
strReport = Me.OpenArgs
Me.Tag = strReport
For Each varPrinter In Application.Printers
strRowsource = strRowsource & "; " & varPrinter.DeviceName
Next varPrinter
Me!cmbPrinter.RowSource = Mid(strRowsource, 3)
' first check to see that the report is still open
If (1 = SysCmd(acSysCmdGetObjectState, acReport, strReport)) Then
With Reports(strReport).Printer
Me!cmbPrinter = .DeviceName
Me!optLayout = .Orientation
End With
Dim numPages As String
numPages = Reports(strReport).Pages
Debug.Print "numPages = " & numPages
TypeName(Me.txtPageTo) 'added this line as a test after
Me.txtPageTo.Value = numPages
End If
End If
End Sub
numPages prints out to equal 0 just before the error is thrown, even though the report should have at least one page. Also, the error does not get thrown when the form is already open. The error only gets thrown when the form has to be opened. (Probably because the offending code is in the onload event.)
When I added TypeName(Me.txtPageTo) , it triggered runtime error 2424: The expression you entered has a field, control, or property name that mydatabasename cant find.
I think the problem is that I need to set the control source for txtPageFrom and txtPageTo. But how do I do that? This form will only be loaded by a vba method that is trying to print a report, so the values for txtPageFrom and txtPageTo will come from the calling method, not from some underlying data table. (there is no underlying data table for this dialog form.)
cmbPrinter and optLayout seem to be populating correctly using the code above.
Can anyone show me how to get past the error messages so that the form loads properly?
CORRECT, COMPLETE ANSWER:
The answer to this problem was to greatly simplify the code. The code in the link at the top of this posting is WAY TOO COMPLEX, and tries to reinvent things that are already done well by the tools built into Access and VBA. I was able to print reports without any of the complicated solutions by simply using the following code in the on-click event of a control on a form associated with the report:
Private Sub txtPrintReport_Click()
On Error GoTo Error_Handler
Dim commNum As Long
commNum = Me.CommunicationNumber
Dim strReport As String
Dim strVarName As String
strReport = "rptCommunicationFormForPrinting"
strVarName = "CommunicationNumber"
DoCmd.OpenReport strReport, acViewPreview, , strVarName & " = " & commNum, acWindowNormal, acHidden
DoCmd.RunCommand acCmdPrint
DoCmd.Close acReport, strReport
Exit_Point:
Exit Sub
Error_Handler: 'this handles the case where user clicks cancel button
If Err.Number <> 2501 Then
MsgBox Err.Description, _
vbExclamation, "Error " & Err.Number
End If
DoCmd.Close acReport, strReport
End Sub
That is all the code that was required. Much less than the link at the start of this question. And also much less than the answer below. I am marking John Bingham's answer as the accepted answer because he clearly worked a lot on this, and I am very grateful for that. But I ended up solving the problem with A LOT LESS CODE. My solution does not require the custom dialog form because it uses the Windows print dialog form. As such, the on load event code in my posting (taken from the link above), is not necessary.
The code posted cannot work, because when a form is opened as a dialog:
DoCmd.OpenForm "dlgPrinter", , , , , acDialog, strReport
no other logic after this line is executed until the form has been closed, at which point control returns to the next line after this one, and logic continues on - except of course you can no longer reference anything in that form, because it is now closed.
Ok, now there is a question, where is the button the user clicks to print a report?
What I'm thinking is to split the logic in PrintReport into two methods, one that launches it, and tells the form to configure itself (doing the stuff suggested in the comment), but the rest of PrintReport then needs to happen after the user clicks OK (or Cancel);
So if I assume that you've got a form which can launch one or more reports, and the button is on this form, what I would suggest is this:
In the click event for that button - no changes to what you've got.
In that buttons form, add this:
Public Sub DialogAccept()
With Forms!dlgPrinter
If .Tag <> "Cancel" Then
Set Reports(strReport).Printer = Application.Printers((!cmbPrinter))
Reports(strReport).Printer.Orientation = !optLayout
Application.Echo False
DoCmd.SelectObject acReport, strReport
DoCmd.PrintOut acPages, !txtPageFrom, !txtPageTo
PrintReport = True
End If
End With
DoCmd.Close acForm, "dlgPrinter"
DoCmd.Close acReport, strReport
Application.Echo True
End Sub
Change PrintReport to:
Public Function PrintReport(strReport As String, strVarName As String, numVal As Long) As Boolean
' open report in PREVIEW mode but HIDDEN
DoCmd.OpenReport strReport, acViewPreview, , strVarName & " = " & numVal, acHidden
'DoCmd.OpenReport strReport, acViewPreview, , , acHidden
' open the dialog form to let the user choose printing options
DoCmd.OpenForm "dlgPrinter", , , , , , strReport
Forms!dlgPrinter.Configure
End Function
In the OK/Cancel button click events on dlgPrinter put (after existing code, but removing any instances of "Docmd.close"):
Forms!Calling_Form_Name.DialogAccept
This then calls that method, to do the stuff that is meant to happen after the user says "I'm done with the dialog".
Finally add the configure method to dlgPrinter:
Public Sub Configure()
With Reports(Me.Tag).Printer
Me!cmbPrinter = .DeviceName
Me!optLayout = .Orientation
End With
Dim numPages As String
numPages = Reports(Me.Tag).Pages
Debug.Print "numPages = " & numPages
TypeName(Me.txtPageTo) 'added this line as a test after
Me.txtPageTo.Value = numPages
End Sub
And remove this code section from Form_Load.
Hoep this helps.
Lastly, if the form on which the button launching dlgPrinter can vary, change this line:
DoCmd.OpenForm "dlgPrinter", , , , , acDialog, strReport
to:
DoCmd.OpenForm "dlgPrinter", , , , , acDialog, strReport & ";" & me.Name
In form_load of dlgPrinter, break up me.Openargs using left() & mid() with instr(), and save me.Name into the tag of something on the form (which you're not already using the tag of).
In the OK/Cancel button click events, change the code above to:
Forms(Object.Tag).DialogAccept

set focus on a particular form in Access 2007

I have multiple forms in access, How can I set focus on a "Form1" on load event of "Form2"?
I tried the below method, but it doesn't work. The focus is still on "Form2"
Private Sub Form_Load()
DoCmd.OpenForm "Form1"
Forms!Form1.SetFocus
End Sub
I have selected "Form2" in "Display Form:" option in "Access Options", I am opening "Form1" in "Form2" Load event and then trying to set focus to "Form1"
Thanks in advance
Changed :
I think the only solution is to open the form as a dialog :
DoCmd.OpenForm "Form1" ', , , , , acDialog
try it, it worked for me
Try this :
Private Sub Form_Activate()
DoCmd.OpenForm "Form1"
Forms!Form1.SetFocus
End Sub