VBA Excel leer archivo sin abrirlo

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

5 respuestas

  1. michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
     
    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
    0
  2. Kree
     
    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.
    0
  3. michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
     
    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.
    0
  4. Kree
     
    ¡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...
    0
    1. michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
       
      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
      0
  5. Kree
     
    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.
    0