Aquí tienes la forma 3001 que responde a todo lo que preguntas, a partir de lo que dices que tienes: http://www.filebig.net/files/6U9ZK9dqTT
Tengo un formulario de Pedidos (con un subform de detalles, para "complicarlo más):
Voy a anular el pedido 10251, para lo que pulso el botón del encabezado. Me pide confirmar la eliminación:
Si le digo que no, pues no hace nada. Si le digo que sí, me abre un formulario emergente con motivos de eliminación (lo hice con un marco, por hacerlo bonito, pero puedes usar un combinado como te indican en la otra respuesta):
Hay una opción "Otros", que al pulsarla, hace que aparezca un cuadro de texto para escribir cualquier otro motivo de los no previstos:
Tecleo algo, pulso Aceptar y...
Me borra el pedido de la tabla Pedidos (y el detalle de la tabla detalles), confirma la eliminación, y me copió los datos del pedido eliminado, más el motivo de eliminación, en la tabla PedidosAnulados (y los registros del detalle en DetallesPedidosAnulados):
Los códigos usados son:
En el botón "anular" del formulario Pedidos:
If MsgBox("¿Confirmas que quieres eliminar el pedido actual?", vbInformation + vbYesNo, "CONFRMACIÓN") = vbYes Then
DoCmd.OpenForm "FMotivos", , , , , acDialog
CurrentDb.Execute "INSERT INTO PedidosAnulados SELECT * FROM Pedidos WHERE IdPedido=" & Me.IdPedido
CurrentDb.Execute "INSERT INTO DetallesdepedidosAnulados SELECT * FROM [Detalles de Pedidos] WHERE IdPedido=" & Me.IdPedido
CurrentDb.Execute "UPDATE PedidosAnulados SET Motivo='" & elMotivo & "' WHERE IdPedido=" & Me.IdPedido
DoCmd.RunCommand acCmdDeleteRecord
MsgBox "Pedido eliminado correctamente", vbInformation + vbOKOnly, "EXITO"
End If
En el formulario FMotivos, en los eventos "después de actualizar" del marco de opciones (para mostrar/ocultar el cuadro de texto) y en el botón:
Private Sub Comando11_Click()
Select Case Marco0
Case 1
elMotivo = "Solicitud del cliente"
Case 2
elMotivo = "Error en el pedido"
Case 3
If Nz(Me.txtOtro, "") = "" Then
MsgBox "Tienes que indicar un motivo", vbInformation + vbOKOnly, "ERROR"
Me.txtOtro.SetFocus
Exit Sub
Else
elMotivo = Me.txtOtro
End If
Case Else
End Select
DoCmd.Close acForm, Me.Name
End Sub
Private Sub Marco0_AfterUpdate()
Me.txtOtro.Visible = IIf(Me.Marco0 = 3, True, False)
End Sub
Y en un módulo independiente la declaración de una variable pública para recoger el motivo y pasarlo a la tabla:
Public elMotivo As String