ACC: GotoRecord Macro Action Behaves Unexpectedly

ID: Q141627


The information in this article applies to:


SYMPTOMS

Moderate: Requires basic macro, coding, and interoperability skills.

The GotoRecord macro action doesn't behave as you would expect when you use it in an AutoKeys macro. Instead of changing the record of the active form, it changes the record of a form in the background.


CAUSE

These symptoms appear when you use the GotoRecord action in an AutoKeys macro while a form is opened with a Timer event running.


RESOLUTION

This resolution assumes that you are familiar with Visual Basic for Applications and with creating Microsoft Access applications using the programming tools provided with Microsoft Access. For more information about Visual Basic for Applications, please refer to your version of the "Building Applications with Microsoft Access" manual.

NOTE: Visual Basic for Applications is called Access Basic in Microsoft Access version 2.0. For more information about Access Basic, please refer to the "Building Applications" manual.

To achieve the desired result of selecting the next or previous record on the active form when you press a predefined key, follow these steps:

  1. Create a module and type the following line in the Declarations section if it is not already there:
    
          Option Explicit 


  2. Type the following procedures:

    In Microsoft Access 7.0 and 97:
    
          Function GotoPreviousRecord()
             On Error Goto GotoPreviousErrorHndlr
                ' Screen.ActiveForm.Name forces the GotoRecord action
                ' to be applied to the active form.
                DoCmd.GoToRecord acForm, Screen.ActiveForm.Name, acPrevious
             ExitGotoPreviousRecord:
                Exit Function
             GotoPreviousErrorHndlr:
                MsgBox Error$
                Resume ExitGotoPreviousRecord
          End Function
    
          Function GotoNextRecord()
             On Error Goto GotoNextErrorHndlr
                ' Screen.ActiveForm.Name forces the GotoRecord action
                ' to be applied to the active form.
                DoCmd.GoToRecord acForm, Screen.ActiveForm.Name, acNext
             ExitGotoNextRecord:
                Exit Function
             GotoNextErrorHndlr:
                MsgBox Error$
                Resume ExitGotoNextRecord
          End Function
    
       In Microsoft Access 2.0:
    
          Function GotoPreviousRecord()
             On Error Goto GotoPreviousErrorHndlr
                ' Screen.ActiveForm.Name forces the GotoRecord action
                ' to be applied to the active form.
                DoCmd GotoRecord A_FORM, Screen.ActiveForm.Name, A_PREVIOUS
             ExitGotoPreviousRecord:
                Exit Function
             GotoPreviousErrorHndlr:
                MsgBox Error$
                Resume ExitGotoPreviousRecord
          End Function
    
          Function GotoNextRecord()
             On Error Goto GotoNextErrorHndlr
                ' Screen.ActiveForm.Name forces the GotoRecord action
                ' to be applied to the active form.
                DoCmd GotoRecord A_FORM, Screen.ActiveForm.Name, A_NEXT
             ExitGotoNextRecord:
                Exit Function
             GotoNextErrorHndlr:
                MsgBox Error$
                Resume ExitGotoNextRecord
          End Function 


  3. Create an AutoKeys Macro and assign each key stroke to the macro action RunCode. The RunCode's Function Name argument is the appropriate custom function's name. If you used the examples above, it is either GotoPreviousRecord() or GotoNextRecord().



MORE INFORMATION

Steps to Reproduce Behavior


  1. Open the sample database Northwind.mdb (or NWIND.MDB in version 2.0), and then Open the Employees form in Design view.


  2. Add a text box to the form header section, and set its Name property to CurrentTime.


  3. Set the TimerInterval property of the Employees form to 1000 (one second).


  4. Set the OnTimer property of the Employees form to [Event Procedure] and click the Build button.


  5. Type the following procedure for the OnTimer property's event procedure:

    NOTE: In version 2.0, the word Private before Sub is omitted by default.
    
          Private Sub Form_Timer()
             Me![CurrentTime] = Now()
          End Sub
    
        This procedure updates the time in the CurrentTime control once every
        second. 


  6. Create a macro named AutoKeys with the following settings:
    
          Macro Name  Action
          ----------------------
          {F2}        GotoRecord
          {F3}        GotoRecord
    
          {F2} Actions
           -----------
           GotoRecord
               Record: Previous
          {F3} Actions
           -----------
           GotoRecord
               Record: Next 


  7. Close and save the macro.


  8. Open the Employees, Categories, and Customers forms. Make sure that either the Categories or Customers form is active.


  9. Press the F3 key. Note that the AutoKeys macro does run but it selects the next record on the Employees form instead of the active form, as you would expect.



REFERENCES

For more information about AutoKeys, search the Help Index for "AutoKeys," or ask the Microsoft Access 97 Office Assistant.


Keywords          : McrProb 
Version           : 2.0 7.0 97
Platform          : WINDOWS 
Issue type        : kbprb 

Last Reviewed: April 30, 1999