Eliminar una tabla elegida en un combobox

Me gustaría saber que código puedo utilizar para eliminar (no dejar en blanco) una tabla que tengo elegida mediante un cuadro combinado (combobox).

El código que no me funciona es:

Private Sub cmdEliminarTabla_Click()
Dim vartabla As String
vartabla = Me.Cuadro_combinado01
DoCmd.DeleteObject acTable, " vartabla" 

End Sub

2 Respuestas

Respuesta
2

La verdad, no entiendo la instrucción. Primero, el evento al hacer clic no te sirve porque todavía no has elegido nada en el combinado. Segundo, ¿para qué definir una variable que va a ser exactamente igual al valor de un control?

Supongamos que tengo una serie de tablas

Y tengo un formulario con un combinado al que he llamado Eliminar, donde selecciono la tabla Cobros

Una vez que la he seleccionado

Ha desaparecido

El código del evento Después de actualizar del combinado es, simplemente

Private Sub Eliminar_AfterUpdate()
DoCmd.DeleteObject acTable, "" & Me.Eliminar & ""
End Sub

Muchas gracias Icue por tu respuesta pero he olvidado decirte que en el evento Después de actualizar del cuadro combinado, tengo el siguiente código que me dió Sveinbjorn, con el cual

visiono  la tabla,  en el formulario, que he seleccionado en el cuadro combinado.

Private Sub Cuadro_combinado01_AfterUpdate()

Dim vartabla As String
vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado

Por lo tanto me creo un botón de comando y en el evento Al hacer clic le pongo el código que no me funciona.

También he pensado antes de eliminar la tabla cerrarla, pero no funciona.

Un saludo.

Pero tal como lo estás haciendo te obliga a elegir primero un nombre de tabla en el combinado y luego pulsar el botón. ¿Para qué? Si lo puedes hacer en el mismo momento que lo eliges. Prueba a poner la instrucción que te dije en el evento Después de actualizar del combinado.

Gracias Icue:

Lo que pretendo es primero ver la tabla y después de haberla visto eliminarla o no.

Por lo tanto necesito primero verla.

Un saludo

No sé que tendrás puesto, pero si primero quieres verla puedes poner en el evento Después de actualizar

DoCmd.OpenTable "" & Me.Eliminar & ""

Con lo cual abrirás la tabla que hayas elegido. Supongo que después de verla la cerrarás. Entonces podrías poner en ese botón que citas

Dim respuesta as byte

respuesta=msgbox("¿Está seguro de querer eliminar esta tabla?,vbyesno,"Decídete de una vez, luego no hay vuelta atrás")

If respuesta=vbyes then

DoCmd.DeleteObject "" & Me.Eliminar & ""

end if

Gracias Icue por tu respuesta.

No la entiendo bien, pero mañana, hoy he tenido un mal día, la analizaré detenidamente y te diré como me ha ido.

Un saludo.

Buenos días Icue:

La solución que propones me da error: "Se ha producido el error '13' en tiempo de ejecución.

No coinciden los tipos.

Como uso el comando DoCmd.OpenTable "" & Me.Eliminar & ""

Me visiona la tabla tal como es. Mientras que yo la veo como la tengo diseñada en el formulario

mediante el siguiente código en el evento Después de actualizar del Cuadro combinado:

Dim vartabla As String
vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado, tu le llamas "Eliminar"
Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
'Preguntas para borrar y borras
If MsgBox("¿Quieres borrar esta tabla?", vbYesNo) = vbYes Then
Me.RecordSource = ""
Me.Requery
DoCmd.DeleteObject acTable, vartabla
End If

Muchas gracias.

Un saludo

Me rindo. Con esa instrucción le estás diciendo que el origen de registros del formulario sean los campos de la tabla que hayas elegido. Eso obliga a que los controles tengan todos el mismo Origen de control, o lo que es lo mismo, que los campos de las diferentes tablas se llamen igual, ya que si no los controles del formulario no te mostrarían los valores.

Buenos dias Icue:

Efectivamente todos los campos se llaman igual en todas las tablas, pero claro, tienen datos distintos.

En total hay 22 campos, pues se trata de escribir asientos contables, con campos como compañia, fecha, moneda, debe, haber, cta. Contable, importe, etc. etc.

El nombre de cada tabla es el del asiento contable.

Imaginate que fueran facturas con sus coceptos fecha, importe, iva, descuento, retnción, etc. etc

Un saludo.

Y dichas facturas las quisiera consultar eligiéndolas mediante un combobox.

O las quisiera modificar eligiéndolas mediante un combobx.

O las quisiera eliminar eligiéndolas mediante un combobox.

Etc. Etc.

Un saludo.

Yo hubiera hecho una sola tabla y le hubiera añadido un campo llamado, por ejemplo, Concepto y ahí es donde elegiría si el "movimiento" corresponde a Ingresos, Salidas, Ventas, etc, ya que todo lo demás es exactamente igual

Luego para saber cualquier cosa, podría poner un combinado con los diferentes conceptos y es donde usaría lo de

Me.recordsource="select * from nombretabla where concepto like '" & me.nombredelcombinado & "'"

Que cuando anoto el asiento que sea quiero que me "arrastre" un saldo en función del tipo de concepto, uso, por ejemplo

Saldo=Dsum("nz([debe])-nz([haber])","nombretabla","concpeto like '" & me.concepto & "'")

Y me evito hacer 20 tablas exactamente iguales.

Buenas noches Icue.

Creo que no me estoy explicando bien y también que te falta información para entenderme:

Los asientos contables se estaban haciendo con Excel y estos asientos (Hojas de Excel) se mandan por correo para contabilizar en oficinas centrales.

El hecho de hacerlos con Access es porque entiendo un poquito de vba y facilito la elaboración de esos asientos que después convierto, mediante vba en hojas de Excel para su contabilización en oficinas centrales. Cuyo administrativo entiende de Excel y de contabilidad.y no de Access.

Yo estoy jubilado ya, tengo 74 años y esto lo hago por hobby y por ayudar a mis hijos. Que son los que disfrutan de las BD que les preparo para sus trabajos.

Seguro que en Excel se puede programar todo lo que hago con vba. Pero repito no soy capaz de hacerlo.

Un saludo.

Lo siento, de Excel no tengo ni idea. Pero como ambos están hechos en VB se puede hacer exactamente lo mismo. No es por presumir, pero no hay nada en Excel que no pueda hacer en Access. Cuando en Excel usas una función, por ejemplo, Buscar. Si, en realidad le estás diciendo en código

Dlookup(...

Muchas gracias Icue.

Con tu ayuda y la de muchos otros he conseguido generar la BD para facilitarle el trabajo a mi hijo

Esta BD se compone de un menu principal donde figuran los siguientes apartados:

Crear asiento en blanco

Alta asiento

Modificar asiento

Comparar asientos

Consultar asientos

Exportar a Excel asiento

Borrar asiento

Para el código de este apartado, es por el que inicié la pregunta en Todoexpertos.

Ahora estoy pensando que sería bueno eliminar mediante código 3 campos que me he inventado (Auto, Signo y nombre tabla)

pues estos no pueden aparecer en Excel cuando los manden a contabilizar a central.

Si tengo problemas pediré ayuda a Todoexpertos.

Un saludo.

Respuesta
2

Tu código no te funciona (si cuando haces clic en el combinado ya tiene un valor seleccionado) porque al pasar la variable entre comillas, la estás convirtiendo en una cadena de texto y buscará eliminar una tabla que se llama vartabla, que no existe. Si a tu código le quitas esas comillas en la última línea, te funcionará (con el inciso del paréntesis anterior).

Y como te dice Icue, puedes hacerlo directamente sin pasar por la variable, pero en el evento "Después de actualizar":

DoCmd. DeleteObject acTable, Me.Cuadro_combinado01

Muchas gracias Sveinbjorn por tu respuesta.

Te comento lo mismo que a Icue, en el evento: Después de actualizar tengo el código que tu me enviaste hace unos días y que funciona perfectamente.

Por eso creo un botón de comando donde pueda eliminar la tabla, después de haberla visto en el formulario, con tu código:

Private Sub Cuadro_combinado01_AfterUpdate()

Dim vartabla As String
vartabla = Me.Cuadro_combinado01   'Pillamos el nombre de la tabla del cuadro combinado


Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
End Sub

Un saludo

Lo que pretendo es primero ver la tabla y después si me interesa eliminarla o no.

Un abrazo.

¿Esto es lo que buscas?

Private Sub Cuadro_combinado01_AfterUpdate()
Dim vartabla As String
vartabla = Me.Cuadro_combinado01   'Pillamos el nombre de la tabla del cuadro combinado
Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
'Preguntas para borrar y borras
If MsgBox("¿Quieres borrar esta tabla?",vbYesNo)=vbYes Then DoCmd.DeleteObject acTable, vartabla 
End Sub

Buenos días Sveinbjorn:

El código que envías me puede valer, pero da error "3211" El motor de la base de datos no pudo bloquear la tabla "nombre de la tabla", porque actualmente la está utilizando otro usuario o proceso.

Es lógico pues aparece con el RecordSource que le tengo puesto.

Si elimino código y dejo solo

Private Sub Cuadro_combinado01_AfterUpdate()

If MsgBox("¿Quieres eliminar esta tabla?", vbYesNo) Then

DoCmd.Delete Object acTable, Me.Cuadro_combinado01

End If

End Sub

Con solo este código si funciona pero claro no veo los datos de la tabla y sin ver los datos no puedo decidir si la elimino o la dejo.

Un saludo 

Prueba a usar una SQL para eliminar la tabla:

Private Sub Cuadro_combinado01_AfterUpdate()
Dim vartabla As String
vartabla = Me.Cuadro_combinado01   'Pillamos el nombre de la tabla del cuadro combinado
Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
'Preguntas para borrar y borras
If MsgBox("¿Quieres borrar esta tabla?",vbYesNo)=vbYes Then CurrentDb.Execute "DROP TABLE " & vartabla 
End Sub

y si te da error, cambia o elimina el Recordsource antes de proceder al borrado

Private Sub Cuadro_combinado01_AfterUpdate()
Dim vartabla As String
vartabla = Me.Cuadro_combinado01   'Pillamos el nombre de la tabla del cuadro combinado
Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
'Preguntas para borrar y borras
If MsgBox("¿Quieres borrar esta tabla?",vbYesNo)=vbYes Then 
   Me.RecordSource = ""
   Me.Requery
   DoCmd.DeleteObject acTable, vartabla 
End If
End Sub

Gracias Sveinbjorn por contestar, pero mis conocimientos de vba son escasos y no entiendo que quieres decir con "Prueba a usar una SQL para eliminar la tabla".

Un saludo

Te puse el código que debes usar con las dos opciones, solo tienes que hacer un copia-pega

¡Gracias!

La segunda opción funciona bien. Queda el formulario, al perder el RecordSource, un poco raro pero ya veré la forma de arreglarlo de alguna manera.

Un millón de gracias una vez más.

Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas