No puede insertar datos sin validar que exista la tabla, en caso que no exista se debe permitir crearla, la respuesta que le dan "da respuesta" a su pregunta esta lejos de seguir los lineamientos de programación. A pesar que ha valorado la respuesta he preparado este ejemplo:
- Valida que exista la tabla
- Permite crear la tabla para el año (si no existe)
- Valida la integridad de los datos.
- Utiliza un formulario para recoger el año a registrar
- Con base en 2 funciones y 2 procedimientos realiza el trabajo.
Hago clic en el botón Guardar y se abre el formulario para seleccionar el año.
Al hacer cli en Aceptar se pregunta si está de acuerdo con el año
Si hace clic en Si, nos informa sobre la creación satisfactoria.
Observe que se ha creado la tabla para Tabla_2022 (con base en el diseño de la tabla Tabla_2020)
CÓDIGO DEL BOTÓN GUARDAR DEL FORMULARIO frmDatos
Private Sub Comando6_Click()
If IsNull(Me.ctlnota) Or IsNull(Me.cboServicio) Or IsNull(Me.ctl_identificador) Then
MsgBox "Verifique que no falten datos", vbInformation, "Cuidado.."
Exit Sub
End If
DoCmd.OpenForm "frmPeriodo"
End Sub
CÓDIGO DEL BOTÓN ACEPTAR DEL FORMULARIO frmPeriodo
Private Sub btnInsertar_Click()
If IsNull(Me.cboPeriodo) Then
MsgBox "Seleccione un año de la lista", vbInformation, "Cuidado..."
Me.cboPeriodo.SetFocus
Exit Sub
End If
If MsgBox("¿Está seguro que registra la información del año " & Me.cboPeriodo & "?", vbQuestion + vbYesNo + vbDefaultButton2, "Grabando..") = vbYes Then
crear_tabla (Me.cboPeriodo)
CurrentDb.Execute "INSERT INTO " & strTabla & "(nota,servicios,identificador) VALUES ('" & Forms!frmDatos!ctlnota & "'," & _
Forms!frmDatos!cboServicio & "," & Forms!frmDatos!ctl_identificador & ")"
DoCmd.Close acForm, Me.Name
MsgBox "Registro adicionado OK", vbInformation, "Le informo"
End If
End Sub
CÓDIGO DEL BOTÓN CANCELAR DEL FORMULARIO frmPeriodo
Private Sub btnCancelar_Click()
DoCmd.Close acForm, Me.Name
End Sub
CÓDIGO DEL MODULO VBA
Option Compare Database
Option Explicit
Public strTabla As String
Public Function crear_tabla(periodo As Integer)
'Asume que existe ya una tabla base para copiarla,
'en caso contrario se debe cambiar la función para
'crear la tabla mediante SQL.
strTabla = "Tabla_" & periodo
If existe_tabla(strTabla) = False Then
DoCmd.CopyObject "", strTabla, acTable, "Tabla_2020"
CurrentDb.Execute "DELETE * FROM " & strTabla
'reinicio autonumerico
DoCmd.RunSQL "ALTER TABLE " & strTabla & " ALTER COLUMN id COUNTER(1,1);"
End If
End Function
Public Function existe_tabla(miTabla As String) As Boolean
Dim db As Database
Dim tbl As TableDef
Dim existe As Boolean
Set db = CurrentDb
For Each tbl In db.TableDefs
If tbl.Name = miTabla Then
existe = True
Exit For
End If
Next
If existe = True Then
existe_tabla = True
Else
existe_tabla = False
End If
Set db = Nothing
End Function
Una recomendación no utilice input() para tomar información es un mal habito de programación.
Aunque tiene código o "Enciclopedia Británica" como dicen otros, pero es la forma de manejar la información. Si quiere el ejemplo lo puede solicitar a [email protected] favor en el asunto anotar la consulta.