Cómo copiar la estructura de una tabla solo sin los datos
Aquí hay una pregunta interesante que me hicieron hoy:
¿Quiero copiar solo la estructura, tabla vacía sin datos?
Inmediatamente pensamos en el método CopyObject, pero lamentablemente Microsoft nunca incluyó la opción de incluir/omitir los datos. Por lo que siempre incluye los datos. Sí, puede usarlo de todos modos y luego borrar la tabla de datos. Sería una opción, pero hay mejores enfoques, así que exploremos brevemente algunos de ellos.
Método incorporado
Probablemente la solución más sencilla sería utilizar el método TransferDatabase para importar la tabla a la propia base de datos.
Entonces el código quedaría así:
Docmd.TransferDatabase acImport, "Microsoft Access", CurrentDb.Name, acTable, "ExistingTableName", "NewTableName", True
Procedimiento VBA personalizado
Si queremos, también podríamos crear fácilmente un código simple para realizar una operación similar, diablos, el SQL podría ejecutarse como una consulta simple si lo desea, ni siquiera es necesario VBA, ¡pero resume todo muy bien en una rutina reutilizable!
Entonces podríamos crear algo como:
'---------------------------------------------------------------------------------------
' Procedure : DuplicateTableStructure
' Author : Daniel Pineault, CARDA Consultants Inc.
' Website :
' Purpose : Duplicate a table's structure only, no data
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
' (CC BY-SA 4.0) -
' Req'd Refs: None required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sSrcTableName : Existing table name to be duplicated
' sDestTableName : Name to give the new table
'
' Usage:
' ~~~~~~
' Call DuplicateTableStructure("ExistingTableName", "NewTableName")
'
' Revision History:
' Rev Date(yyyy-mm-dd) Description
' **************************************************************************************
' 1 2007-03-03 Initial Release
' 2 2024-10-09 Updated Header
' Updated Error Handler
'---------------------------------------------------------------------------------------
Function DuplicateTableStructure(sSrcTableName As String, _
sDestTableName As String)
On Error GoTo Error_Handler
Dim oDb As DAO.Database
Dim sSQL As String
Set oDb = CurrentDb
sSQL = "SELECT (" & sSrcTableName & ").* INTO (" & sDestTableName & ")"
sSQL = sSQL & " FROM (" & sSrcTableName & ") WHERE 1=0;"
oDb.Execute sSQL, dbFailOnError
oDb.TableDefs.Refresh
Application.RefreshDatabaseWindow 'Update the Nav Pane
Error_Handler_Exit:
On Error Resume Next
Set oDb = Nothing
Exit Function
Error_Handler:
MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
"Error Source: DuplicateTableStructure" & vbCrLf & _
"Error Number: " & Err.Number & vbCrLf & _
"Error Description: " & Err.Description & _
Switch(Erl = 0, "", Erl 0, vbCrLf & "Line No: " & Erl) _
, vbOKOnly + vbCritical, "An Error has Occurred!"
Resume Error_Handler_Exit
End Function
y luego simplemente lo llamas estar haciendo:
Call DuplicateTableStructure("ExistingTableName", "NewTableName")
Como se mencionó anteriormente, simplemente podríamos crear una consulta de Access con una declaración SQL como:
SELECT (sSrcTableName).* INTO (sDestTableName) FROM (sSrcTableName) WHERE 1=0;
Obviamente, reemplazando los términos sSrcTableName, sDestTableName con los nombres de sus tablas.
Tabla vinculada que dices
Por supuesto que podemos duplicar una tabla vinculada. Para hacerlo, podemos recurrir una vez más al SQL simple.
Para un back-end no cifrado
SELECT * INTO (sDestTableName) FROM (MS Access;DATABASE=C:\...\...\YourDatabase.accdb).(sSrcTableName) WHERE 1=0;
Para un back-end cifrado
SELECT * INTO (sDestTableName) FROM (MS Access;PWD=YourBEPassword;DATABASE=C:\...\...\YourDatabase.accdb).(sSrcTableName) WHERE 1=0;
Tenga en cuenta que esto creará la tabla en la base de datos que ejecuta el comando.
Estos comandos también se pueden convertir fácilmente en procedimientos VBA reutilizables para que tenga más herramientas en su arsenal. Guiño, guiño.
Ahí lo tiene, algunos enfoques diferentes que puede emplear para duplicar únicamente la estructura de una tabla.