importar varios archivos txt

4 envíos / 0 nuevos
Último envío
victor_a_p_vale
Imagen de victor_a_p_vale
Offline
última acción: Hace 5 años 11 meses
alta: 17/06/2014 - 02:03
Puntos: 42
importar varios archivos txt

Holas buenas noches: necesito que los archivos txt se copien en cada hoja de un libro maestro de excel, es decir, si genera los  txt lecturainferior, residencial, gral. cada uno de estos archivo quiero que se copie en el libro maestro cuyas hojas tienen el mismo nombre. el delimitador para los txt es el espacio. Desde ya muchas gracias por su tiempo. atento a cualquier duda espero vuestros comentarios.

AdjuntoTamaño
File archivo_maestro.xlsx8.28 KB
Office spreadsheet icon gral.xls677 bytes
Office spreadsheet icon lecturainferior.xls7.76 KB
Office spreadsheet icon residencial.xls2.79 KB

Etiquetas: 

Cron
Imagen de Cron
Offline
última acción: Hace 1 mes 4 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12715
Re: importar varios archivos txt

Lo que necesitas no es rápido. Afortunadamente, lo tengo medio resuelto en varios trabajos previos, por lo que te pondré por aquí algunos ejemplos.

 

Te puedes crear un archivo que se llame "tratamiento datos.xlsm" o algo así. Dentro pon un botón, y asigna al click del botón el siguiente código:

 

Sub AbreArchivo()

   Dim fDialog As Office.FileDialog

 

   Application.ScreenUpdating = False

   Set fDialog = Application.FileDialog(msoFileDialogFilePicker)

   With fDialog

      .AllowMultiSelect = False

      .Title = "Selecciona un archivo .txt a tratar"

      .Filters.Clear

      .InitialFileName = ""

      .Filters.Add "Archivos a tratar", "*.txt"

      .Filters.Add "Todos los archivos", "*.*"

      ' Muestra el diálogo. Si el método .Show devuelve un valor True, el

      ' usuario seleccionó un archivo. Si el método .Show devuelve

      ' False, el usuario pinchó en Cancelar.

      If .Show = True Then

         Button1.tag = .SelectedItems(1)

         AbreArchivo2

      Else

         MsgBox "Has cancelado la apertura."

      End If

   End With

 

End Sub

 
 
Luego, añade las siguientes rutinas
 
 
Sub AbreArchivo2()
   Dim fDialog As Office.FileDialog
   Dim nombrearchivo As String
 
   ' Configura el diálogo. nombrearchivo extrae el nombre del .xls previsto.
   Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
   With fDialog
      .AllowMultiSelect = False
      .Title = "Selecciona un archivo .xls a tratar"
      .Filters.Clear
      .Filters.Add "Otros archivos", "*.xls"
      .Filters.Add "Todos los archivos", "*.*"
 
      ' Muestra el diálogo. Si el método .Show devuelve un valor True, el
      ' usuario seleccionó un archivo. Si el método .Show devuelve
      ' False, el usuario pinchó en Cancelar.
      If .Show = True Then
         cargaarchivo (.SelectedItems(1))
         ActiveWorkbook.SaveAs Filename:=Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 5) & "-tratado.xlsx"
         MsgBox "Se ha terminado la ejecución. Por favor, comprueba los resultados", , "Finalizado"
      Else
         MsgBox "Has cancelado la apertura."
      End If
   End With
End Sub
 
Sub cargaarchivo(archivo As Variant)
Dim archivoprimero As String

archivoprimero = ActiveWorkbook.Name
  
Workbooks.Open Filename:=archivo
Windows(Workbooks(Workbooks.Count).Name).Activate
    Activeworkbook.sheets(1).activate     'O la hoja que haya que activar
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Button1.tag _
        , Destination:=Range("$A$1"))      ' O la celda donde lo quieras empezar a pegar
        .Name = "Libro1"     'O el nombre que prefieras
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = True
        .TextFileColumnDataTypes = Array(1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
 
Windows(archivoprimero).Activate

End Sub
 
 
 
 
Espero que te funcione, porque lo he ido adaptando sobre la marcha para tus criterios.
 
 
Un saludo
 
victor_a_p_vale
Imagen de victor_a_p_vale
Offline
última acción: Hace 5 años 11 meses
alta: 17/06/2014 - 02:03
Puntos: 42
Re: importar varios archivos txt

Cron, muchas gracias por el aporte, te cuento que cuando ejecute la macro me sale un error en tiempo de ejecucion, mas precisamente en la linea button1.tag =.seleteditems(1),he buscado para ver cual es el error sin resultado positivo, en adjunto envío lo indicado con pantalla capturada del mensaje de error. Agradezco tu tiempo.

AdjuntoTamaño
File tratamientos_de_datos.xlsm114.7 KB
Cron
Imagen de Cron
Offline
última acción: Hace 1 mes 4 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12715
Re: importar varios archivos txt

En esa línea lo que hago es utilizar una propiedad que tienen todos los objetos (.tag) que es de tipo variant.

Lo utilizo para enviar información entre diferentes rutinas, evitando así tener que trabajar con una variable global, y evitando también tener que enviar parámetros, etc.

 

La propiedad .tag es siempre de tipo variant, por lo que se puede almacenar cualquier cosa.

 

En mi caso, el botón se llama Button1

Por eso mi línea es

     Button1.tag = ...........

 

Pero tú le cambiaste el nombre al botón, y en tu caso se llama "Abrearchivo" (creo)

Por eso tú deberías escribir:

    Abrearchivo.tag = ..........

 

Con esto debería valer.

 

Nota al margen: es buena práctica cambiar los nombres a los objetos por nombres que sean descriptivos. Se recomienda que la nomenclatura incluya el tipo de objeto que es.

Por ejemplo, el nombre de todos los cuadros de texto podría empezar por txt (txtNombre, txtDirección...), el nombre de todas las etiquetas podría empezar por lbl (lblTítulo...) y el de los botones por btn (btnAbreArchivo...)

De esta manera te aseguras de que no llamas igual a un procedimiento que a un objeto, o que no llamas igual a dos objetos diferentes. Y en código estás seguro de que te refieres al objeto que quieres.

 

Un saludo