Extraer datos de DBF a Excel

Estoy buscando la forma de conectarme a una base de datos dbf desde una macro en Excel y que se ejecute un query y traiga ciertos datos, que dependerán de una fecha solicitada.

1 Respuesta

Respuesta
1

Con gusto te ayudo con la macro, pero faltan varios datos para completarla.

Te anexo una macro, para que pruebes:

Sub ExtraerDatos()
'Por.Dante Amor
    Set l1 = ThisWorkbook
    Set h1 = l1.Sheets("Hoja3")
    ruta = l1.Path & "\"
    Set l2 = Workbooks.Open(Filename:=ruta & "BASE.DBF")
    Set h2 = l2.ActiveSheet
    '
    col = "B"
    fec1 = h1.[A1]
    dia1 = Day(fec1)
    mes1 = Month(fec1)
    año1 = Year(fec1)
    j = 2
    '
    For i = 1 To Range(col & Rows.Count).End(xlUp).Row
        fec2 = Split(h2.Cells(i, col), "/")
        If UBound(fec2) = 2 Then
            dia2 = Val(fec2(0))
            mes2 = Val(fec2(1))
            año2 = Val(fec2(2))
            If dia1 = dia2 And mes1 = mes2 And año1 = año2 Then
                h1.Cells(j, "A") = h2.Cells(i, "A")
                h1.Cells(j, "B") = h2.Cells(i, "B")
                h1.Cells(j, "C") = h2.Cells(i, "C")
                j = j + 1
            End If
        End If
    Next
    l2.Close False
End Sub

Los datos que hacen falta para afinar la macro son:

1. El nombre de la hoja en donde quieres poner el resultado del "query" y a partir de cuál fila.

2. En dónde vas a poner la fecha para que se realice el "query"

3. El nombre del archivo dbf. El archivo dbf deberá estar en la misma carpeta de tu archivo de excel con la macro.

4. La columna en donde tienes la fecha en el dbf

5. Cómo está la fecha: ¿dd/mm/aaaa, es formato de fecha? ¿O es formato de texto?, para que sepas qué formato tienes: abre el dbf desde excel y dime si es fecha o es un texto. Pon un ejemplo de cómo te aparece la fecha.

6. Qué datos quieres traer y en dónde los quieres poner.


La macro ya realiza todo lo anterior, abre un dbf llamado "base.dbf", lee la fecha de la Hoja3, celda "A1", compara la fecha con todos los registros de la base.dbf, la fecha de la base. Dfb está en el campo 2 y tiene un formato "dd/mm/aaaa", y la fecha es un texto, entonces la macro obtiene la fecha de la base.dbf y la compara. Todas las fechas que sean iguales, la macro, toma el dato del campo 1 y lo pone en la "hoja3" columna A, toma el campo 2 y lo pone en la columna "B" y toma el campo 3 y lo pone en "C".

Si tienes problemas para adaptar la macro a tus datos, entonces espero tus comentarios a todos los datos que hacen falta para afinar la macro en el orden en que te los puse.

S a l u d o s . D a n t e   A m o r. Recuerda valorar la respuesta.

Dante, primero que nada gracias por responder, te comento la tabla creo que es de vfox, no abre directo de excel, de la tabla que se llama BD05.dbf el query que pensaba ejecutar es SELECT * FROM DB05 WHERE CVEBU114 = "ING" AND FHAMOV14 ="19/05/2015" Y TRAER LOS DATOS.

GRACIAS

No estoy seguro de cómo leer el archivo con el query, tal vez desde vfox te puedan pasar el archivo a txt y ya con el layout del archivo poder leerlo.

No se, si generando un odbc dentro de la macro, pero no encuentro como hacer la conexión a la tabla.

Cargué un DBF y me resultó lo siguiente:

Sub Macro2()
'
    ruta = "C:\Documents and Settings\DAMOR\Mis documentos\docs\Soporte expertos\"
    arch = "BASE.DBF"
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
        "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=" & ruta _
        , _
        ";Mode=Share Deny Write;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Dat" _
        , _
        "abase Password="""";Jet OLEDB:Engine Type=18;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Globa" _
        , _
        "l Bulk Transactions=1;Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False" _
        , _
        ";Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Suppo" _
        , "rt Complex Data=False"), Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdTable
        .CommandText = Array("BASE")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .SourceDataFile = ruta & arch
        .ListObject.DisplayName = "Tabla_BASE"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Cambia en la macro estos datos y ejecuta la macro en una hoja nueva.

ruta = "C:\Documents and Settings\DAMOR\Mis documentos\docs\Soporte expertos\"
arch = "BASE.DBF"

Si ya puedes cargar tu dbf a una hoja de excel, entonces podemos leer los datos de la hoja de excel y realizar los filtros, ya después podemos borrar la hoja de excel. Pero lo primero, es revisar si realmente podemos leer el archivo desde excel.

Prueba y me comentas, si te genera una tabla en excel, entonces dime cómo quieres realizar los filtros.

S a l u d o s

Modifico ruta y nombre de archivo y me aparece la siguiente pantalla al darle aceptar me deja en A1 la opcion para una lista de valores pero no trae ningun dato

Dante, sigo haciendo pruebas, estoy usando este código, la pregunta es, cuando lo ejecuto me aparece la ventana para configurar el ODBC de (adjunto la pantalla), lo configuro y me pega los datos, como le hago para que no me lo pida cada vez que ejecuto la macro

With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=Visual FoxPro Tables;UID=;;SourceDB=;SourceType=C:\TEST;DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine" _
), Array(";Null=Yes;Deleted=Yes;")), Destination:=Range("A1"))
.CommandText = Array("SELECT * FROM db05po14 db05po14 WHERE (db05po14.cvebu114 = 'ING')")
.Name = "Query from Visual FoxPro Tables"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With

Disculpa, pero no sé cómo se configura esa parte.

Prueba poniendo la siguiente línea al inicio de la macro

Application.displayalerts = false


Otra que se me ocurre, es que en cada una de estas banderas:

.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
. Refresh BackgroundQuery:=False

Si dice True escribe False, si dice False escribe True; prueba cambiando uno a la vez, cambia y pruebas, si no funciona, regresa a como estaba y cambia el siguiente parámetro.

Dante ya logre evitar la configuración del odbc cambie la ruta del dbf de SourceType a SourceDB y ya jalo.

¿Ahora tengo otra duda como va el formato de fecha en el where? estoy usando where db05po14.fhamov14 = '19-05-2015' pero me manda error

Ya probaste con las diagonales:

'19/05/2015'

Tal vez tengas que poner primero el mes y luego el día:

'15/19/2015'

Si no te funciona lo de la fecha, entonces te sugiero que cargues todo y después ya en las celdas realices, con la misma macro, el filtrado por fecha.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas