VBA Excel leer archivo sin abrirlo
Kree
-
Kree -
Kree -
Hola,
Estoy buscando ayuda para leer los datos de un archivo sin abrirlo e importarlos a Excel. Mi archivo de Excel (lo llamaremos XL) contiene indirectamente el nombre del archivo donde se encuentran mis datos (lo llamaremos DN) a través de distintas columnas (digamos que DN = Range("A1") & "_a_" & Range("A2"), con una ruta siempre idéntica tipo v:\..\DN).
El problema es que DN no es un .xls. Al pedir la apertura por parte de Excel, obtengo los datos que deseo trabajar siempre en la misma columna. Por tanto, quisiera saber si es posible realizar una macro que me permita leer DN como un documento de Excel pero sin abrirlo.
NB: DN es un .dbf
Esto me permitiría incluir una fórmula del tipo ="sumprod(subsitute('v:\..\[DN]feuil1'!$B2:$B1065,".", "", "", ")*1)" y obtener instantáneamente la suma en XL sin tener que abrir/cerrar DN en un nuevo doc de Excel.
Novato en VBA, pido vuestra ayuda, al menos para saber si es posible. También me preguntaba si sería posible recuperar directamente la ubicación de los datos en dbf y transponer los "." por "," para obtener números utilizables en Excel (he intentado cambiar mi separador decimal en Excel, pero eso no resuelve el problema), si fuera posible obteniendo directamente la suma de estos datos de tipo "123.456".
Espero haber sido lo suficientemente claro y obtener al menos algunas pistas. Perdón por haceros trabajar en este 1 de mayo...
Gracias
Estoy buscando ayuda para leer los datos de un archivo sin abrirlo e importarlos a Excel. Mi archivo de Excel (lo llamaremos XL) contiene indirectamente el nombre del archivo donde se encuentran mis datos (lo llamaremos DN) a través de distintas columnas (digamos que DN = Range("A1") & "_a_" & Range("A2"), con una ruta siempre idéntica tipo v:\..\DN).
El problema es que DN no es un .xls. Al pedir la apertura por parte de Excel, obtengo los datos que deseo trabajar siempre en la misma columna. Por tanto, quisiera saber si es posible realizar una macro que me permita leer DN como un documento de Excel pero sin abrirlo.
NB: DN es un .dbf
Esto me permitiría incluir una fórmula del tipo ="sumprod(subsitute('v:\..\[DN]feuil1'!$B2:$B1065,".", "", "", ")*1)" y obtener instantáneamente la suma en XL sin tener que abrir/cerrar DN en un nuevo doc de Excel.
Novato en VBA, pido vuestra ayuda, al menos para saber si es posible. También me preguntaba si sería posible recuperar directamente la ubicación de los datos en dbf y transponer los "." por "," para obtener números utilizables en Excel (he intentado cambiar mi separador decimal en Excel, pero eso no resuelve el problema), si fuera posible obteniendo directamente la suma de estos datos de tipo "123.456".
Espero haber sido lo suficientemente claro y obtener al menos algunas pistas. Perdón por haceros trabajar en este 1 de mayo...
Gracias
5 respuestas
-
Hola,
un ejemplo que inserta en tu cuaderno los datos de un campo de una base DBF usando la tecnología ADO
en negrita elementos a personalizar
Sub importar_champDBF()
'necesita activar la referencia Microsoft ActiveX Data Objects x.x Library (en VBE herramientas-referencia)
Dim source As ADODB.Connection
Dim Requete As ADODB.Recordset
Dim Chemin As String, fichier As String, texte_SQL As String
Chemin = "F:\ubicación de la base"
'Chemin = ThisWorkbook.Path si tu base está en el mismo directorio
fichier = "base.dbf"
Set source = New ADODB.Connection
source.Open _
"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
Chemin & ";"
texte_SQL = "SELECT tu_campo FROM " & fichier & ";" 'si importas todo pon * en vez de tu_campo
Set Requete = New Recordset
Requete.Open texte_SQL, source, adOpenKeyset, adLockOptimistic
If Requete.EOF Then
MsgBox "Tabla vacía..."
Exit Sub
End If
Application.ScreenUpdating = False
Range("B2").CopyFromRecordset Requete
Requete.Close
source.Close
End Sub
d'après MichelXLD sur www.excel-downloads.com
Michel -
Hola Michel,
Waooh, no entiendo todo el código y no tengo los medios para probarlo hoy, pero parece lo bastante complejo como para que funcione...
Y yo que buscaba un código simple, podría haberme quedado ahí durante lunas antes de tener un borrador de la solución.
Si entiendo bien, importo toda mi base o más bien todo el rango que deseo pero no puedo hacerle una operación.
Y si entiendo aún bien, Source también se abre pero ahí no estoy seguro de entenderlo bien, porque sería más fácil abrirlo como un archivo de Excel, ¿no?
En cualquier caso, muchas gracias por la ayuda, voy a probar el código lo antes posible para ver realmente qué tal funciona y tratar de entender un poco mejor el funcionamiento de la cosa. -
re,
bueno.. si la fuente es un dbf, no es un xls
te conectas a Source pero no lo abres porque es un archivo secuencial indexado; SQL te permite tener datos-fuente muy rápido (ver ejemplo archivo secu o tu banco)
puedes hacer cálculos (¿operaciones?) con la sintaxis SQL
por ejemplo
SELECT [nbre]*[px_unit] AS total FROM....
crea un campo "total" multiplicando los valores de los campos número y precio unitario...
si quieres filtrar por una variable añades WHERE nom="toto"
Te reconozco que no es necesariamente evidente y que cada vez, me da muchos dolores de cabeza con corales occitanos. -
¡Vaya, esto ya empieza a escapar a mi comprensión! A la base solo quería facilitarme un poco la vida, pero como ya se lanzó el problema, creo que resolverlo lo va a complicar...
OK (o más o menos) para los cálculos en SQL y de acuerdo (te creo de palabra) para la rapidez de SQL.
Abría mi dbf de la siguiente manera:
Dim AppXL As Excel.application
Dim ClassR As Excel.workbook
Dim Feuye As Excel.worksheet
Set AppXL = createObject("Excel.application")
Dim a As string
a= Range ("A1") & "_a_" & Range("A2") 'Nombre de mi archivo
Dim b As string
b = "v:\..\" & a
Workbook.opentext filename: = b
Y mi dbf aparecía en forma de libro de Excel en el que podía jugar tranquilamente con mis celdas antes de cerrarlo.
El problema residía principalmente en el tiempo que llevaba abrir y cerrar un documento de Excel para cada referencia de archivo dbf.
En conclusión, si quiero ganar velocidad, debo aprender SQL además de VBA...-
hola,
Sí, pero si dices empezar en VBA, utiliza lo que sabes y lo que comprendes al descubrir nuevas técnicas; ya sabes que es posible leer o escribir en un archivo cerrado, llegarás a 1 de 4 a abordar estas nociones... Usamos ADO-SQL para archivos voluminosos o para consolidar N datos de P archivos en un resumen.
Para mí, no me vino de inmediato y aún ahora dudo y me equivoco a menudo (9/10)
Atentamente
Michel
-
-
Lo que sé es que todavía tengo mucho por entender y que la forma más segura de avanzar es ir paso a paso.
Lo que creo entender: cuando pido abrir mi archivo con la orden workbook.opentext filename:=b estoy creando dicho libro al abrirlo; esto implica por un lado que creo el libro b (o más bien "a" en mi ejemplo) y por otro lado que lo abro, todo en una sola orden.
Lo que no entiendo es por qué no puedo simplemente crearlo y referirme a él (probablemente debe haber una técnica por descubrir). Porque, una vez creado, debería poder acceder a su contenido y hacer mis cálculos sin tener que abrirlo (lo que sí sé hacer con un .xls clásico siempre y cuando se conozca la ruta). Eso, es lo que empiezo a entender como ilusorio.
- ¿Dónde falla mi razonamiento? - Probablemente en mis premisas de VBA y el potencial de ADO-SQL (por el momento muy oscuro) para lo que busco hacer.
En cualquier caso, muchas gracias por la pista SQL que voy a probar y por lo demás.