Hola! Tengo una base de datos en access con muchas tablas que no me interesan y otras que sí. Lo que necesito hacer es desde excel (ojalá a través de una macro) solo copiar las tablas que me interesan para luego poder manipular esos datos (no necesito que los cambios se actualicen en la base de datos). Espero que se haya entendido Y mil gracias de antemano
1 Respuesta
Respuesta de santiagomf
1
1
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
En un módulo nuevo (entra en Visual Basic con <Alt><F11> y elige la opción módulo del menú insertar), copia el siguiente código: Option Explicit Const maxTablas = 500 ' Máximo número de tablas que podemos importar Sub importarTablasIndicadas() ' En la celda A1 indicaremos el nombre de la base de datos y a partir de A2 ' hacía abajo pondremos los nombres de las tablas a importar ' Todo ello en una página que se llamará datosImportar ' ' OJO: No olvidar marcar en 'Herramientas - Referencias' la librería: ' Microsoft DAO 3.6 Object Library ' Dim nomDb As String Dim db As Database Dim i As Integer Dim j As Integer ReDim matTbl(1 To maxTablas) As String Dim nTbl As Integer Dim miWb As Workbook ' Creamos una referencia al libro actual para evitar que nos cambien de libro Set miWb = ThisWorkbook ' Comprobamos que exista el nombre de la base de datos en la página datosImportar On Error Resume Next nomDb = miWb.Sheets("datosImportar").Cells(1, 1) If Err <> 0 Then MsgBox "Error al acceder a la página 'datosImportar'. El mensaje " & _ "devuelto por el sistema es:" & vbCrLf & Error$ & _ vbCrLf & vbCrLf & "Proceso terminado." On Error GoTo 0 Exit Sub End If On Error GoTo 0 ' Leemos los nombres de tablas que vendrán a partir de la celda A2 nTbl = 0 For i = 2 To miWb.Sheets("datosImportar").Cells.SpecialCells(xlCellTypeLastCell).Row If Trim$(miWb.Sheets("datosImportar").Cells(i, 1)) <> "" Then nTbl = nTbl + 1 matTbl(nTbl) = Trim$(miWb.Sheets("datosImportar").Cells(i, 1)) End If Next i ' Abrimos la base de datos On Error Resume Next Set db = OpenDatabase(nomDb, False, True) If Err <> 0 Then MsgBox "Error al abrir la base de datos '" & nomDb & "'. El mensaje " & _ "devuelto por el sistema es:" & vbCrLf & Error$ & _ vbCrLf & vbCrLf & "Proceso terminado." On Error GoTo 0 Exit Sub End If On Error GoTo 0 ' Borramos todas las páginas de la hoja de cálculo excepto la de 'datosImportar' For i = miWb.Sheets.Count To 1 Step -1 If UCase$(ThisWorkbook.Sheets(i).Name) <> "DATOSIMPORTAR" Then Application.DisplayAlerts = False miWb.Sheets(i).Delete Application.DisplayAlerts = True End If Next i ' Importamos todas las tablas marcadas For i = 1 To nTbl ' Comprobamos que el nombre de la tabla no esté repetido For j = 1 To i - 1 If UCase$(matTbl(i)) = UCase$(matTbl(j)) Then Exit For Next j ' Si no está repetido, importamos sus datos If i = j Then importarDatosTabla miWb, db, matTbl(i) Else MsgBox "La tabla '" & matTbl(i) & "' está para importar 2 o más veces. Sólo se importa una vez." End If Next i ' Cerramos la base de datos db.Close Set miWb = Nothing ' Final del proceso MsgBox "Proceso terminado correctamente" End Sub Sub importarDatosTabla(ByRef miWb As Workbook, ByRef db As Database, ByVal nomTbl As String) Dim i As Integer Dim miHoja As Worksheet Dim rs As Recordset Dim nLin As Integer ' Primero creamos la página que va a contener los datos miWb. Sheets. Add miWb. Sheets(miWb. Sheets. Count) miWb.ActiveSheet.Name = nomTbl Set miHoja = miWb.Sheets(nomTbl) ' Abrimos la tabla Set rs = db.OpenRecordset(nomTbl) ' Copiamos en la primera fila los nombres de los campos y damos formatos For i = 0 To rs.Fields.Count - 1 miHoja.Cells(1, i + 1) = rs.Fields(i).Name Select Case rs.Fields(i).Type Case dbDate: miHoja.Columns(i + 1).HorizontalAlignment = xlCenter miHoja.Columns(i + 1).NumberFormat = "dd-mm-yyyy" Case dbLong, dbInteger: miHoja.Columns(i + 1).HorizontalAlignment = xlRight miHoja.Columns(i + 1).NumberFormat = "#,##0" Case dbSingle, dbDouble, dbDecimal: miHoja.Columns(i + 1).HorizontalAlignment = xlRight miHoja.Columns(i + 1).NumberFormat = "#,##0.00" Case Else: miHoja.Columns(i + 1).HorizontalAlignment = xlLeft End Select Next i ' Copiamos los datos de los registros nLin = 1 If Not rs.EOF Then rs.MoveFirst Do While Not rs.EOF nLin = nLin + 1 For i = 0 To rs.Fields.Count - 1 If Not IsNull(rs.Fields(i)) Then miHoja.Cells(nLin, i + 1) = rs.Fields(i) Next i rs.MoveNext Loop ' Importación terminada. rs.Close Set miHoja = Nothing End Sub Crea una página que se llame 'datosImportar' y pon en la celda A1 el nombre completo de la base de datos y en las celdas A2, A3, A4, etc... los nombres de las tablas. Con esta macro se creará una página por cada tabla importada. No olvides incluir la referencia a la librería 'Microsoft DAO 3.6 Object Library' que te indico al principio del código.
Muchísimas gracias! Se nota que te tomaste el tiempo para responderme ^_^. La información me ha sido de gran utilidad. Mil gracias!