Lo siento pero no entiendo exactamente que es lo que estás realizando ya que dices que usas eventos de inserción de nuevos regístros en una tabla ("al apretarlo guarda la información al mismo tiempo que cierra el formulario y me deja nuevamente en la tablay..."). Imagino que te estas refiriendo a un formulario de inserción de registros basado en la tabla, no en la tabla en si. Te comento lo que creo entender y como suele hacerse. De antemano te digo que lo habitual es hacerlo usando código, por lo que si deseas que te lo escriba deberás de darme más datos.
En general si tenemos uno o mas campos en una tabla, un formulario con cuadros de lista basados en esos campos, y queremos incorporar nuevos valores en esos campos tecleandolos directamente en la lista, tenemos que comprobar primero como es la estructura de la tabla en la que vamos a introducir ese nuevo registro. Me explico.
Si para dar de alta un registro en esa tabla basta con añadir un nuevo valor en, por ejemplo, el campo Colonia ya que la clave principal es un autonumérico, se puede realizar todo desde código. El código asociado al evento 'Al no estar en la lista' primero te pregunta si quieres añadir el nuevo valor en la tabla, si respondes que sí lo hace directamente sin necesidad de abrir tabla o formulario (no da errores al generar el autonumérico identificador de ese registro en concreto), y actualiza los valores de la lista en el formulario activo manteniendo seleccionado el valor nuevo que acabas de introducir. Es decir, ya tienes dado de alta el nuevo valor que se mantiene en tu lista y tras presionar Intro vas al siguiente campo.
Por el contrario, si para dar de alta un registro necesitas ir a otro formulario por no tener la clave principal como autonumérico o porque se necesiten completar otros datos, lo habitual es abrir el formulario en donde se dan de alta esos nuevos registros, completar los valores requeridos (el ya introducido en la lista que origina todo esto se copia directamente en este formulario para dar altas en un nuevo regístro) y asociar una orden al evento del botón guardar y salir para que actualice las listas que dependan de los registros de la tabla que contiene Colonia y Barrio. Es decir, abres un formulario de altas de esos valores, los das de alta y al salir vuelves a estar en tu formulario de registros con los nuevos valores ya operativos en las listas.
Te copio un ejemplo de código que hace lo que te comentaba en el primer caso.
Basta con que sustituyas los nombre de campos, tablas... por lo que necesites. En este ejemplo tengo una lista de empresas en un cuadro de lista en un formulario. Al teclear en la lista un valor que no existe pregunto si quiere darlo de alta en la tabla en la que se guardan los nombre de las empresas. Si respondes que no, borro el valor introducido y espero uno nuevo. Si respondes que sí, abro un recorset que introduce el nuevo valor en la tabla (en mi caso 'Empresas de Contratas') y como ese valor lo puedo usar en otro campo del mismo formulario (tengo dos listas 'IdEmpresa' e 'IdEmpresaPrincipal' que usan ambos los mismos valores del campo 'NombreEmpresa' de la tabla 'Empresas de Contratas') actualizo los valores de la otra lista para que también me presente como opción el nuevo valor introducido.
===================
Private Sub IdEmpresa_NotInList(NewData As String, Response As Integer)
On Error GoTo Err_IdEmpresa_NotInList
Dim ctl As Control, miRespuesta As Integer, msg As String, estilo, title As String
Dim miBD As Database, miNuevoValor As Recordset
Set ctl = Me!IdEmpresa
title = "Empresa de contratas no registrada"
msg = "La empresa de contratas que acaba de introducir no se encuentra registrada."
msg = msg & vbCrLf & vbLf & "Presione el botón 'Aceptar' si desea darla de alta."
msg = msg & vbCrLf & vbLf & "Presione el botón 'Cancelar' si desea volver a comprobar el listado predefinido."
estilo = vbOKCancel + vbQuestion + vbDefaultButton1
miRespuesta = MsgBox(msg, estilo, title)
If miRespuesta = vbCancel Then
Response = acDataErrContinue
ctl.Undo
Else
Response = acDataErrAdded
Set miBD = CurrentDb
Set miNuevoValor = miBD.OpenRecordset("Empresas de Contratas", dbOpenDynaset)
With miNuevoValor
.AddNew
!NombreEmpresa = NewData
.Update
.Close
End With
Set miBD = Nothing
Me!IdEmpresaPrincipal.Requery
End If
Exit_IdEmpresa_NotInList:
Exit Sub
Err_IdEmpresa_NotInList:
MsgBox Err.Description
Resume Exit_IdEmpresa_NotInList
End Sub
================================
Si necesitas más ayuda como te decía necesitaría mas datos. Puedes contestarme dándome más detalles ya que son necesarios si quieres que te escriba código para ello(estructura de las tablas afectas con sus relaciones, nombre de formulario de registros y de los campos de lista, origen de datos de los cuadros de lista, orden de tabulación en el formulario en el que se encuentran, código de cierre del formulario...) o si lo prefieres puedes enviarme parte de tu base de datos para que pueda verla más detalladamente. Si prefieres enviármela haz lo siguiente: genera una copia de tu aplicación e incluye en ella solo las tablas y formularios implicados en tu pregunta. Compacta el archivo resultante y dejame en las tablas un par de registros de prueba y enviame la copia a
[email protected].
Procuraré responderte en cuanto me sea posible.
Cordiales saludos y animo con las piruetas, que así comienzan grandes artistas de todo género.