Macro que convierte archivos de excel a plano.

Tengo una macro la cual convierte un archivo de Excel a txt o texto. Esta genera varios archivos txt al ejecutarla de cuerdo al número de filas que se le inserte después de la fila (A4). Cada archivo se genera consecutivamente de acuerdo al año y mes con que se inicie en la celda (O2).

Ejemplo inserto la siguiente fecha en la celda O2 junio del 2016 e insertamos 12 filas después de la celda A4, entonces cuando ejecute la macro generara 12 archivo los cual iniciara con la fecha de junio del 2016 hasta junio del 2017.

Acá está el problema y necesito de su experticia, como vimos en el ejemplo anterior los archivos se generan y pasan de un año a otro y tengo una validación en el CAMPO58 la cual realiza un cruce con la información alojada en hoja2 y esta se realiza una comparación y cálculo de acuerdo valores de acuerdo a cada AÑO.

campo57 = String(9, "0")
nAño = Right(Range("O2").Value, 4) " Aca es donde tengo el interrogante "
Set f = Sheets("Hoja2").Range("A:A").Find(nAño, , xlValues, xlWhole)
If Not f Is Nothing Then
If Val(campo47) >= f.Offset(, 1).Value Then campo57 = Format(WorksheetFunction.RoundUp(Val((campo47) * 0.5) / 100, -2), "000000000") 'campo57 = Format(Val(campo47) * 0.5, "000000000")
End If

El grande problema lo tengo con la celda O2 ya que la validación la tengo amarrada a esta celda donde inicia el año y el mes, y como podemos ver desde enero del 2017 los valores cambian de acuerdo a la hoja2 y no tengo como identificar puntualmente cuando cambiar de año, ya que la celda O2 de inicio nunca cambia ya que esta fecha es fija la de inicio.

¿La pregunta final es donde podría realizar este amarre para que el programa de reconozca a que año pertenece cada archivo y realice su respectiva validación ¿?

En este link se encuentra la macro en el casa que se necesite.

https://drive.google.com/drive/folders/1gKBuCAQLMDtuyaJ_4kTOJOj_s040sadr?usp=sharing 

Respuesta
1

No puedo descargar el archivo. Te envié una solicitud.

Hola Dante Buenas tardes Muchas Gracias por responder,

Ya quedaste autorizado para la descarga, quedo atento a cualquier otra inquietud. Gracias

Agregué el año a la función de Poner_Registro.

Así quedaría el código actualizado.

[No olvides valorar la respuesta.

Sub EXPORTAR_TXT_ANCHOFIJO()
'Act Por Dante Amor
    '
    Dim i As Double
    ruta = ThisWorkbook.Path & "\"
    Set h1 = Sheets(1)
    añ1 = Year(CDate(Replace(h1. Cells(2, 15).Value, " de ", " ")))
    me1 = Month(CDate(Replace(h1. Cells(2, 15).Value, " de ", " ")))
    fe1 = DateSerial(añ1, me1, 1)
    '
    añ2 = Year(CDate(Replace(h1. Cells(2, 16).Value, " de ", " ")))
    me2 = Month(CDate(Replace(h1. Cells(2, 16).Value, " de ", " ")))
    fe2 = DateSerial(añ2, me2, 1)
    '
    fin = h1.Range("A" & Rows.Count).End(xlUp).Row
    For i = 4 To fin
        arch = ruta & Format(fe1, "yyyy-mm") & "-" & Format(fe2, "yyyy-mm") & ".txt"
        c15 = Year(fe1) & "-" & Format(Month(fe1), "00")
        c16 = Year(fe2) & "-" & Format(Month(fe2), "00")
        '
        Open arch For Output As #1
        titulos = Poner_Encabezado(h1, c15, c16)
        Print #1, titulos
        año1 = Format(fe1, "yyyy")
        registro = Poner_Registro(h1, i, año1)
        Print #1, registro
        Close
        me1 = me1 + 1
        me2 = me2 + 1
        fe1 = DateSerial(añ1, me1, 1)
        fe2 = DateSerial(añ2, me2, 1)
    Next i
    MsgBox "Fin"
End Sub
'
Function Poner_Registro(h1, i, año1)
    'Asignamos a cada Campo la función que necesitamos aplicar
Campo1 = C_Izq(h1.Cells(i, 1), 2)
Campo2 = C_Izq(h1.Cells(i, 2), 5)
Campo3 = B_Der(h1.Cells(i, 3), 2)
Campo4 = B_Der(h1.Cells(i, 4), 16)
campo5 = C_Izq(h1.Cells(i, 5), 2)
Campo6 = C_Izq(h1.Cells(i, 6), 2)
Campo7 = B_Der(h1.Cells(i, 7), 1)
Campo8 = B_Der(h1.Cells(i, 8), 1)
Campo9 = C_Izq(h1.Cells(i, 9), 2)
Campo10 = C_Izq(h1.Cells(i, 10), 3)
Campo11 = B_Der(h1.Cells(i, 11), 20)
Campo12 = B_Der(h1.Cells(i, 12), 30)
Campo13 = B_Der(h1.Cells(i, 13), 20)
Campo14 = B_Der(h1.Cells(i, 14), 30)
Campo15 = B_Der(h1.Cells(i, 15), 1)
Campo16 = B_Der(h1.Cells(i, 16), 1)
Campo17 = B_Der(h1.Cells(i, 17), 1)
Campo18 = B_Der(h1.Cells(i, 18), 1)
Campo19 = B_Der(h1.Cells(i, 19), 1)
Campo20 = B_Der(h1.Cells(i, 20), 1)
Campo21 = B_Der(h1.Cells(i, 21), 1)
campo22 = B_Der(h1.Cells(i, 22), 1)
Campo23 = B_Der(h1.Cells(i, 23), 1)
Campo24 = B_Der(h1.Cells(i, 24), 1)
Campo25 = B_Der(h1.Cells(i, 25), 1)
Campo26 = B_Der(h1.Cells(i, 26), 1)
Campo27 = B_Der(h1.Cells(i, 27), 1)
Campo28 = B_Der(h1.Cells(i, 28), 1)
Campo29 = B_Der(h1.Cells(i, 29), 1)
Campo30 = C_Izq(h1.Cells(i, 30), 2)
Campo31 = B_Der(h1.Cells(i, 31), 6) ' CODIGO AFP
Campo33 = B_Der(h1.Cells(i, 33), 6) ' CODIGO TRAS AFP
Campo35 = B_Der(h1.Cells(i, 35), 6) ' CODIGO EPS
Campo37 = B_Der(h1.Cells(i, 37), 6) ' CIDOGO TRAS EPS
Campo39 = B_Der(h1.Cells(i, 39), 6) ' CIDIGO CAJA
Campo41 = C_Izq(h1.Cells(i, 41), 2)
Campo42 = C_Izq(h1.Cells(i, 42), 2)
Campo43 = C_Izq(h1.Cells(i, 43), 2)
Campo44 = C_Izq(h1.Cells(i, 44), 2)
Campo45 = C_Izq(h1.Cells(i, 45), 9)
Campo46 = B_Der(h1.Cells(i, 46), 1)
campo47 = C_Izq(h1.Cells(i, 47), 9) 'IBC PENSION
Campo48 = C_Izq(h1.Cells(i, 48), 9) 'IBC SALUD
Campo49 = C_Izq(h1.Cells(i, 49), 9) 'IBC ARL
Campo50 = C_Izq(h1.Cells(i, 50), 9) 'IBC CAJA
Campo52 = CDec(Val(h1.Cells(i, 52))) 'Decimal
'Campo53 = C_Izq(h1.Cells(i, 53), 9) 'cotizacion AFP
temp = Application.WorksheetFunction.RoundUp(h1.Cells(i, 47) * Campo52, -2)
Campo52 = C_Der(h1.Cells(i, 52), 7) 'Tarifa AFP
Campo53 = C_Izq(temp, 9) 'cotizacion AFP
Campo54 = C_Izq(h1.Cells(i, 54), 9)
Campo55 = C_Izq(h1.Cells(i, 55), 9)
Campo56 = C_Izq(h1.Cells(i, 56), 9)
campo57 = String(9, "0")
  'nAño = Right(Range("O2").Value, 4)
  nAño = año1
  Set f = Sheets("Hoja2").Range("A:A").Find(nAño, , xlValues, xlWhole)
  If Not f Is Nothing Then
    If Val(campo47) >= f.Offset(, 1).Value Then
      campo57 = Format(WorksheetFunction.RoundUp(Val((campo47) * 0.5) / 100, -2), "000000000") 'campo57 = Format(Val(campo47) * 0.5, "000000000")
    End If
  End If
'campo57 = C_Izq(h1.Cells(i, 57), 9) 'FSP SOLIDARIDAD
campo58 = String(9, "0")
  'nAño = Right(Range("O2").Value, 4)
  Set f = Sheets("Hoja2").Range("A:A").Find(nAño, , xlValues, xlWhole)
  If Not f Is Nothing Then
    If Val(campo47) >= f.Offset(, 1).Value Then
      campo58 = Format(WorksheetFunction.RoundUp(Val((campo47) * 0.5) / 100, -2), "000000000") 'campo57 = Format(Val(campo47) * 0.5, "000000000")
    End If
  End If
'Campo58 = C_Izq(h1.Cells(i, 58), 9) ' FSP SUBSISTENCIA
Campo59 = C_Izq(h1.Cells(i, 59), 9)
Campo60 = CDec(Val(h1.Cells(i, 60))) 'Decimal
'Campo61 = C_Izq(h1.Cells(i, 61), 9) 'cotizacion EPS
temp = Application.WorksheetFunction.RoundUp(h1.Cells(i, 48) * Campo60, -2)
Campo60 = C_Der(h1.Cells(i, 60), 7) 'tarifa salud
Campo61 = C_Izq(temp, 9) 'cotizacion EPS
campo62 = C_Izq(h1.Cells(i, 62), 9) 'UPC
Campo63 = B_Der(h1.Cells(i, 63), 15)
Campo64 = C_Izq(h1.Cells(i, 64), 9)
Campo65 = B_Der(h1.Cells(i, 65), 15)
Campo66 = C_Izq(h1.Cells(i, 66), 9)
campo67 = C_Der(h1.Cells(i, 67), 9)
Campo68 = C_Der(h1.Cells(i, 68), 9)
Campo69 = C_Izq(h1.Cells(i, 69), 9)
campo70 = C_Der(h1.Cells(i, 70), 7)
Campo71 = C_Izq(h1.Cells(i, 71), 9)
campo72 = C_Der(h1.Cells(i, 72), 7)
Campo73 = C_Izq(h1.Cells(i, 73), 9)
campo74 = C_Der(h1.Cells(i, 74), 7)
Campo75 = C_Izq(h1.Cells(i, 75), 9)
campo76 = C_Der(h1.Cells(i, 76), 7)
Campo77 = C_Izq(h1.Cells(i, 77), 9)
campo78 = C_Der(h1.Cells(i, 78), 7)
Campo79 = C_Izq(h1.Cells(i, 79), 9)
Campo80 = B_Der(h1.Cells(i, 80), 2) 'TIPO UPC COTIZANTE
Campo81 = B_Der(h1.Cells(i, 81), 16) 'CED UPC COTIZANTE
campo82 = C_Izq(h1.Cells(i, 82), 1) 'EXONERACION
Campo83 = B_Der(h1.Cells(i, 83), 6) 'CODI AD ARL
Campo84 = B_Der(h1.Cells(i, 84), 1) 'NIVEL ARL
Campo85 = B_Der(h1.Cells(i, 85), 1) 'INDI TARI ES PEN
Campo86 = B_Der(h1.Cells(i, 86), 10) 'F INGRESO
Campo87 = B_Der(h1.Cells(i, 87), 10) 'F RETIRO
Campo88 = B_Der(h1.Cells(i, 88), 10) 'F VSP
Campo89 = B_Der(h1.Cells(i, 89), 10) 'F I SLN
Campo90 = B_Der(h1.Cells(i, 90), 10) 'F F SLN
Campo91 = B_Der(h1.Cells(i, 91), 10) 'F I IGE
Campo92 = B_Der(h1.Cells(i, 92), 10) 'F F IGE
Campo93 = B_Der(h1.Cells(i, 93), 10) 'F I LMA
Campo94 = B_Der(h1.Cells(i, 94), 10) 'F F LMA
Campo95 = B_Der(h1.Cells(i, 95), 10) 'F I VAC-LR
Campo96 = B_Der(h1.Cells(i, 96), 10) 'F F VAC-LR
Campo97 = B_Der(h1.Cells(i, 97), 10) 'F I VCT
Campo98 = B_Der(h1.Cells(i, 98), 10) 'F F VCT
Campo99 = B_Der(h1.Cells(i, 99), 10) 'F I IRL
Campo100 = B_Der(h1.Cells(i, 100), 10) 'F F IRL
Campo101 = C_Izq(h1.Cells(i, 51), 9) 'IBC PARAFISCALES
Campo102 = C_Izq(h1.Cells(i, 102), 3) 'N HORAS
Campo103 = B_Der(h1.Cells(i, 103), 10) 'F RADI EXTERIOR
If Campo31 = "NIN-AF" Then Campo31 = "      " 'CODIGO PENSION
If Campo35 = "NIN-EP" Then Campo35 = "      " 'CODIGO SALUD
If Campo39 = "NIN-CC" Then Campo39 = "      " 'CODIGO CAJA
If Campo52 = 0 Then Campo52 = "0.00000" 'PENSION
If Campo52 = ".160000" Then Campo52 = "0.16000"
If Campo52 = "0,16000" Then Campo52 = "0.16000"
If Campo52 = ".120000" Then Campo52 = "0.12000"
If Campo52 = ".260000" Then Campo52 = "0.26000"
If Campo52 = ".125000" Then Campo52 = "0.12500"
If Campo52 = ".135000" Then Campo52 = "0.13500"
If Campo52 = ".145000" Then Campo52 = "0.14500"
If Campo52 = ".150000" Then Campo52 = "0.15000"
If Campo52 = ".155000" Then Campo52 = "0.15500"
If Campo60 = 0 Then Campo60 = "0.00000" ' SALUD
If Campo60 = ".040000" Then Campo60 = "0.04000"
If Campo60 = ".125000" Then Campo60 = "0.12500"
If Campo60 = "0,12500" Then Campo60 = "0.12500"
If Campo60 = ".085000" Then Campo60 = "0.08500"
If Campo60 = ".015000" Then Campo60 = "0.01500"
If Campo60 = ".120000" Then Campo60 = "0.12000"
If campo67 = 0 Then campo67 = "0.0000000" 'RIESGOS
If campo67 = ".01044000" Then campo67 = "0.0104400"
If campo67 = ".02436000" Then campo67 = "0.0243600"
If campo67 = ".00522000" Then campo67 = "0.0052200"
If campo67 = ".04350000" Then campo67 = "0.0435000"
If campo67 = ".06960000" Then campo67 = "0.0696000"
If campo70 = 0 Then campo70 = "0.00000" 'CAJA
If campo70 = ".040000" Then campo70 = "0.04000"
If campo72 = 0 Then campo72 = "0.00000" 'SENA
If campo72 = ".020000" Then campo72 = "0.02000"
If campo72 = ".005000" Then campo72 = "0.00500"
If campo74 = 0 Then campo74 = "0.00000" 'ICBF
If campo74 = ".030000" Then campo74 = "0.03000"
If campo76 = 0 Then campo76 = "0.00000" 'ESAP
If campo76 = ".005000" Then campo76 = "0.00500"
If campo78 = 0 Then campo78 = "0.00000" 'MINISTERIO
If campo78 = ".010000" Then campo78 = "0.01000"
If Campo60 = "0.04000" Then campo82 = "S"  'EXONE
If Campo60 = "0.12500" Then campo82 = "N" 'EXONE
If Campo60 = "0.00000" Then campo82 = "N"  'EXONE
If Campo60 = "0.08500" Then campo82 = "N" 'EXONE
If Campo60 = "0.01500" Then campo82 = "N" 'EXONE
If campo5 = "40" Then campo82 = "N" 'EXONE
Poner_Registro = Campo1 & Campo2 & Campo3 & Campo4 & campo5 & Campo6 & Campo7 & Campo8 & Campo9 & Campo10 & Campo11 & Campo12 & Campo13 & Campo14 & Campo15 & Campo16 & Campo17 & Campo18 & Campo19 & Campo20 & Campo21 & campo22 & Campo23 & Campo24 & Campo25 & Campo26 & Campo27 & Campo28 & Campo29 & Campo30 & Campo31 & Campo33 & Campo35 & Campo37 & Campo39 & Campo41 & Campo42 & Campo43 & Campo44 & Campo45 & Campo46 & campo47 & Campo48 & Campo49 & Campo50 & campo51 & Campo52 & Campo53 & Campo54 & Campo55 & Campo56 & campo57 & campo58 & Campo59 & Campo60 & Campo61 & campo62 & Campo63 & Campo64 & Campo65 & Campo66 & campo67 & Campo68 & Campo69 & campo70 & Campo71 & campo72 & Campo73 & campo74 & Campo75 & campo76 & Campo77 & campo78 & Campo79 & Campo80 & Campo81 & campo82 & Campo83 & Campo84 & Campo85 & Campo86 & Campo87 & Campo88 & Campo89 & Campo90 & Campo91 & Campo92 & Campo93 & Campo94 & Campo95 & Campo96 & Campo97 & Campo98 & Campo99 & Campo100 & Campo101 & Campo102 & Campo103
End Function
'
Function Poner_Encabezado(h1, c15, c16)
    j = 2
Campo1 = C_Izq(h1.Cells(j, 1), 2)
Campo2 = C_Izq(h1.Cells(j, 2), 5)
Campo3 = B_Der(h1.Cells(j, 3), 200)
Campo4 = B_Der(h1.Cells(j, 4), 2)
campo5 = B_Der(h1.Cells(j, 5), 16)
Campo6 = C_Izq(h1.Cells(j, 6), 1)
Campo7 = C_Izq(h1.Cells(j, 7), 1)
Campo8 = B_Der(h1.Cells(j, 8), 10)
Campo9 = B_Der(h1.Cells(j, 9), 10)
Campo10 = C_Izq(h1.Cells(j, 10), 1)
Campo11 = B_Der(h1.Cells(j, 11), 10)
Campo12 = B_Der(h1.Cells(j, 12), 40)
Campo13 = B_Der(h1.Cells(j, 13), 6)
Campo15 = B_Der(h1.Cells(j, 15), 18) 'Period coti
Campo16 = B_Der(h1.Cells(j, 16), 18) 'Periodo ser
Campo17 = B_Der(h1.Cells(j, 17), 10) & "          "
Campo18 = C_Izq(h1.Cells(j, 18), 5)
Campo19 = C_Izq(h1.Cells(j, 19), 12)
Campo20 = C_Izq(h1.Cells(j, 20), 2)
Campo21 = C_Izq(h1.Cells(j, 21), 2)
If Campo8 = 0 Then Campo8 = "          "
If Campo9 >= 0 Then Campo9 = "          "
If Campo15 <> "" Then Campo15 = Format(CDate(Replace(Campo15, " de ", " ")), "yyyy-mm")
If Campo16 <> "" Then Campo16 = Format(CDate(Replace(Campo16, " de ", " ")), "yyyy-mm")
Campo15 = c15
Campo16 = c16
'If Campo15 <> "" Then Campo15 = Format(CDate(Replace(Campo15, " de ", " ")), "yyyy-mm")
'If Campo16 <> "" Then Campo16 = Format(CDate(Replace(Campo16, " de ", " ")), "yyyy-mm")
Poner_Encabezado = Campo1 & Campo2 & Campo3 & Campo4 & campo5 & Campo6 & Campo7 & Campo8 & Campo9 & Campo10 & Campo11 & Campo12 & Campo13 & Campo14 & Campo15 & Campo16 & Campo17 & Campo18 & Campo19 & Campo20 & Campo21
End Function

Hola Dante buenos días. como siempre sus respuestas son muy acertadas, Quedo en el punto exacto la validación solicitada. Muchas ¡Gracias! de nuevo. Saludos. 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas