Macro condición

Necesito poner una condición para la ejecución de una linea de macro
Si existe una tabla debo de eliminarla y copiar otra en su lugar, sini existe la tabla tan solo debo de copiar la nueva
¿Me puedes echas un cabo?

1 respuesta

Respuesta
1
En un macro NO se como se pone la condición de que exista un objeto (en código si te podría ayudar si quisieras)
De todas formas como lo que quieres es copiar siempre, a lo mejor te puede valer con desactivar el mensaje de reemplazar la tabla existente...
Para esto ultimo agrega "EstablecerAdvertencias = NO" (Justo antes de "CopiarObjeto")
y "EstablecerAdvertencias = SI" (Justo despues de "CopiarObjeto")
Si me puedes indicar como tengo que definir el código, ya que tengo un botón de comando que llama a esta macro, ¿cómo comprueba si existe la tabla en base de datos?
Gracias
Bueno vamos a empezar por la conversión de mi macro anterior en código (guardar como... y tal)
Function CopiaTabla1()
On Error GoTo CopiaTabla1_Err
DoCmd.SetWarnings False
DoCmd.CopyObject "", "Copia de Tabla1", acTable, "Tabla1"
DoCmd.SetWarnings True
CopiaTabla1_Exit:
Exit Function
CopiaTabla1_Err:
MsgBox Error$
Resume CopiaTabla1_Exit
End Function
Lo anterior solo sirve para ahorrarnos construir el comando de copia a mano, esto es, de todo lo anterior solo hace falta quedarse con:
DoCmd. CopyObject "", "Copia de Tabla1", acTable, "Tabla1"
Incluso el manejo de error se puede tomar del código generado desde el asistente para botones de comando (para ejecutar macro, por ejemplo, da igual)
En fin a mi la cosa me queda funcionando así:
Private Sub Comando0_Click()
On Error GoTo Err_Comando0_Click
If CurrentDb.TableDefs("Copia de Tabla1").Name = "Copia de Tabla1" Then
CurrentDb.TableDefs.Delete "Copia de Tabla1"
End If
DoCmd.CopyObject "", "Copia de Tabla1", acTable, "Tabla1"
Exit_Comando0_Click:
Exit Sub
Err_Comando0_Click:
MsgBox Err.Description
Resume Exit_Comando0_Click
End Sub
En realidad la única función que seguimos encontrando con este de actuar (aparte de aprender un modo de detectar la existencia de una tabla o no) es suprimir el mensaje de error de que el objeto ya existe, por lo me sigue pareciendo más aconsejable el desactivar/activar advertencias (setwarnings false/true)
por todo lo expuesto el metodo ideal para el botón de comando sería algo como
Private Sub Comando0_Click()
On Error GoTo Err_Comando0_Click
DoCmd.SetWarnings False
DoCmd.CopyObject "", "Copia de Tabla1", acTable, "Tabla1"
DoCmd.SetWarnings True
Exit_Comando0_Click:
Exit Sub
Err_Comando0_Click:
MsgBox Err.Description
Resume Exit_Comando0_Click
End Sub
Que está más claro y autodocumentado
Perdón, el código es solo para borrar tablas, pero en fin, insisto en que no es lo mismo copiar tablas que importar datos. Bueno.
Yo te decía:
If CurrentDb.TableDefs("Copia de Tabla1").Name = "Copia de Tabla1" Then
CurrentDb.TableDefs.Delete "Copia de Tabla1"
End If
Tu (caso de tu primera tabla) pareces preguntar por true en vez de por name, es decir:
If CurrentDb.TableDefs("Za IMPORTAR eur MONTFRISA CHAPELA").NAME = True Then
CurrentDb.TableDefs.Delete ("Za IMPORTAR eur MONTFRISA CHAPELA"): End If
Apricando BIEN mi RECETA el caso de tu primera tabla te debería quedar más bien así:
If CurrentDb.TableDefs("Za IMPORTAR eur MONTFRISA CHAPELA").NAME = "Za IMPORTAR eur MONTFRISA CHAPELA" Then
CurrentDb.TableDefs.Delete ("Za IMPORTAR eur MONTFRISA CHAPELA"): End If
Prueba esto ultimo a ver que tal.
No me funciona o no te entiendo
El paso es: tengo 9 tablas que debo de eliminar si existen para poder importar otras con el mismo nombre de otras bases de datos externas, el código que introduzco para eliminar es el siguiente pero no funciona
----------------------------------
Private Sub Comando150_Click()
On Error GoTo Err_Comando150_Click
If CurrentDb.TableDefs("Za IMPORTAR eur MONTFRISA CHAPELA").NAME = True Then
CurrentDb.TableDefs.Delete ("Za IMPORTAR eur MONTFRISA CHAPELA"): End If
If CurrentDb.TableDefs("Za IMPORTAR eur SDF CHAPELA").NAME = ("Za IMPORTAR eur SDF CHAPELA") Then
CurrentDb.TableDefs.Delete ("Za IMPORTAR eur SDF CHAPELA"): End If
If CurrentDb.TableDefs("Za IMPORTAR eur sdf portugal chapela").NAME = ("Za IMPORTAR eur sdf portugal chapela") Then
CurrentDb.TableDefs.Delete ("Za IMPORTAR eur sdf portugal CHAPELA"): End If
If CurrentDb.TableDefs("Zb IMPORTAR eur MONTFRISA porriño").NAME = ("Zb IMPORTAR eur MONTFRISA porriño") Then
CurrentDb.TableDefs.Delete ("Zb IMPORTAR eur MONTFRISA PORRIÑO"): End If
If CurrentDb.TableDefs("Zb IMPORTAR eur sdf porriño").NAME = ("Zb IMPORTAR eur sdf porriño") Then
CurrentDb.TableDefs.Delete ("Zb IMPORTAR eur SDF PORRIÑO"): End If
If CurrentDb.TableDefs("Zb IMPORTAR eur sdf portugal porriño").NAME = ("Zb IMPORTAR eur sdf portugal porriño") Then
CurrentDb.TableDefs.Delete ("Zb IMPORTAR eur SDF PORTUGAL PORRIÑO"): End If
If CurrentDb.TableDefs("Zc IMPORTAR eur montfrisa sofi").NAME = ("Zc IMPORTAR eur montfrisa sofi") Then
CurrentDb.TableDefs.Delete ("Zc IMPORTAR eur MONTFRISA sofi"): End If
If CurrentDb.TableDefs("Zc IMPORTAR eur sdf sofi").NAME = ("Zc IMPORTAR eur sdf sofi") Then
CurrentDb.TableDefs.Delete ("Zc IMPORTAR eur sdf sofi"): End If
If CurrentDb.TableDefs("Zc IMPORTAR eur SDF PORTUGAL SOFI").NAME = ("Zc IMPORTAR eur SDF PORTUGAL SOFI") Then
CurrentDb.TableDefs.Delete ("Zc IMPORTAR eur SDF PORTUGAL SOFI"): End If
Exit_Comando150_Click:
Exit Sub
Err_Comando150_Click:
Resume Exit_Comando150_Click
End Sub
Hombre, es que dijiste "copiar una tabla"
Pero con el código que pones ahora lo que parece que quieres decir es "importar datos externos a una tabla"
Bueno, ya lo mirare más despacio a la tarde ...
Si claro, eso de tener que cerrar se puede evitar haciendo un ".refresh" de la colección tabledefs (eso hará que refleje inmediatamente los posibles ".delete")
Hazlo así (para cada tabla)
If CurrentDb.TableDefs("Za IMPORTAR eur MONTFRISA CHAPELA").NAME = "Za IMPORTAR eur MONTFRISA CHAPELA" Then
CurrentDb.TableDefs.Delete ("Za IMPORTAR eur MONTFRISA CHAPELA")
CurrentDb.TableDefs.Refresh
End If
Lo segundo no lo entiendo ¿te da algún mensaje de error o algo? Necesito saber todos los detalles que me puedas contar, ser experto no es lo mismo que ser adivino
AAAhhh ya caigo (casi lo adivino, es verdad, la experiencia ayuda un poco)
El error será el 3265 y su descripción será más o menos "No se encontró el elemento en esta colección."
Para evitar esto, antes de la primera tabla yo pondría
On Error Resume Next
y despues de la ultima tabla
On Error Goto 0

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas