martes, 4 de mayo de 2010

Macro para Guardar como texto

Hace algunos días subí el código de una macro con la cual, podíamos Navegar con un Explorador de Windows desde nuestro Excel.
Aprovecharé la petición de un usuario para presentar una utilidad de éste, así como complementarlo, ejecutando una opción especial de Guardar como texto deilimitado por tabulaciones.
Lo que pedía era:

...Tengo una tabla de datos en excel compuesta por 15.000 lineas de registro, cada una de las cuales tiene 7 columnas de datos... Esta tabla de datos debe servir para la creación de listas de distribución en Outlook...
La macro que necesito ha de hacer lo siguiente:
1.- Filtar la columna 7 cada vez eligiendo un valor diferente
2.- Copiar el contenido de los resultados del filtrado a otra hoja de este libro
3.- Guardar esa nueva hoja como documento de texto separado por tabuladores (para poderlo importar luego a Outlook), tomando como nombre de archivo el valor correspondiente de la colunma 7 que ha servido para el filtrado.


Para los dos primeros puntos ya teníamos una solución programada, que podemos ver en macro de un filtro avanzado
Recordando el código de ésta:

'ejecutamos un filtro avanzado, copiando el resultado en la Hoja2
Sub Filtro avanzado()
Range("Datos").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"Criterios"), CopyToRange:=Sheets("Hoja2").Range("A1"), Unique:=False
Sheets("Hoja2").Select
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Delete
End Sub



También podemos añadir una segunda macro que permita el borrado del Filtro obtenido:

'borra de la Hoja2 los registros filtrados
Sub Borrar()
Sheets("Hoja2").Select
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlToLeft
End Sub


Veamos nuestra Hoja de cálculo con una pequeña base de datos que replica el ejercicio propuesto:


Vemos cómo en la celda I2 se incluye el valor por el que queremos filtrar nuestra base de datos y además de donde cogeremos el nombre para el archivo .txt que generaremos.
Para ejecutar fácilmente estas macros las he asignado a distintos controles, tipo botón.


El código en cuestión, para guardar el listado obtenido en un fichero texto es:

'para guardar como texto
Sub SaveAsNombreCelda()
Dim fulla, llibre, savefile As String
fulla = InputBox("Nombre de la hoja del libro a copiar", "Hoja:", "Hoja2")
'I2 lo cambiariamos por la celda donde hemos incluido el criterio de filtro
llibre = Sheets("filtro_avanz2").Range("I2").Value
'filtro_avanz2 es el nombre de la Hoja donde se encuentra nuestra base de datos
Sheets(fulla).Select
Sheets(fulla).Copy

Dim Titulo, Directorio As String
Titulo = "Selecciona una carpeta donde guardar el fichero texto"
On Error Resume Next
'evitaría un error en caso de no seleccionar nada o pulsar ESC
With CreateObject("shell.application")
Directorio = .browseforfolder(0, Titulo, 0).Items.Item.Path
End With: On Error GoTo 0
If Directorio = "" Then
MsgBox "No se ha seleccionado ningún directorio.", , "Operacion cancelada!"
Else
savefile = Directorio & "\" & llibre & ".txt"
ActiveWorkbook.SaveAs Filename:= _
savefile, FileFormat:=xlText _
, CreateBackup:=False
'la instrucción Fileformat:=xlText es la que permite
guardar el fichero como Texto delimitado por tabulaciones

End If
End Sub

6 comentarios:

  1. I could understand . please publish it more easily .

    thanks

    webmaster forum

    ResponderEliminar
  2. Estaria vien un video de los pasos a pasos

    ResponderEliminar
  3. Buenas Estoy tratando de hacer una especie de registro en base a un formulario principal. es decir
    tengo en la hoja1 un formulario que deber ser llenado cada vez que sea necesario y el mismo me genera un numero de formulario con una macro que le puse
    lo que necesito es que en la hoja dos me vayan quedando los datos como por eje el nombre,apellido y num de orden generada y servicio generado. sin que se modifiquen cada vez que genere el formulario de la hoja1

    Henger Gomez
    gracias de antemano

    ResponderEliminar
  4. Hola Henger,
    te agradecería me mandaras el fichero con el ejemplo a
    excelforo@gmail.com
    y con los códigos generados intentaré darte una solución.
    Saludo

    ResponderEliminar
  5. Buen día Ismael, podría por favor indicarme si existe alguna forma en que pueda abrir desde excel (vba) un archivo guardado en mi pc con ext. ".msg"

    Ej: tengo un correo que estoy redactando pero lo guardo como borrador en mi pc, requiero luego de un tiempo abrirlo y enviarlo, pero quisiera programar esta tarea desde excel por medio de una macro.

    De antemano mil gracias por su tiempo, y felicitaciones por su blog.

    ResponderEliminar
    Respuestas
    1. Gracias Héctor,
      puedes abrir cualquier tipo de fichero con ShellExecute, echa un vistazo aquí:
      http://excelforo.blogspot.com.es/2014/01/vba-shellexecute-o-como-abrir-desde.html

      Que luego puedas recuperar datos de ese fichero es otra cuestión...

      Espero te oriente
      Un saludo

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.