Jump to content
  • Debido a la crisis sanitaria, hasta el día 31 de marzo, el registro al foro de Ayuda Excel será totalmente gratuito para facilitar el teletrabajo. Todos los registros que se produzcan entre estas fechas tendrán acceso gratuito ilimitado a la comunidad hasta el 30 de abril.

    Regístrate

    Si te surge alguna duda mientras estás trabajando en casa con Excel, ya tienes a quien preguntar.

    Espero que esta medida te sirva de ayuda. Frenar la expansión del coronavirus depende de todos. Sé responsable.

SALAVERRINO

Macro para convertir a Texto

Recommended Posts

Buenas noches a los miembros de este foro, en esta ocasión recurro a uds, para que me brinde su apoyo en mejorar o crear una macro, el cual permita convertir los datos de la hoja excel a txt, con ancho fijo:

COLUMNA A: 5 ESPACIOS

COLUMNA B: 12 ESPACIOS

COLUMNA C: 1 ESPACIO

COLUMNA D: 20 ESPACIOS

COLUMNA E: 20 ESPACIOS

COLUMNA F: 20 ESPACIOS

COLUMNA G: 20 ESPACIOS

COLUMNA H: 1 ESPACIO

COLUMNA I: 1 ESPACIO

COLUMNA J: 1 ESPACIO

COLUMNA K: 1 ESPACIO

COLUMNA L: 9 ESPACIOS

COLUMNA M: 9 ESPACIOS

COLUMNA N: 9 ESPACIOS

COLUMNA O: 9 ESPACIOS

COLUMNA P: 1 ESPACIOS

COLUMNA Q: 2 ESPACIOS:

Adjunto código de la macro ejecutado a la fecha: genera filas en blanco.

DENTRO DEL MODULO ANCHO_FIJO:

Sub EXPORTAR_TXT_ANCHOFIJO()
Dim i As Double
Archivo_txt = ThisWorkbook.Path & "\" & "AFPNET.txt"
Open Archivo_txt For Output As #1

With Sheets(10)
fin = Application.CountA(Range("A:A"))

For i = 2 To fin

Campo1 = C_Der(.Cells(i, 1), 5)
Campo2 = C_Der(.Cells(i, 2), 12)
Campo3 = C_Der(.Cells(i, 3), 1)
Campo4 = C_Der(.Cells(i, 4), 20)
Campo5 = C_Der(.Cells(i, 5), 20)
Campo6 = C_Der(.Cells(i, 6), 20)
Campo7 = C_Der(.Cells(i, 7), 20)
Campo8 = C_Der(.Cells(i, 8), 1)
Campo9 = C_Der(.Cells(i, 9), 1)
Campo10 = C_Der(.Cells(i, 10), 1)
Campo11 = C_Der(.Cells(i, 11), 1)
Campo12 = C_Der(.Cells(i, 12), 9)
Campo13 = C_Der(.Cells(i, 13), 9)
Campo14 = C_Der(.Cells(i, 13), 9)
Campo15 = C_Der(.Cells(i, 15), 9)
Campo16 = C_Der(.Cells(i, 16), 1)
Campo17 = C_Izq(.Cells(i, 17), 2)

Print #1, Campo1 & Campo2 & Campo3 & Campo4 & Campo5 & Campo6 & Campo7 & Campo8 & Campo9 & Campo10 & Campo11 & Campo12 & Campo13 & Campo14 & Campo15 & Campo16 & Campo17

Next i

Close
End With
End Sub

Anexo archivo excel y archivo afpnet.txt (resultado)

DENTRO DEL MODULO FUNCIONES:
Function C_Izq(ByVal sCadena As String, ByVal nLargo As Integer, Optional sCaracter As Variant) As String

    'Creamos cadena para rellenar por la izquierda con el caracter indicado

    Dim sValor As String

    If IsMissing(sCaracter) Then sCaracter = " "

    sCadena = Trim(sCadena)
    If Len(sCadena) > nLargo Then sCadena = Right(sCadena, nLargo)
    sValor = String(nLargo - Len(sCadena), sCaracter) & sCadena
    C_Izq = sValor

End Function
Function C_Der(ByVal sCadena As String, ByVal nLargo As Integer, Optional sCaracter As Variant) As String

    'Creamos cadena para rellenar por la derecha con el caracter indicado

    Dim sValor As String

    If IsMissing(sCaracter) Then sCaracter = Space(1)
    
    sCadena = Trim(sCadena)
    If Len(sCadena) > nLargo Then sCadena = Left(sCadena, nLargo)
    sValor = sCadena & String(nLargo - Len(sCadena), sCaracter)
    C_Der = sValor

End Function

Desde ya agradezco su gentil apoyo y colaboración.

Saludos.

PLANTILLA-ELECTRONICA-x-ESPECIALIDAD-v3.xlsm

AFPNET.txt

Share this post


Link to post
Share on other sites

Hola

Para no usar UDFs yo usaría "Tab" (Enlace) pero, en realidad esa  macro sí hace lo que deseas, solo que tienes una pequeña confusión, el índice de la hoja es 2, no 10. No confundas el índice  con el nombre del módulo de la hoja. Cambia la línea respectiva por esto:

With Sheets(2)

o si quieres usar el nombre del módulo de la hoja, y como para que notes la diferencia y entiendas tu confusión, puedes usar también esto:

With Hoja10

O incluso esto:

With Worksheets("AFPNET")

Y hasta esto:

With Sheets("AFPNET")

Aquí algo que escribí al respecto:

https://abrahamexcel.blogspot.pe/2018/02/las-colecciones-worksheets-y-sheets.html

Saludos

Abraham Valencia

Share this post


Link to post
Share on other sites
Hace 10 horas, avalencia dijo:

Hola

Para no usar UDFs yo usaría "Tab" (Enlace) pero, en realidad esa  macro sí hace lo que deseas, solo que tienes una pequeña confusión, el índice de la hoja es 2, no 10. No confundas el índice  con el nombre del módulo de la hoja. Cambia la línea respectiva por esto:

With Sheets(2)

o si quieres usar el nombre del módulo de la hoja, y como para que notes la diferencia y entiendas tu confusión, puedes usar también esto:

With Hoja10

O incluso esto:

With Worksheets("AFPNET")

Y hasta esto:

With Sheets("AFPNET")

Aquí algo que escribí al respecto:

https://abrahamexcel.blogspot.pe/2018/02/las-colecciones-worksheets-y-sheets.html

Saludos

Abraham Valencia

Buenos días amigo @avalencia, de acuerdo a la observación sobre la ubicación de la hoja, realice el cambio respectivo con la sentencia With Sheets("AFPNET").

Pero al momento de ejecutar la macro, me emite 2 errores, para lo cual adjunto archivos con los nombres;

* EJECUCION ERRONEA.RAR (en esta imagen, se aprecia que cuando ejecuto la macro desde esta hoja PLANILLA, genera el archivo texto AFPNET con ciertas lineas o espacios de mas, es decir mas de 20, sombreado)

* EJECUCION OK.RAR (en esta imagen, es que cuando me ubico en la misma hoja AFPNET y ejecuto la macro seleccionando la rutina EXPORTAR_TXT_ANCHOFIJO  genera el archivo texto AFPNET como valida, es decir que debe quedar en la ultima fila 20)

Desde ya agradezco nuevamente su apoyo y colaboración.

Saludos.

Share this post


Link to post
Share on other sites

Pues mira esta línea:

fin = Application.CountA(Range("A:A"))

Le estás dando a la variable "fin" un valor que depende de un rango de la hoja activa, es decir, la hoja en donde está tu botón y por eso las filas en blanco. Cámbiala por esto:

fin = Application.CountA(.Range("A:A"))

¿Notas la diferencia? Cuando un rango lo colocamos sin el objeto del que es parte, VBA lo tomo como que es parte de la hoja activa, al colocar ese puntito, le estamos diciendo que es parte de la hoja (objeto) del "With".

Saludos

Abraham Valencia

Share this post


Link to post
Share on other sites

Hola @avalencia, agradezco el análisis y observación a la macro y detectar el error, del porque no generaba el código desde una determina hoja y como dices se nota la diferencia al momento de ejecutar la macro.

Agradezco tu apoyo y colaboración, ya que esta macro podra servir quizas a muchas personas que esten con el mismo problema al crear un archivo texto con ancho fijo.

Saludos y daría como como TEMA SOLUCIONADO a mi problema.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png