Datos de Access a Excel

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
1
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!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas