Generar TXT con nombre especifico, separar campos por comas y multiplicar filas

Hace un tiempo Dante Amor me ayudo con la generación de una Macro. Hoy necesito mejorarla para resolver mi actual casuística y no he logrado adaptarla. Con este código puedo hacer y funciona:

  • Exporta una sola hoja Excel a .txt separando los campos por comas.
  • Solo se entran dos longitudes de valores, de 6 o 23 caracteres. Al generar el TXT, muestra estos 6 o 23 a pesar de no introducir el último valor.
  • El nombre del archivo generado es el introducido en el TextBox1.

Ahora viene la nueva casuística:

  • Columna W me guastaría que fuera un multiplicador. Que no tenga que repetir una fila 5 veces, añadiendo este valor, se repita esa fila 5 veces al generar el TXT.
  • Los campos no los introduzco manualmente, utilizo una formula y los lee de otra hoja. La fórmula que utilizo es =SI.ERROR(BUSCARV(V4;A!$B$3:$N$604;11;FALSO);"") para evitar que aparezca el error de que no he introducido ningún campo. Ahora al generar el TXT, se me generan todas las líneas porque detecta el “”. ¿Hay alguna manera de que si no lee un valor diferente a “” en la primera columna que no genere esa fila en el Excel?
  • Un dato curioso, por si se puede resolver. Al utilizar esta fórmula, si oculto una columna no me aparece luego el valor al generar el TXT. Lo he puesto de color gris y no se aprecia (lo exagero en la imagen adjunta), pero lo expongo por si tiene fácil solución, sinó da igual.

¡Se agradece mucho la ayuda!

Añado imagen del resultado final deseado:

1 respuesta

Respuesta
1

Prueba esto:

Sub GuardarTxt()
'Por.Dante Amor
  Dim FileNum As Long
  Dim ruta As String, arch As String
  Dim dato As Variant
  Dim i As Long, j As Long, k As Long
  Dim n As Long, m As Long, uc As Long
  '
  FileNum = FreeFile()
  ruta = ThisWorkbook.Path & "\"
  arch = ActiveSheet.TextBox1.Value & ".txt"
  Open ruta & arch For Output As #FileNum
  For i = 2 To Range("A" & Rows.Count).End(3).Row
    If Range("A" & i).Value = "" Then Exit For
    n = WorksheetFunction.CountA(Range(Cells(i, "G"), Cells(i, "W")))
    Select Case True
      Case i = 2
        uc = 3
        m = 1
      Case n = 0
        uc = 6
        m = 1
      Case Else
        uc = 23
        If Range("W" & i).Value = "" Then
          m = 1
        Else
          m = Range("W" & i).Value
        End If
    End Select
    For k = 1 To m
      For j = 1 To uc
        dato = Trim(Cells(i, j).Text)
        If j = uc Then
          Print #FileNum, dato;       'poner campo
        Else
          Print #FileNum, dato; ",";  'poner campo
        End If
      Next
      Print #FileNum,                 'poner fila
    Next
  Next
  Close #FileNum
  '
  MsgBox "Txt generado"
End Sub

Lo he probado y va bien encaminado, pero falta algún retoque.

Te adjunto imagen con el nuevo código para que puedas comparar lo que falta para ser como la imagen de mi pregunta. 

  • La Cantidad no ha de aparecer. En la 3r línea del Bloc de notas tendría de acabar con “,t9” y obviar “,5” y así sucesivamente.
  • Línea 8, tendría que ser igual que la 2. Acabar con “,t5,” y que no aparezcan las demás comas y así sucesivamente.

De nuevo, gracias por tu ayuda Dante Amor 

  • La Cantidad no ha de aparecer. En la 3r línea del Bloc de notas tendría de acabar con “, t9” y obviar “, 5” y así sucesivamente.

Cambia esta línea

uc = 23

por  esta

uc = 22

  • Línea 8, tendría que ser igual que la 2. Acabar con “, t5,” y que no aparezcan las demás comas y así sucesivamente.

Cambia esta línea

n = WorksheetFunction.CountA(Range(Cells(i, "G"), Cells(i, "W")))

Por esta

n = WorksheetFunction.Count(Range(Cells(i, "G"), Cells(i, "W")))

¡Gracias! Ahora sí, todo perfecto.

Eres todo un Experto Dante Amor 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas