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
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.
- Compartir respuesta