Vaya respuesta NO necesita crear tablas extras y tampoco hace falta el evento Al activar registro, en su defecto es el evento Al descargar. Hay 2 formas:
1. Utilizando las propiedades del formulario
2. Utilizando una variable pública
FORMA 1
Tiene la ventaja que sirve para TODOS los formularios, pero necesita más código.
CÓDIGO DEL FORMULARIO
Evento Al cargar
Private Sub Form_Load()
Dim rst As DAO.Recordset
Dim lngIDarticulo As Long
lngIDarticulo = ObtenerPropiedadFormulario(Me.Name, "LastRecord")
Set rst = Me.RecordsetClone
With rst
.FindFirst "idarticulo = " & lngIDarticulo
If Not .NoMatch Then
Me.Bookmark = .Bookmark
Else
DoCmd.GoToRecord acForm, Me.Name, acNewRec
End If
End With
End Sub
Evento Al descargar
Private Sub Form_Unload(Cancel As Integer)
EstablePropiedadFormulario Me.Name, "LastRecord", Nz(Me.idarticulo, 0)
End Sub
FUNCIONES REQUERIDAS
Copie este código en un módulo
Sub EstablePropiedadFormulario(strForm As String, strPropName As String, _
strPropValue As String)
Dim dbs As DAO.Database
Dim ctr As DAO.Container
Dim doc As DAO.Document
Dim prp As DAO.Property
Set dbs = CurrentDb
Set ctr = dbs.Containers("Forms")
Set doc = ctr.Documents(strForm)
' Intento de establecer la propiedad especificada.
On Error GoTo hay_error
doc.Properties(strPropName) = strPropValue
Salir:
Exit Sub
hay_error:
' si no se encuentra la propiedad.
If Err.Number = 3270 Then
'Crear propiedad
Set prp = doc.CreateProperty(strPropName, _
dbText, strPropValue)
doc.Properties.Append prp
Else
MsgBox Err.Description, vbExclamation, "Error"
End If
Resume Salir
End Sub
Function ObtenerPropiedadFormulario(strForm As String, strPropName As String)
Dim dbs As DAO.Database
Dim ctr As DAO.Container
Dim doc As DAO.Document
Dim prp As DAO.Property
On Error GoTo hay_error
Set dbs = CurrentDb
Set ctr = dbs.Containers("Forms")
Set doc = ctr.Documents(strForm)
Set prp = doc.Properties(strPropName)
ObtenerPropiedadFormulario = prp.Value
Salir:
Exit Function
hay_error:
Select Case Err.Number
Case 3265
MsgBox "Formulario no encontrado", vbExclamation, "Error"
Case 3270
MsgBox "Propiedad no encontrada", vbExclamation, "Error"
Case Else
MsgBox Err.Description, vbExclamation, "Error"
End Select
Resume Salir
End Function
Lo anterior le permite utilizarlo para todos los formularios
FORMA 2
Para esta se debe crear una variable pública por el ID de cada formulario y se debe tener cuidado en cambiar la variable en los respectivos eventos.
(La imagen es similar)
Evento Al Cargar
Private Sub Form_Load()
Dim rst As Object
Set rst = Me.RecordsetClone
With rst
.FindFirst "idarticulo = " & lngID
If Not .NoMatch Then
Me.Bookmark = .Bookmark
Else
DoCmd.GoToRecord acForm, Me.Name, acNewRec
End If
End With
End Sub
Observe que en este caso utilizo como variable pública lngID. Esta varía para cada formulario y se definir a nivel de módulo.
Evento Al Descargar
Private Sub Form_Unload(Cancel As Integer)
lngID = Nz(Me.idarticulo)
End Sub
Definición de la variable a nivel de formulario.
Option Compare Database
Option Explicit
Public lngID As Long
En este caso como solo tengo un formulario no hay problema, pero ya para varios se debe adicionar una variable con el respectivo ID.
Estos ejemplos sirven solo para un entorno monousuario, para entorno multiusuario se debe adicionar el id del usuario. Etc. En conclusión es más profesional la forma 1.